From 90343c58423d04f642d9bc7c6e2957d0276942cd Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Tue, 22 Oct 2024 22:35:59 +0200 Subject: [PATCH 001/109] add optional alignment arg to draw_text closes #64 --- pd.lua | 11 +++++++++++ pdlua_gfx.h | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pd.lua b/pd.lua index 28b5dd1..2c72762 100644 --- a/pd.lua +++ b/pd.lua @@ -628,6 +628,17 @@ DATA = 0 SIGNAL = 1 Colors = {background = 0, foreground = 1, outline = 2} +-- Text alignment constants +TOP_LEFT = 0 +TOP_CENTER = 1 +TOP_RIGHT = 2 +CENTER_LEFT = 3 +CENTER = 4 +CENTER_RIGHT = 5 +BOTTOM_LEFT = 6 +BOTTOM_CENTER = 7 +BOTTOM_RIGHT = 8 + -- pre-load pdx.lua (advanced live coding support); if you don't want this, -- just comment out the line below pdx = require 'pdx' diff --git a/pdlua_gfx.h b/pdlua_gfx.h index a3f32ab..282c905 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -441,6 +441,7 @@ static int draw_text(lua_State* L) { SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y SETFLOAT(args + 3, luaL_checknumber(L, 4)); // w SETFLOAT(args + 4, luaL_checknumber(L, 5)); // h + // FIXME: ignoring the optional alignment parameter for plugdata for now plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_text"), 5, args); return 0; } @@ -1291,6 +1292,7 @@ static int draw_text(lua_State* L) { int font_height = luaL_checknumber(L, 5); font_height = sys_hostfontsize(font_height, glist_getzoom(cnv)); + int alignment = lua_gettop(L) >= 6 ? luaL_checkinteger(L, 6) : 0; // Default to TOP_LEFT transform_point(gfx, &x, &y); transform_size(gfx, &w, &font_height); @@ -1305,8 +1307,22 @@ static int draw_text(lua_State* L) { const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA + // Convert alignment value to tcl/tk anchor point + const char* anchor; + switch (alignment) { + case 1: anchor = "n"; break; // TOP_CENTER + case 2: anchor = "ne"; break; // TOP_RIGHT + case 3: anchor = "w"; break; // CENTER_LEFT + case 4: anchor = "center"; break; // CENTER + case 5: anchor = "e"; break; // CENTER_RIGHT + case 6: anchor = "sw"; break; // BOTTOM_LEFT + case 7: anchor = "s"; break; // BOTTOM_CENTER + case 8: anchor = "se"; break; // BOTTOM_RIGHT + default: anchor = "nw"; break; // TOP_LEFT + } + pdgui_vmess(0, "crr ii rs ri rs rS", cnv, "create", "text", - 0, 0, "-anchor", "nw", "-width", w, "-text", text, "-tags", 3, tags); + 0, 0, "-anchor", anchor, "-width", w, "-text", text, "-tags", 3, tags); t_atom fontatoms[3]; SETSYMBOL(fontatoms+0, gensym(sys_font)); From ce1e5dc76042b28fa6e67669cf502dabafabd8ba Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Wed, 23 Oct 2024 00:11:35 +0200 Subject: [PATCH 002/109] simplified arg check with luaL_optinteger --- pdlua_gfx.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 282c905..85f0c3a 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -1289,10 +1289,9 @@ static int draw_text(lua_State* L) { int x = luaL_checknumber(L, 2); int y = luaL_checknumber(L, 3); int w = luaL_checknumber(L, 4); - int font_height = luaL_checknumber(L, 5); - font_height = sys_hostfontsize(font_height, glist_getzoom(cnv)); + int font_height = sys_hostfontsize(luaL_checknumber(L, 5), glist_getzoom(cnv)); + int alignment = luaL_optinteger(L, 6, 0); // Defaults to TOP_LEFT - int alignment = lua_gettop(L) >= 6 ? luaL_checkinteger(L, 6) : 0; // Default to TOP_LEFT transform_point(gfx, &x, &y); transform_size(gfx, &w, &font_height); From e434b682ca362115911e0ea74d0b5760ab3e876b Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Fri, 25 Oct 2024 18:34:02 +0200 Subject: [PATCH 003/109] make some more args optional --- pdlua_gfx.h | 66 ++++++++++++++++++----------------------------------- 1 file changed, 22 insertions(+), 44 deletions(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 85f0c3a..9d8169c 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -275,9 +275,8 @@ static int gfx_initialize(t_pdlua *obj) static int set_size(lua_State* L) { - if (!lua_islightuserdata(L, 1)) { + if (!lua_islightuserdata(L, 1)) return 0; - } t_pdlua *obj = (t_pdlua*)lua_touserdata(L, 1); obj->gfx.width = luaL_checknumber(L, 2); @@ -329,14 +328,7 @@ static int set_color(lua_State* L) { SETFLOAT(args, luaL_checknumber(L, 1)); // r SETFLOAT(args + 1, luaL_checknumber(L, 2)); // g SETFLOAT(args + 2, luaL_checknumber(L, 3)); // b - - if (lua_gettop(L) >= 4) { // object and table are already on stack, hence 5 - // alpha (optional, default to 1.0) - SETFLOAT(args + 3, luaL_checknumber(L, 4)); - } - else { - SETFLOAT(args + 3, 1.0f); - } + SETFLOAT(args + 3, luaL_optnumber(L, 4, 1.0f)); // alpha (optional, default to 1.0) plugdata_draw(obj, gfx->current_layer, gensym("lua_set_color"), 4, args); return 0; } @@ -359,7 +351,7 @@ static int stroke_ellipse(lua_State* L) { SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_checknumber(L, 5)); // width + SETFLOAT(args + 4, luaL_optnumber(L, 5, 1.0f)); // stroke width (optional, default to 1.0) plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_stroke_ellipse"), 5, args); return 0; } @@ -389,7 +381,7 @@ static int stroke_rect(lua_State* L) { SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_checknumber(L, 5)); // corner_radius + SETFLOAT(args + 4, luaL_optnumber(L, 5, 1.0f)); // stroke width (optional, default to 1.0) plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_stroke_rect"), 5, args); return 0; } @@ -414,7 +406,7 @@ static int stroke_rounded_rect(lua_State* L) { SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h SETFLOAT(args + 4, luaL_checknumber(L, 5)); // corner_radius - SETFLOAT(args + 5, luaL_checknumber(L, 6)); // width + SETFLOAT(args + 5, luaL_optnumber(L, 6, 1.0f)); // stroke width (optional, default to 1.0) plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_stroke_rounded_rect"), 6, args); return 0; } @@ -426,9 +418,8 @@ static int draw_line(lua_State* L) { SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_checknumber(L, 5)); // line width + SETFLOAT(args + 4, luaL_optnumber(L, 5, 1.0f)); // line width (optional, default to 1.0) plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_line"), 5, args); - return 0; } @@ -440,7 +431,8 @@ static int draw_text(lua_State* L) { SETFLOAT(args + 1, luaL_checknumber(L, 2)); // x SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y SETFLOAT(args + 3, luaL_checknumber(L, 4)); // w - SETFLOAT(args + 4, luaL_checknumber(L, 5)); // h + SETFLOAT(args + 4, luaL_optnumber(L, 5, 12.0f)); // font size + // FIXME: default font size of 12 seems arbitrary here. how can we get plugdata's fontsize? // FIXME: ignoring the optional alignment parameter for plugdata for now plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_text"), 5, args); return 0; @@ -453,7 +445,7 @@ static int stroke_path(lua_State* L) { t_canvas *cnv = glist_getcanvas(obj->canvas); t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); - int stroke_width = luaL_checknumber(L, 2) * glist_getzoom(cnv); + int stroke_width = luaL_optnumber(L, 2, 1.0f) * glist_getzoom(cnv); // optional, default to 1.0 int coordinates_size = (2 * path->num_path_segments + 2) * sizeof(t_atom); t_atom* coordinates = getbytes(coordinates_size); @@ -801,9 +793,8 @@ static int gfx_initialize(t_pdlua *obj) static int set_size(lua_State* L) { - if (!lua_islightuserdata(L, 1)) { + if (!lua_islightuserdata(L, 1)) return 0; - } t_pdlua *obj = (t_pdlua*)lua_touserdata(L, 1); obj->gfx.width = luaL_checknumber(L, 2); @@ -1012,10 +1003,7 @@ static int set_color(lua_State* L) { gfx->current_color[7] = '\0'; #else // ... but it is in Purr Data (nw.js gui) - a = 255; - if (lua_gettop(L) >= 4) { - a = luaL_checknumber(L, 4)*255; - } + a = luaL_optnumber(L, 4, 1.0f) * 255; snprintf(gfx->current_color, 10, "#%02X%02X%02X%02X", r, g, b, a); gfx->current_color[9] = '\0'; #endif @@ -1058,7 +1046,7 @@ static int stroke_ellipse(lua_State* L) { int x1, y1, x2, y2; get_bounds_args(L, obj, &x1, &y1, &x2, &y2); - int line_width = luaL_checknumber(L, 5) * glist_getzoom(cnv); + int line_width = luaL_optnumber(L, 5, 1.0f) * glist_getzoom(cnv); // stroke width (optional, default to 1.0) const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; @@ -1132,7 +1120,7 @@ static int stroke_rect(lua_State* L) { int x1, y1, x2, y2; get_bounds_args(L, obj, &x1, &y1, &x2, &y2); - int line_width = luaL_checknumber(L, 5) * glist_getzoom(cnv); + int line_width = luaL_optnumber(L, 5, 1.0f) * glist_getzoom(cnv); // stroke width (optional, default to 1.0) const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; @@ -1199,7 +1187,7 @@ static int stroke_rounded_rect(lua_State* L) { int radius_x = radius * glist_getzoom(cnv); int radius_y = radius * glist_getzoom(cnv); transform_size(gfx, &radius_x, &radius_y); - int line_width = luaL_checknumber(L, 6) * glist_getzoom(cnv); + int line_width = luaL_optnumber(L, 6, 1.0f) * glist_getzoom(cnv); // stroke width (optional, default to 1.0) const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; @@ -1245,7 +1233,7 @@ static int draw_line(lua_State* L) { int y1 = luaL_checknumber(L, 2); int x2 = luaL_checknumber(L, 3); int y2 = luaL_checknumber(L, 4); - int line_width = luaL_checknumber(L, 5); + int line_width = luaL_optnumber(L, 5, 1.0f); // line width (optional, default to 1.0) transform_point(gfx, &x1, &y1); transform_point(gfx, &x2, &y2); @@ -1289,7 +1277,8 @@ static int draw_text(lua_State* L) { int x = luaL_checknumber(L, 2); int y = luaL_checknumber(L, 3); int w = luaL_checknumber(L, 4); - int font_height = sys_hostfontsize(luaL_checknumber(L, 5), glist_getzoom(cnv)); + // default to standard font size + int font_height = sys_hostfontsize(luaL_optnumber(L, 5, glist_getfont(cnv)), glist_getzoom(cnv)); int alignment = luaL_optinteger(L, 6, 0); // Defaults to TOP_LEFT transform_point(gfx, &x, &y); @@ -1325,7 +1314,7 @@ static int draw_text(lua_State* L) { t_atom fontatoms[3]; SETSYMBOL(fontatoms+0, gensym(sys_font)); - SETFLOAT (fontatoms+1, -font_height); // Size is wrong on hi-dpi Windows is this is not negative + SETFLOAT (fontatoms+1, -font_height); // Size is wrong on hi-dpi Windows if this is not negative SETSYMBOL(fontatoms+2, gensym(sys_fontweight)); pdgui_vmess(0, "crs rA rs rs", cnv, "itemconfigure", tags[1], @@ -1352,11 +1341,9 @@ static int stroke_path(lua_State* L) { t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); if(path->num_path_segments < 3) - { return 0; - } - int stroke_width = luaL_checknumber(L, 2) * glist_getzoom(cnv); + int stroke_width = luaL_optnumber(L, 2, 1.0f) * glist_getzoom(cnv); // stroke width (optional, default to 1.0) int obj_x = text_xpix((t_object*)obj, obj->canvas); int obj_y = text_ypix((t_object*)obj, obj->canvas); int canvas_zoom = glist_getzoom(cnv); @@ -1398,9 +1385,7 @@ static int fill_path(lua_State* L) { t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); if(path->num_path_segments < 3) - { return 0; - } // Apply transformations to all coordinates int obj_x = text_xpix((t_object*)obj, obj->canvas); @@ -1441,16 +1426,10 @@ static int translate(lua_State* L) { t_pdlua_gfx *gfx = pop_graphics_context(L); if(gfx->num_transforms == 0) - { gfx->transforms = getbytes(sizeof(gfx_transform)); - - } else - { gfx->transforms = resizebytes(gfx->transforms, gfx->num_transforms * sizeof(gfx_transform), (gfx->num_transforms + 1) * sizeof(gfx_transform)); - } - gfx->transforms[gfx->num_transforms].type = TRANSLATE; gfx->transforms[gfx->num_transforms].x = luaL_checknumber(L, 1); gfx->transforms[gfx->num_transforms].y = luaL_checknumber(L, 2); @@ -1485,12 +1464,11 @@ static void add_path_segment(t_path_state* path, float x, float y) int path_segment_space = (path->num_path_segments + 1) * 2; int old_size = path->num_path_segments_allocated; int new_size = MAX(path_segment_space, path->num_path_segments_allocated); - if(!path->num_path_segments_allocated) { + + if(!path->num_path_segments_allocated) path->path_segments = (float*)getbytes(new_size * sizeof(float)); - } - else { + else path->path_segments = (float*)resizebytes(path->path_segments, old_size * sizeof(float), new_size * sizeof(float)); - } path->num_path_segments_allocated = new_size; From 84e2362557a3669d4f09c091f883ff50c42b4c05 Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Thu, 16 Jan 2025 14:04:06 +0100 Subject: [PATCH 004/109] immediate mouse_up() call for Pd vanilla --- pdlua.c | 63 ++++++++++++++++++++++++++++++++------------------------- pdlua.h | 3 +-- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/pdlua.c b/pdlua.c index 562340d..649ec2f 100644 --- a/pdlua.c +++ b/pdlua.c @@ -789,19 +789,28 @@ static void pdlua_motion(t_gobj *z, t_floatarg dx, t_floatarg dy, #endif { #if !PLUGDATA + t_pdlua *x = (t_pdlua *)z; + if (!x->has_gui) return; + #ifndef PURR_DATA - if (!up) -#endif - { - t_pdlua *x = (t_pdlua *)z; - x->gfx.mouse_drag_x = x->gfx.mouse_drag_x + dx; - x->gfx.mouse_drag_y = x->gfx.mouse_drag_y + dy; + // Handle mouse up immediately + if (up && x->gfx.mouse_down) { int zoom = glist_getzoom(glist_getcanvas(x->canvas)); - int xpos = (x->gfx.mouse_drag_x - text_xpix(&x->pd, x->canvas)) / zoom; - int ypos = (x->gfx.mouse_drag_y - text_ypix(&x->pd, x->canvas)) / zoom; - pdlua_gfx_mouse_drag(x, xpos, ypos); + int xpos = (x->gfx.mouse_x - text_xpix(&x->pd, x->canvas)) / zoom; + int ypos = (x->gfx.mouse_y - text_ypix(&x->pd, x->canvas)) / zoom; + pdlua_gfx_mouse_up(x, xpos, ypos); + x->gfx.mouse_down = 0; + return; } #endif + + x->gfx.mouse_x += dx; + x->gfx.mouse_y += dy; + int zoom = glist_getzoom(glist_getcanvas(x->canvas)); + int xpos = (x->gfx.mouse_x - text_xpix(&x->pd, x->canvas)) / zoom; + int ypos = (x->gfx.mouse_y - text_ypix(&x->pd, x->canvas)) / zoom; + pdlua_gfx_mouse_drag(x, xpos, ypos); +#endif } static int pdlua_click(t_gobj *z, t_glist *gl, int xpos, int ypos, int shift, int alt, int dbl, int doit){ @@ -812,34 +821,32 @@ static int pdlua_click(t_gobj *z, t_glist *gl, int xpos, int ypos, int shift, in int zoom = glist_getzoom(gl); int xpix = (xpos - text_xpix(&x->pd, gl)) / zoom; int ypix = (ypos - text_ypix(&x->pd, gl)) / zoom; - - if(doit){ - if(!x->gfx.mouse_down) - { - pdlua_gfx_mouse_down(x, xpix, ypix); - x->gfx.mouse_drag_x = xpos; - x->gfx.mouse_drag_y = ypos; - } - - glist_grab(x->canvas, &x->pd.te_g, (t_glistmotionfn)pdlua_motion, NULL, xpos, ypos); - } - else { - pdlua_gfx_mouse_move(x, xpix, ypix); - + + if (doit) { + x->gfx.mouse_down = 1; + x->gfx.mouse_x = xpos; + x->gfx.mouse_y = ypos; + pdlua_gfx_mouse_down(x, xpix, ypix); + glist_grab(gl, &x->pd.te_g, (t_glistmotionfn)pdlua_motion, NULL, xpos, ypos); + } else { + // Handle mouse up here for Purr Data + // (Vanilla PD handles it in pdlua_motion with the 'up' flag) if(x->gfx.mouse_down) { pdlua_gfx_mouse_up(x, xpix, ypix); + x->gfx.mouse_down = 0; + } else { + x->gfx.mouse_x = xpos; + x->gfx.mouse_y = ypos; + pdlua_gfx_mouse_move(x, xpix, ypix); } } - - x->gfx.mouse_down = doit; return 1; } else #endif return text_widgetbehavior.w_clickfn(z, gl, xpos, ypos, shift, alt, dbl, doit); } - static void pdlua_displace(t_gobj *z, t_glist *glist, int dx, int dy){ t_pdlua *x = (t_pdlua *)z; @@ -1451,8 +1458,8 @@ static int pdlua_object_new(lua_State *L) #if !PLUGDATA // Init graphics state for pd - o->gfx.mouse_drag_x = 0; - o->gfx.mouse_drag_y = 0; + o->gfx.mouse_x = 0; + o->gfx.mouse_y = 0; o->gfx.mouse_down = 0; #else // NULL until plugdata overrides them with something useful diff --git a/pdlua.h b/pdlua.h index 0b2f24a..fa4a9a0 100644 --- a/pdlua.h +++ b/pdlua.h @@ -43,9 +43,8 @@ typedef struct _pdlua_gfx char current_color[10]; // Keep track of current color // Variables to keep track of mouse button state and drag position - int mouse_drag_x, mouse_drag_y, mouse_down; + int mouse_x, mouse_y, mouse_down; int first_draw; - #else int current_layer; void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*); // Callback to perform drawing in plugdata From f2210893bf919520b242338e817b627d6adc2151 Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Thu, 16 Jan 2025 22:13:30 +0100 Subject: [PATCH 005/109] add mouse_enter() and mouse_exit() for Pd vanilla with proxy function for canvas messages and clock for cleanup --- pd.lua | 6 +++ pdlua.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++---- pdlua.h | 5 +- pdlua_gfx.h | 9 ++++ 4 files changed, 155 insertions(+), 12 deletions(-) diff --git a/pd.lua b/pd.lua index 28b5dd1..e9665da 100644 --- a/pd.lua +++ b/pd.lua @@ -115,6 +115,12 @@ pd._mouseevent = function (object, x, y, event_type) if event_type == 3 and type(obj.mouse_drag) == "function" then obj:mouse_drag(x, y) end + if event_type == 4 and type(obj.mouse_enter) == "function" then + obj:mouse_enter(x, y) + end + if event_type == 5 and type(obj.mouse_exit) == "function" then + obj:mouse_exit(x, y) + end end end diff --git a/pdlua.c b/pdlua.c index 649ec2f..4b3ca30 100644 --- a/pdlua.c +++ b/pdlua.c @@ -238,6 +238,15 @@ typedef struct pdlua_proxyclock struct pdlua *owner; /**< Object to forward messages to. */ t_clock *clock; /** Pd clock to use. */ } t_pdlua_proxyclock; + +/** Proxy canvas object data. */ +typedef struct pdlua_proxycanvas +{ + t_pd pd; /**< Minimal Pd object. */ + t_symbol *p_sym; /**< The name of the canvas. */ + struct pdlua *p_parent; /**< The parent object. */ + t_clock *p_clock; /**< clock for deferred cleanup */ +} t_pdlua_proxycanvas; /* prototypes*/ static const char *pdlua_reader (lua_State *L, void *rr, size_t *size); @@ -263,6 +272,14 @@ static t_pdlua_proxyclock *pdlua_proxyclock_new (struct pdlua *owner); static void pdlua_proxyclock_setup (void); /** Dump an array of atoms into a Lua table. */ static void pdlua_pushatomtable (int argc, t_atom *argv); +/** Proxy canvas 'anything' method. */ +static void pdlua_proxycanvas_anything(t_pdlua_proxycanvas *p, t_symbol *s, int argc, t_atom *argv); +/** Proxy canvas cleanup and deallocation. */ +static void pdlua_proxycanvas_free(t_pdlua_proxycanvas *p); +/** Proxy canvas allocation and initialization. */ +static t_pdlua_proxycanvas *pdlua_proxycanvas_new(struct pdlua *owner, t_symbol *name); +/** Register the proxy canvas class with Pd. */ +static void pdlua_proxycanvas_setup(void); /** Pd object constructor. */ static t_pdlua *pdlua_new (t_symbol *s, int argc, t_atom *argv); /** Pd object destructor. */ @@ -346,12 +363,15 @@ void pdlua_setup (void); struct pdlua_proxyinlet; struct pdlua_proxyreceive; struct pdlua_proxyclock; +struct pdlua_proxycanvas; /** Proxy inlet class pointer. */ static t_class *pdlua_proxyinlet_class; /** Proxy receive class pointer. */ static t_class *pdlua_proxyreceive_class; /** Proxy clock class pointer. */ static t_class *pdlua_proxyclock_class; +/** Proxy canvas class pointer. */ +static t_class *pdlua_proxycanvas_class; /** Lua file reader callback. */ static const char *pdlua_reader @@ -378,6 +398,70 @@ static const char *pdlua_reader } } +static void pdlua_proxycanvas_anything(t_pdlua_proxycanvas *p, t_symbol *s, int argc, t_atom *argv) { +#if !PLUGDATA + // Early returns for invalid conditions + if (!p->p_parent) return; + if (s != gensym("motion")) return; + if (argc != 3) return; + + t_pdlua *x = p->p_parent; + if (!x->has_gui || x->gfx.mouse_down) return; + + float new_x = atom_getfloat(argv); + float new_y = atom_getfloat(argv + 1); + + int zoom = glist_getzoom(x->canvas); + int obj_x = text_xpix(&x->pd, x->canvas); + int obj_y = text_ypix(&x->pd, x->canvas); + + int xpos = (new_x - obj_x) / zoom; + int ypos = (new_y - obj_y) / zoom; + + int inside = (xpos >= 0 && xpos < x->gfx.width && + ypos >= 0 && ypos < x->gfx.height); + + // Handle state changes first + if (!inside && x->gfx.mouse_inside) { + pdlua_gfx_mouse_exit(x, xpos, ypos); + x->gfx.mouse_inside = 0; + } else if (inside && !x->gfx.mouse_inside) { + pdlua_gfx_mouse_enter(x, xpos, ypos); + x->gfx.mouse_inside = 1; + } + + // Only then send move event if we're inside + if (inside) { + pdlua_gfx_mouse_move(x, xpos, ypos); + } + + x->gfx.mouse_x = new_x; + x->gfx.mouse_y = new_y; +#endif +} + +static t_pdlua_proxycanvas *pdlua_proxycanvas_new(struct pdlua *owner, t_symbol *s) { + if (!owner || !s || s == &s_) return NULL; + + t_pdlua_proxycanvas *p = (t_pdlua_proxycanvas *)pd_new(pdlua_proxycanvas_class); + if (!p) return NULL; + + memset(p, 0, sizeof(t_pdlua_proxycanvas)); + p->pd = pdlua_proxycanvas_class; + p->p_sym = s; + p->p_parent = owner; + p->p_clock = clock_new(p, (t_method)pdlua_proxycanvas_free); + pd_bind(&p->pd, p->p_sym); + + return p; +} + +static void pdlua_proxycanvas_free(t_pdlua_proxycanvas *p) { + if (!p) return; + if (p->p_sym) pd_unbind(&p->pd, p->p_sym); + if (p->p_clock) clock_free(p->p_clock); +} + /** Proxy inlet 'anything' method. */ static void pdlua_proxyinlet_anything ( @@ -494,6 +578,19 @@ static void pdlua_proxyclock_setup(void) pdlua_proxyclock_class = class_new(gensym("pdlua proxy clock"), 0, 0, sizeof(t_pdlua_proxyclock), 0, 0); } +/** Setup the proxy class for canvas events. */ +static void pdlua_proxycanvas_setup(void) +{ + pdlua_proxycanvas_class = class_new( + gensym("pdlua proxy canvas"), 0, + (t_method)pdlua_proxycanvas_free, + sizeof(t_pdlua_proxycanvas), + CLASS_NOINLET | CLASS_PD, + 0); + if (pdlua_proxycanvas_class) + class_addanything(pdlua_proxycanvas_class, (t_method)pdlua_proxycanvas_anything); +} + /** Dump an array of atoms into a Lua table. */ static void pdlua_pushatomtable ( @@ -714,9 +811,24 @@ static t_pdlua *pdlua_new if (lua_islightuserdata(__L(), -1)) { object = lua_touserdata(__L(), -1); + + // Create canvas proxy if we have GUI + if (object->has_gui) { + t_canvas *parent_canvas = glist_getcanvas(object->canvas); + char buf[MAXPDSTRING]; + snprintf(buf, MAXPDSTRING-1, ".x%lx", (unsigned long)parent_canvas); + object->gfx.proxycanvas = pdlua_proxycanvas_new(object, gensym(buf)); + if (!object->gfx.proxycanvas) { + pd_error(NULL, "pdlua: failed to create canvas proxy"); + pd_free((t_pd *)object); + lua_pop(__L(), 2); + return NULL; + } + } + lua_pop(__L(), 2);/* pop the userdata and the global "pd" */ PDLUA_DEBUG2("pdlua_new: before returning object %p stack top %d", object, lua_gettop(__L())); - return object; + return object; } else { @@ -749,7 +861,6 @@ static void pdlua_free( t_pdlua *o /**< The object to destruct. */) } void pdlua_vis(t_gobj *z, t_glist *glist, int vis){ - t_pdlua* x = (t_pdlua *)z; // If there's no gui, use default text vis behavior if(!x->has_gui) @@ -768,8 +879,9 @@ void pdlua_vis(t_gobj *z, t_glist *glist, int vis){ } } -static void pdlua_delete(t_gobj *z, t_glist *glist){ - if(!((t_pdlua *)z)->has_gui) +static void pdlua_delete(t_gobj *z, t_glist *glist) { + t_pdlua *x = (t_pdlua *)z; + if(!x->has_gui) { text_widgetbehavior.w_deletefn(z, glist); return; @@ -779,6 +891,12 @@ static void pdlua_delete(t_gobj *z, t_glist *glist){ } canvas_deletelinesfor(glist, (t_text *)z); + + if (x->gfx.proxycanvas) { + // Schedule deferred cleanup (similar to receivecanvas external code) + clock_delay(x->gfx.proxycanvas->p_clock, 0); + x->gfx.proxycanvas = NULL; + } } #ifdef PURR_DATA // Purr Data uses an older version of this API @@ -791,7 +909,6 @@ static void pdlua_motion(t_gobj *z, t_floatarg dx, t_floatarg dy, #if !PLUGDATA t_pdlua *x = (t_pdlua *)z; if (!x->has_gui) return; - #ifndef PURR_DATA // Handle mouse up immediately if (up && x->gfx.mouse_down) { @@ -800,6 +917,14 @@ static void pdlua_motion(t_gobj *z, t_floatarg dx, t_floatarg dy, int ypos = (x->gfx.mouse_y - text_ypix(&x->pd, x->canvas)) / zoom; pdlua_gfx_mouse_up(x, xpos, ypos); x->gfx.mouse_down = 0; + + // After mouse up, check if we need to send exit + int inside = (xpos >= 0 && xpos < x->gfx.width && + ypos >= 0 && ypos < x->gfx.height); + if (!inside && x->gfx.mouse_inside) { + pdlua_gfx_mouse_exit(x, xpos, ypos); + x->gfx.mouse_inside = 0; + } return; } #endif @@ -835,11 +960,11 @@ static int pdlua_click(t_gobj *z, t_glist *gl, int xpos, int ypos, int shift, in { pdlua_gfx_mouse_up(x, xpix, ypix); x->gfx.mouse_down = 0; - } else { - x->gfx.mouse_x = xpos; - x->gfx.mouse_y = ypos; - pdlua_gfx_mouse_move(x, xpix, ypix); } + // no move events generated here + // Let the proxy handle all move events + x->gfx.mouse_x = xpos; + x->gfx.mouse_y = ypos; } return 1; } else @@ -3072,7 +3197,9 @@ void pdlua_setup(void) PDLUA_DEBUG("pdlua pdlua_proxyreceive_setup done", 0); pdlua_proxyclock_setup(); PDLUA_DEBUG("pdlua pdlua_proxyclock_setup done", 0); - if (! pdlua_proxyinlet_class || ! pdlua_proxyreceive_class || ! pdlua_proxyclock_class) + pdlua_proxycanvas_setup(); + PDLUA_DEBUG("pdlua pdlua_proxycanvas_setup done", 0); + if (! pdlua_proxyinlet_class || ! pdlua_proxyreceive_class || ! pdlua_proxyclock_class || ! pdlua_proxycanvas_class) { pd_error(NULL, "lua: error creating proxy classes"); pd_error(NULL, "lua: loader will not be registered!"); diff --git a/pdlua.h b/pdlua.h index fa4a9a0..f688b89 100644 --- a/pdlua.h +++ b/pdlua.h @@ -42,9 +42,10 @@ typedef struct _pdlua_gfx int num_transforms; char current_color[10]; // Keep track of current color - // Variables to keep track of mouse button state and drag position - int mouse_x, mouse_y, mouse_down; + // Variables to keep track of mouse position, button state and whether the mouse is inside the object + int mouse_x, mouse_y, mouse_down, mouse_inside; int first_draw; + struct pdlua_proxycanvas *proxycanvas; #else int current_layer; void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*); // Callback to perform drawing in plugdata diff --git a/pdlua_gfx.h b/pdlua_gfx.h index a3f32ab..2a32933 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -149,6 +149,14 @@ void pdlua_gfx_mouse_drag(t_pdlua *o, int x, int y) { pdlua_gfx_mouse_event(o, x, y, 3); } +void pdlua_gfx_mouse_enter(t_pdlua *x, int xpos, int ypos) { + pdlua_gfx_mouse_event(x, xpos, ypos, 4); +} + +void pdlua_gfx_mouse_exit(t_pdlua *x, int xpos, int ypos) { + pdlua_gfx_mouse_event(x, xpos, ypos, 5); +} + // Represents a path object, created with path.new(x, y) // for pd-vanilla, this contains all the points that the path contains. bezier curves are flattened out to points before being added // for plugdata, it only contains a unique ID to the juce::Path that this is mapped to @@ -793,6 +801,7 @@ static int gfx_initialize(t_pdlua *obj) gfx->num_transforms = 0; gfx->num_layers = 0; gfx->layer_tags = NULL; + gfx->mouse_inside = 0; pdlua_gfx_repaint(obj, 0); return 0; From cefb1e7d5d577527cca3ae2a4520a828691d3c0b Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Sat, 18 Jan 2025 10:41:08 +0100 Subject: [PATCH 006/109] hide proxycanvas code for PLUGDATA --- pdlua.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pdlua.c b/pdlua.c index 4b3ca30..481e0dc 100644 --- a/pdlua.c +++ b/pdlua.c @@ -581,6 +581,7 @@ static void pdlua_proxyclock_setup(void) /** Setup the proxy class for canvas events. */ static void pdlua_proxycanvas_setup(void) { +#if !PLUGDATA pdlua_proxycanvas_class = class_new( gensym("pdlua proxy canvas"), 0, (t_method)pdlua_proxycanvas_free, @@ -589,6 +590,7 @@ static void pdlua_proxycanvas_setup(void) 0); if (pdlua_proxycanvas_class) class_addanything(pdlua_proxycanvas_class, (t_method)pdlua_proxycanvas_anything); +#endif } /** Dump an array of atoms into a Lua table. */ @@ -811,7 +813,7 @@ static t_pdlua *pdlua_new if (lua_islightuserdata(__L(), -1)) { object = lua_touserdata(__L(), -1); - +#if !PLUGDATA // Create canvas proxy if we have GUI if (object->has_gui) { t_canvas *parent_canvas = glist_getcanvas(object->canvas); @@ -825,7 +827,7 @@ static t_pdlua *pdlua_new return NULL; } } - +#endif lua_pop(__L(), 2);/* pop the userdata and the global "pd" */ PDLUA_DEBUG2("pdlua_new: before returning object %p stack top %d", object, lua_gettop(__L())); return object; @@ -892,11 +894,13 @@ static void pdlua_delete(t_gobj *z, t_glist *glist) { canvas_deletelinesfor(glist, (t_text *)z); +#if !PLUGDATA if (x->gfx.proxycanvas) { // Schedule deferred cleanup (similar to receivecanvas external code) clock_delay(x->gfx.proxycanvas->p_clock, 0); x->gfx.proxycanvas = NULL; } +#endif } #ifdef PURR_DATA // Purr Data uses an older version of this API From cf0cc0e19c3f1db5c7138f4fbed46407a66c6dbd Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 6 Mar 2025 00:33:10 +0100 Subject: [PATCH 007/109] Implement svg rendering for pd-vanilla and plugdata --- pdlua.h | 3 +- pdlua_gfx.h | 212 ++- svg/nanosvg.h | 3098 +++++++++++++++++++++++++++++++++++++++++ svg/nanosvgrast.h | 1460 +++++++++++++++++++ svg/stb_image_write.h | 1724 +++++++++++++++++++++++ 5 files changed, 6494 insertions(+), 3 deletions(-) create mode 100644 svg/nanosvg.h create mode 100644 svg/nanosvgrast.h create mode 100644 svg/stb_image_write.h diff --git a/pdlua.h b/pdlua.h index 0b2f24a..e05942f 100644 --- a/pdlua.h +++ b/pdlua.h @@ -45,7 +45,8 @@ typedef struct _pdlua_gfx // Variables to keep track of mouse button state and drag position int mouse_drag_x, mouse_drag_y, mouse_down; int first_draw; - + uint64_t* images; + int num_images; #else int current_layer; void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*); // Callback to perform drawing in plugdata diff --git a/pdlua_gfx.h b/pdlua_gfx.h index a3f32ab..7db1c31 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -21,6 +21,13 @@ * */ +#define NANOSVG_IMPLEMENTATION +#include "svg/nanosvg.h" +#define NANOSVGRAST_IMPLEMENTATION +#include "svg/nanosvgrast.h" +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "svg/stb_image_write.h" + #ifdef PURR_DATA // Port of the vanilla gfx interface to Purr Data. There are some differences @@ -64,6 +71,7 @@ static int stroke_rounded_rect(lua_State* L); static int draw_line(lua_State* L); static int draw_text(lua_State* L); +static int draw_svg(lua_State* L); static int start_path(lua_State* L); static int line_to(lua_State* L); @@ -91,6 +99,8 @@ void pdlua_gfx_free(t_pdlua_gfx *gfx) { } freebytes(gfx->layer_tags, gfx->num_layers); if(gfx->transforms) freebytes(gfx->transforms, gfx->num_transforms * sizeof(gfx_transform)); + // TODO: delete images from tcl/tk? + if(gfx->num_images) freebytes(gfx->images, gfx->num_images * sizeof(uint64_t)); #endif } @@ -199,6 +209,7 @@ static const luaL_Reg gfx_methods[] = { {"stroke_rounded_rect", stroke_rounded_rect}, {"draw_line", draw_line}, {"draw_text", draw_text}, + {"draw_svg", draw_svg}, {"stroke_path", stroke_path}, {"fill_path", fill_path}, {"fill_all", fill_all}, @@ -296,7 +307,7 @@ static int start_paint(lua_State* L) { } t_pdlua *obj = (t_pdlua*)lua_touserdata(L, 1); int layer = luaL_checknumber(L, 2); - + lua_pushlightuserdata(L, &obj->gfx); luaL_setmetatable(L, "GraphicsContext"); @@ -445,6 +456,20 @@ static int draw_text(lua_State* L) { return 0; } +static int draw_svg(lua_State* L) { + t_pdlua_gfx *gfx = pop_graphics_context(L); + t_pdlua *obj = gfx->object; + + t_canvas *cnv = glist_getcanvas(obj->canvas); + + t_atom args[3]; + SETSYMBOL(args, gensym(luaL_checkstring(L, 1))); + SETFLOAT(args + 1, luaL_checknumber(L, 2)); // x + SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y + + plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_svg"), 3, args); +} + static int stroke_path(lua_State* L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -493,7 +518,6 @@ static int fill_path(lua_State* L) { return 0; } - static int translate(lua_State* L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -577,6 +601,17 @@ static void transform_point(t_pdlua_gfx *gfx, int* x, int* y) { } } +static void transform_size_float(t_pdlua_gfx *gfx, float* w, float* h) { + for(int i = gfx->num_transforms - 1; i >= 0; i--) + { + if(gfx->transforms[i].type == SCALE) + { + *w *= gfx->transforms[i].x; + *h *= gfx->transforms[i].y; + } + } +} + static void transform_point_float(t_pdlua_gfx *gfx, float* x, float* y) { for(int i = gfx->num_transforms - 1; i >= 0; i--) { @@ -1329,6 +1364,179 @@ static int draw_text(lua_State* L) { return 0; } +static uint64_t pdlua_image_hash(unsigned char *str) +{ + uint64_t hash = 5381; + int c; + + while (c = *str++) + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + + return hash; +} + +uint32_t pdlua_float_hash(float f) { + union { float f; uint32_t i; } u; + u.f = f; + return u.i * 0x9E3779B9; +} + +static char *pdlua_base64_encode(const unsigned char *data, + size_t input_length) { + + static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/'}; + + static int mod_table[] = {0, 2, 1}; + + size_t output_length = 4 * ((input_length + 2) / 3); + + char *encoded_data = malloc(output_length+1); + if (encoded_data == NULL) return NULL; + + for (int i = 0, j = 0; i < input_length;) { + + uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; + uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; + uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0; + + uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; + + encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; + } + + for (int i = 0; i < mod_table[input_length % 3]; i++) + encoded_data[output_length - 1 - i] = '='; + + encoded_data[output_length] = '\0'; + return encoded_data; +} + +static int draw_svg(lua_State* L) { + t_pdlua_gfx *gfx = pop_graphics_context(L); + t_pdlua *obj = gfx->object; + + t_canvas *cnv = glist_getcanvas(obj->canvas); + int canvas_zoom = glist_getzoom(cnv); + + // We can only apply scaling with an equal aspect ratio, so we only use the first scale coordinate + float scale_x = canvas_zoom, scale_y = canvas_zoom; + transform_size_float(gfx, &scale_x, &scale_y); + float scale = (scale_x + scale_y) * 0.5f; + + char* svg_text = strdup(luaL_checkstring(L, 1)); + uint64_t svg_hash = pdlua_image_hash(svg_text); + + int x = luaL_checknumber(L, 2); + int y = luaL_checknumber(L, 3); + + transform_point(gfx, &x, &y); + + x += text_xpix((t_object*)obj, obj->canvas) / canvas_zoom; + y += text_ypix((t_object*)obj, obj->canvas) / canvas_zoom; + + x *= canvas_zoom; + y *= canvas_zoom; + + svg_hash ^= pdlua_float_hash(scale); // Make sure we get a unique hash at each scale level + + const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + +#ifndef PURR_DATA + // See if we already rendered the same svg text at the same size, if so, reuse that image + for(int i = 0; i < gfx->num_images; i++) + { + if(gfx->images[i] == svg_hash) + { + char image_name[64]; + snprintf(image_name, 64, "pix%lu", svg_hash); + pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); + return 0; + } + } + + // First parse svg text with nanosvg + struct NSVGimage* image = nsvgParse(svg_text, "px", 96); + if (!image) { + pd_error(0, "[pdlua]: Failed to parse SVG data."); + return 0; + } + + // Then rasterize to a bitmap image + struct NSVGrasterizer* rast = nsvgCreateRasterizer(); + if (!rast) { + pd_error(0, "[pdlua]: Failed to create rasterizer."); + return 0; + } + + const int channels = 4; + int w = (int)image->width * scale; + int h = (int)image->height * scale; + int image_size = w * h * channels; + + char* bitmap_data = getbytes(image_size); + if (!bitmap_data) { + pd_error(0, "[pdlua]: Failed to allocate memory for bitmap."); + return 0; + } + + nsvgRasterize(rast, image, 0, 0, scale, bitmap_data, w, h, w * channels); + + // Convert bitmap data to png + int png_size; + unsigned char* png_buf = stbi_write_png_to_mem(bitmap_data, w * channels, w, h, channels, &png_size); + if (!png_buf || png_size <= 0) { + pd_error(0, "[pdlua]: Failed to encode PNG image."); + return 0; + } + + // Encode PNG data to Base64 + char* encoded_png = pdlua_base64_encode((char*)png_buf, png_size); + free(png_buf); + + if (!encoded_png) { + pd_error(0, "[pdlua]: Failed to encode PNG to Base64."); + return 0; + } + + // Write entry to image hash table + if(gfx->num_images == 0) + { + gfx->images = getbytes(sizeof(uint64_t)); + } + else { + gfx->images = resizebytes(gfx->images, gfx->num_images*sizeof(uint64_t), (gfx->num_images+1) * sizeof(uint64_t)); + } + + gfx->images[gfx->num_images] = svg_hash; + gfx->num_images++; + + char image_name[64]; + snprintf(image_name, 64, "pix%lu", svg_hash); + + pdgui_vmess(0, "rrr s rs", "image", "create", "photo", image_name, "-data", encoded_png); + pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); + + // Cleanup + free(encoded_png); + free(svg_text); + freebytes(bitmap_data, image_size); +#else // PURR_DATA + // TODO: implement for purr-data, probably just send the svg text over? +#endif + return 0; +} + + static int stroke_path(lua_State* L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; diff --git a/svg/nanosvg.h b/svg/nanosvg.h new file mode 100644 index 0000000..76e0dbe --- /dev/null +++ b/svg/nanosvg.h @@ -0,0 +1,3098 @@ +/* + * Copyright (c) 2013-14 Mikko Mononen memon@inside.org + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * The SVG parser is based on Anti-Grain Geometry 2.4 SVG example + * Copyright (C) 2002-2004 Maxim Shemanarev (McSeem) (http://www.antigrain.com/) + * + * Arc calculation code based on canvg (https://code.google.com/p/canvg/) + * + * Bounding box calculation based on http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + * + */ + +#ifndef NANOSVG_H +#define NANOSVG_H + +#ifndef NANOSVG_CPLUSPLUS +#ifdef __cplusplus +extern "C" { +#endif +#endif + +// NanoSVG is a simple stupid single-header-file SVG parse. The output of the parser is a list of cubic bezier shapes. +// +// The library suits well for anything from rendering scalable icons in your editor application to prototyping a game. +// +// NanoSVG supports a wide range of SVG features, but something may be missing, feel free to create a pull request! +// +// The shapes in the SVG images are transformed by the viewBox and converted to specified units. +// That is, you should get the same looking data as your designed in your favorite app. +// +// NanoSVG can return the paths in few different units. For example if you want to render an image, you may choose +// to get the paths in pixels, or if you are feeding the data into a CNC-cutter, you may want to use millimeters. +// +// The units passed to NanoSVG should be one of: 'px', 'pt', 'pc' 'mm', 'cm', or 'in'. +// DPI (dots-per-inch) controls how the unit conversion is done. +// +// If you don't know or care about the units stuff, "px" and 96 should get you going. + + +/* Example Usage: + // Load SVG + NSVGimage* image; + image = nsvgParseFromFile("test.svg", "px", 96); + printf("size: %f x %f\n", image->width, image->height); + // Use... + for (NSVGshape *shape = image->shapes; shape != NULL; shape = shape->next) { + for (NSVGpath *path = shape->paths; path != NULL; path = path->next) { + for (int i = 0; i < path->npts-1; i += 3) { + float* p = &path->pts[i*2]; + drawCubicBez(p[0],p[1], p[2],p[3], p[4],p[5], p[6],p[7]); + } + } + } + // Delete + nsvgDelete(image); +*/ + +enum NSVGpaintType { + NSVG_PAINT_UNDEF = -1, + NSVG_PAINT_NONE = 0, + NSVG_PAINT_COLOR = 1, + NSVG_PAINT_LINEAR_GRADIENT = 2, + NSVG_PAINT_RADIAL_GRADIENT = 3 +}; + +enum NSVGspreadType { + NSVG_SPREAD_PAD = 0, + NSVG_SPREAD_REFLECT = 1, + NSVG_SPREAD_REPEAT = 2 +}; + +enum NSVGlineJoin { + NSVG_JOIN_MITER = 0, + NSVG_JOIN_ROUND = 1, + NSVG_JOIN_BEVEL = 2 +}; + +enum NSVGlineCap { + NSVG_CAP_BUTT = 0, + NSVG_CAP_ROUND = 1, + NSVG_CAP_SQUARE = 2 +}; + +enum NSVGfillRule { + NSVG_FILLRULE_NONZERO = 0, + NSVG_FILLRULE_EVENODD = 1 +}; + +enum NSVGflags { + NSVG_FLAGS_VISIBLE = 0x01 +}; + +typedef struct NSVGgradientStop { + unsigned int color; + float offset; +} NSVGgradientStop; + +typedef struct NSVGgradient { + float xform[6]; + char spread; + float fx, fy; + int nstops; + NSVGgradientStop stops[1]; +} NSVGgradient; + +typedef struct NSVGpaint { + signed char type; + union { + unsigned int color; + NSVGgradient* gradient; + }; +} NSVGpaint; + +typedef struct NSVGpath +{ + float* pts; // Cubic bezier points: x0,y0, [cpx1,cpx1,cpx2,cpy2,x1,y1], ... + int npts; // Total number of bezier points. + char closed; // Flag indicating if shapes should be treated as closed. + float bounds[4]; // Tight bounding box of the shape [minx,miny,maxx,maxy]. + struct NSVGpath* next; // Pointer to next path, or NULL if last element. +} NSVGpath; + +typedef struct NSVGshape +{ + char id[64]; // Optional 'id' attr of the shape or its group + NSVGpaint fill; // Fill paint + NSVGpaint stroke; // Stroke paint + float opacity; // Opacity of the shape. + float strokeWidth; // Stroke width (scaled). + float strokeDashOffset; // Stroke dash offset (scaled). + float strokeDashArray[8]; // Stroke dash array (scaled). + char strokeDashCount; // Number of dash values in dash array. + char strokeLineJoin; // Stroke join type. + char strokeLineCap; // Stroke cap type. + float miterLimit; // Miter limit + char fillRule; // Fill rule, see NSVGfillRule. + unsigned char flags; // Logical or of NSVG_FLAGS_* flags + float bounds[4]; // Tight bounding box of the shape [minx,miny,maxx,maxy]. + char fillGradient[64]; // Optional 'id' of fill gradient + char strokeGradient[64]; // Optional 'id' of stroke gradient + float xform[6]; // Root transformation for fill/stroke gradient + NSVGpath* paths; // Linked list of paths in the image. + struct NSVGshape* next; // Pointer to next shape, or NULL if last element. +} NSVGshape; + +typedef struct NSVGimage +{ + float width; // Width of the image. + float height; // Height of the image. + NSVGshape* shapes; // Linked list of shapes in the image. +} NSVGimage; + +// Parses SVG file from a file, returns SVG image as paths. +NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi); + +// Parses SVG file from a null terminated string, returns SVG image as paths. +// Important note: changes the string. +NSVGimage* nsvgParse(char* input, const char* units, float dpi); + +// Duplicates a path. +NSVGpath* nsvgDuplicatePath(NSVGpath* p); + +// Deletes an image. +void nsvgDelete(NSVGimage* image); + +#ifndef NANOSVG_CPLUSPLUS +#ifdef __cplusplus +} +#endif +#endif + +#ifdef NANOSVG_IMPLEMENTATION + +#include +#include +#include +#include + +#define NSVG_PI (3.14159265358979323846264338327f) +#define NSVG_KAPPA90 (0.5522847493f) // Length proportional to radius of a cubic bezier handle for 90deg arcs. + +#define NSVG_ALIGN_MIN 0 +#define NSVG_ALIGN_MID 1 +#define NSVG_ALIGN_MAX 2 +#define NSVG_ALIGN_NONE 0 +#define NSVG_ALIGN_MEET 1 +#define NSVG_ALIGN_SLICE 2 + +#define NSVG_NOTUSED(v) do { (void)(1 ? (void)0 : ( (void)(v) ) ); } while(0) +#define NSVG_RGB(r, g, b) (((unsigned int)r) | ((unsigned int)g << 8) | ((unsigned int)b << 16)) + +#ifdef _MSC_VER + #pragma warning (disable: 4996) // Switch off security warnings + #pragma warning (disable: 4100) // Switch off unreferenced formal parameter warnings + #ifdef __cplusplus + #define NSVG_INLINE inline + #else + #define NSVG_INLINE + #endif +#else + #define NSVG_INLINE inline +#endif + + +static int nsvg__isspace(char c) +{ + return strchr(" \t\n\v\f\r", c) != 0; +} + +static int nsvg__isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static NSVG_INLINE float nsvg__minf(float a, float b) { return a < b ? a : b; } +static NSVG_INLINE float nsvg__maxf(float a, float b) { return a > b ? a : b; } + + +// Simple XML parser + +#define NSVG_XML_TAG 1 +#define NSVG_XML_CONTENT 2 +#define NSVG_XML_MAX_ATTRIBS 256 + +static void nsvg__parseContent(char* s, + void (*contentCb)(void* ud, const char* s), + void* ud) +{ + // Trim start white spaces + while (*s && nsvg__isspace(*s)) s++; + if (!*s) return; + + if (contentCb) + (*contentCb)(ud, s); +} + +static void nsvg__parseElement(char* s, + void (*startelCb)(void* ud, const char* el, const char** attr), + void (*endelCb)(void* ud, const char* el), + void* ud) +{ + const char* attr[NSVG_XML_MAX_ATTRIBS]; + int nattr = 0; + char* name; + int start = 0; + int end = 0; + char quote; + + // Skip white space after the '<' + while (*s && nsvg__isspace(*s)) s++; + + // Check if the tag is end tag + if (*s == '/') { + s++; + end = 1; + } else { + start = 1; + } + + // Skip comments, data and preprocessor stuff. + if (!*s || *s == '?' || *s == '!') + return; + + // Get tag name + name = s; + while (*s && !nsvg__isspace(*s)) s++; + if (*s) { *s++ = '\0'; } + + // Get attribs + while (!end && *s && nattr < NSVG_XML_MAX_ATTRIBS-3) { + char* name = NULL; + char* value = NULL; + + // Skip white space before the attrib name + while (*s && nsvg__isspace(*s)) s++; + if (!*s) break; + if (*s == '/') { + end = 1; + break; + } + name = s; + // Find end of the attrib name. + while (*s && !nsvg__isspace(*s) && *s != '=') s++; + if (*s) { *s++ = '\0'; } + // Skip until the beginning of the value. + while (*s && *s != '\"' && *s != '\'') s++; + if (!*s) break; + quote = *s; + s++; + // Store value and find the end of it. + value = s; + while (*s && *s != quote) s++; + if (*s) { *s++ = '\0'; } + + // Store only well formed attributes + if (name && value) { + attr[nattr++] = name; + attr[nattr++] = value; + } + } + + // List terminator + attr[nattr++] = 0; + attr[nattr++] = 0; + + // Call callbacks. + if (start && startelCb) + (*startelCb)(ud, name, attr); + if (end && endelCb) + (*endelCb)(ud, name); +} + +int nsvg__parseXML(char* input, + void (*startelCb)(void* ud, const char* el, const char** attr), + void (*endelCb)(void* ud, const char* el), + void (*contentCb)(void* ud, const char* s), + void* ud) +{ + char* s = input; + char* mark = s; + int state = NSVG_XML_CONTENT; + while (*s) { + if (*s == '<' && state == NSVG_XML_CONTENT) { + // Start of a tag + *s++ = '\0'; + nsvg__parseContent(mark, contentCb, ud); + mark = s; + state = NSVG_XML_TAG; + } else if (*s == '>' && state == NSVG_XML_TAG) { + // Start of a content or new tag. + *s++ = '\0'; + nsvg__parseElement(mark, startelCb, endelCb, ud); + mark = s; + state = NSVG_XML_CONTENT; + } else { + s++; + } + } + + return 1; +} + + +/* Simple SVG parser. */ + +#define NSVG_MAX_ATTR 128 + +enum NSVGgradientUnits { + NSVG_USER_SPACE = 0, + NSVG_OBJECT_SPACE = 1 +}; + +#define NSVG_MAX_DASHES 8 + +enum NSVGunits { + NSVG_UNITS_USER, + NSVG_UNITS_PX, + NSVG_UNITS_PT, + NSVG_UNITS_PC, + NSVG_UNITS_MM, + NSVG_UNITS_CM, + NSVG_UNITS_IN, + NSVG_UNITS_PERCENT, + NSVG_UNITS_EM, + NSVG_UNITS_EX +}; + +typedef struct NSVGcoordinate { + float value; + int units; +} NSVGcoordinate; + +typedef struct NSVGlinearData { + NSVGcoordinate x1, y1, x2, y2; +} NSVGlinearData; + +typedef struct NSVGradialData { + NSVGcoordinate cx, cy, r, fx, fy; +} NSVGradialData; + +typedef struct NSVGgradientData +{ + char id[64]; + char ref[64]; + signed char type; + union { + NSVGlinearData linear; + NSVGradialData radial; + }; + char spread; + char units; + float xform[6]; + int nstops; + NSVGgradientStop* stops; + struct NSVGgradientData* next; +} NSVGgradientData; + +typedef struct NSVGattrib +{ + char id[64]; + float xform[6]; + unsigned int fillColor; + unsigned int strokeColor; + float opacity; + float fillOpacity; + float strokeOpacity; + char fillGradient[64]; + char strokeGradient[64]; + float strokeWidth; + float strokeDashOffset; + float strokeDashArray[NSVG_MAX_DASHES]; + int strokeDashCount; + char strokeLineJoin; + char strokeLineCap; + float miterLimit; + char fillRule; + float fontSize; + unsigned int stopColor; + float stopOpacity; + float stopOffset; + char hasFill; + char hasStroke; + char visible; +} NSVGattrib; + +typedef struct NSVGparser +{ + NSVGattrib attr[NSVG_MAX_ATTR]; + int attrHead; + float* pts; + int npts; + int cpts; + NSVGpath* plist; + NSVGimage* image; + NSVGgradientData* gradients; + NSVGshape* shapesTail; + float viewMinx, viewMiny, viewWidth, viewHeight; + int alignX, alignY, alignType; + float dpi; + char pathFlag; + char defsFlag; +} NSVGparser; + +static void nsvg__xformIdentity(float* t) +{ + t[0] = 1.0f; t[1] = 0.0f; + t[2] = 0.0f; t[3] = 1.0f; + t[4] = 0.0f; t[5] = 0.0f; +} + +static void nsvg__xformSetTranslation(float* t, float tx, float ty) +{ + t[0] = 1.0f; t[1] = 0.0f; + t[2] = 0.0f; t[3] = 1.0f; + t[4] = tx; t[5] = ty; +} + +static void nsvg__xformSetScale(float* t, float sx, float sy) +{ + t[0] = sx; t[1] = 0.0f; + t[2] = 0.0f; t[3] = sy; + t[4] = 0.0f; t[5] = 0.0f; +} + +static void nsvg__xformSetSkewX(float* t, float a) +{ + t[0] = 1.0f; t[1] = 0.0f; + t[2] = tanf(a); t[3] = 1.0f; + t[4] = 0.0f; t[5] = 0.0f; +} + +static void nsvg__xformSetSkewY(float* t, float a) +{ + t[0] = 1.0f; t[1] = tanf(a); + t[2] = 0.0f; t[3] = 1.0f; + t[4] = 0.0f; t[5] = 0.0f; +} + +static void nsvg__xformSetRotation(float* t, float a) +{ + float cs = cosf(a), sn = sinf(a); + t[0] = cs; t[1] = sn; + t[2] = -sn; t[3] = cs; + t[4] = 0.0f; t[5] = 0.0f; +} + +static void nsvg__xformMultiply(float* t, float* s) +{ + float t0 = t[0] * s[0] + t[1] * s[2]; + float t2 = t[2] * s[0] + t[3] * s[2]; + float t4 = t[4] * s[0] + t[5] * s[2] + s[4]; + t[1] = t[0] * s[1] + t[1] * s[3]; + t[3] = t[2] * s[1] + t[3] * s[3]; + t[5] = t[4] * s[1] + t[5] * s[3] + s[5]; + t[0] = t0; + t[2] = t2; + t[4] = t4; +} + +static void nsvg__xformInverse(float* inv, float* t) +{ + double invdet, det = (double)t[0] * t[3] - (double)t[2] * t[1]; + if (det > -1e-6 && det < 1e-6) { + nsvg__xformIdentity(t); + return; + } + invdet = 1.0 / det; + inv[0] = (float)(t[3] * invdet); + inv[2] = (float)(-t[2] * invdet); + inv[4] = (float)(((double)t[2] * t[5] - (double)t[3] * t[4]) * invdet); + inv[1] = (float)(-t[1] * invdet); + inv[3] = (float)(t[0] * invdet); + inv[5] = (float)(((double)t[1] * t[4] - (double)t[0] * t[5]) * invdet); +} + +static void nsvg__xformPremultiply(float* t, float* s) +{ + float s2[6]; + memcpy(s2, s, sizeof(float)*6); + nsvg__xformMultiply(s2, t); + memcpy(t, s2, sizeof(float)*6); +} + +static void nsvg__xformPoint(float* dx, float* dy, float x, float y, float* t) +{ + *dx = x*t[0] + y*t[2] + t[4]; + *dy = x*t[1] + y*t[3] + t[5]; +} + +static void nsvg__xformVec(float* dx, float* dy, float x, float y, float* t) +{ + *dx = x*t[0] + y*t[2]; + *dy = x*t[1] + y*t[3]; +} + +#define NSVG_EPSILON (1e-12) + +static int nsvg__ptInBounds(float* pt, float* bounds) +{ + return pt[0] >= bounds[0] && pt[0] <= bounds[2] && pt[1] >= bounds[1] && pt[1] <= bounds[3]; +} + + +static double nsvg__evalBezier(double t, double p0, double p1, double p2, double p3) +{ + double it = 1.0-t; + return it*it*it*p0 + 3.0*it*it*t*p1 + 3.0*it*t*t*p2 + t*t*t*p3; +} + +static void nsvg__curveBounds(float* bounds, float* curve) +{ + int i, j, count; + double roots[2], a, b, c, b2ac, t, v; + float* v0 = &curve[0]; + float* v1 = &curve[2]; + float* v2 = &curve[4]; + float* v3 = &curve[6]; + + // Start the bounding box by end points + bounds[0] = nsvg__minf(v0[0], v3[0]); + bounds[1] = nsvg__minf(v0[1], v3[1]); + bounds[2] = nsvg__maxf(v0[0], v3[0]); + bounds[3] = nsvg__maxf(v0[1], v3[1]); + + // Bezier curve fits inside the convex hull of it's control points. + // If control points are inside the bounds, we're done. + if (nsvg__ptInBounds(v1, bounds) && nsvg__ptInBounds(v2, bounds)) + return; + + // Add bezier curve inflection points in X and Y. + for (i = 0; i < 2; i++) { + a = -3.0 * v0[i] + 9.0 * v1[i] - 9.0 * v2[i] + 3.0 * v3[i]; + b = 6.0 * v0[i] - 12.0 * v1[i] + 6.0 * v2[i]; + c = 3.0 * v1[i] - 3.0 * v0[i]; + count = 0; + if (fabs(a) < NSVG_EPSILON) { + if (fabs(b) > NSVG_EPSILON) { + t = -c / b; + if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) + roots[count++] = t; + } + } else { + b2ac = b*b - 4.0*c*a; + if (b2ac > NSVG_EPSILON) { + t = (-b + sqrt(b2ac)) / (2.0 * a); + if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) + roots[count++] = t; + t = (-b - sqrt(b2ac)) / (2.0 * a); + if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) + roots[count++] = t; + } + } + for (j = 0; j < count; j++) { + v = nsvg__evalBezier(roots[j], v0[i], v1[i], v2[i], v3[i]); + bounds[0+i] = nsvg__minf(bounds[0+i], (float)v); + bounds[2+i] = nsvg__maxf(bounds[2+i], (float)v); + } + } +} + +static NSVGparser* nsvg__createParser(void) +{ + NSVGparser* p; + p = (NSVGparser*)malloc(sizeof(NSVGparser)); + if (p == NULL) goto error; + memset(p, 0, sizeof(NSVGparser)); + + p->image = (NSVGimage*)malloc(sizeof(NSVGimage)); + if (p->image == NULL) goto error; + memset(p->image, 0, sizeof(NSVGimage)); + + // Init style + nsvg__xformIdentity(p->attr[0].xform); + memset(p->attr[0].id, 0, sizeof p->attr[0].id); + p->attr[0].fillColor = NSVG_RGB(0,0,0); + p->attr[0].strokeColor = NSVG_RGB(0,0,0); + p->attr[0].opacity = 1; + p->attr[0].fillOpacity = 1; + p->attr[0].strokeOpacity = 1; + p->attr[0].stopOpacity = 1; + p->attr[0].strokeWidth = 1; + p->attr[0].strokeLineJoin = NSVG_JOIN_MITER; + p->attr[0].strokeLineCap = NSVG_CAP_BUTT; + p->attr[0].miterLimit = 4; + p->attr[0].fillRule = NSVG_FILLRULE_NONZERO; + p->attr[0].hasFill = 1; + p->attr[0].visible = 1; + + return p; + +error: + if (p) { + if (p->image) free(p->image); + free(p); + } + return NULL; +} + +static void nsvg__deletePaths(NSVGpath* path) +{ + while (path) { + NSVGpath *next = path->next; + if (path->pts != NULL) + free(path->pts); + free(path); + path = next; + } +} + +static void nsvg__deletePaint(NSVGpaint* paint) +{ + if (paint->type == NSVG_PAINT_LINEAR_GRADIENT || paint->type == NSVG_PAINT_RADIAL_GRADIENT) + free(paint->gradient); +} + +static void nsvg__deleteGradientData(NSVGgradientData* grad) +{ + NSVGgradientData* next; + while (grad != NULL) { + next = grad->next; + free(grad->stops); + free(grad); + grad = next; + } +} + +static void nsvg__deleteParser(NSVGparser* p) +{ + if (p != NULL) { + nsvg__deletePaths(p->plist); + nsvg__deleteGradientData(p->gradients); + nsvgDelete(p->image); + free(p->pts); + free(p); + } +} + +static void nsvg__resetPath(NSVGparser* p) +{ + p->npts = 0; +} + +static void nsvg__addPoint(NSVGparser* p, float x, float y) +{ + if (p->npts+1 > p->cpts) { + p->cpts = p->cpts ? p->cpts*2 : 8; + p->pts = (float*)realloc(p->pts, p->cpts*2*sizeof(float)); + if (!p->pts) return; + } + p->pts[p->npts*2+0] = x; + p->pts[p->npts*2+1] = y; + p->npts++; +} + +static void nsvg__moveTo(NSVGparser* p, float x, float y) +{ + if (p->npts > 0) { + p->pts[(p->npts-1)*2+0] = x; + p->pts[(p->npts-1)*2+1] = y; + } else { + nsvg__addPoint(p, x, y); + } +} + +static void nsvg__lineTo(NSVGparser* p, float x, float y) +{ + float px,py, dx,dy; + if (p->npts > 0) { + px = p->pts[(p->npts-1)*2+0]; + py = p->pts[(p->npts-1)*2+1]; + dx = x - px; + dy = y - py; + nsvg__addPoint(p, px + dx/3.0f, py + dy/3.0f); + nsvg__addPoint(p, x - dx/3.0f, y - dy/3.0f); + nsvg__addPoint(p, x, y); + } +} + +static void nsvg__cubicBezTo(NSVGparser* p, float cpx1, float cpy1, float cpx2, float cpy2, float x, float y) +{ + if (p->npts > 0) { + nsvg__addPoint(p, cpx1, cpy1); + nsvg__addPoint(p, cpx2, cpy2); + nsvg__addPoint(p, x, y); + } +} + +static NSVGattrib* nsvg__getAttr(NSVGparser* p) +{ + return &p->attr[p->attrHead]; +} + +static void nsvg__pushAttr(NSVGparser* p) +{ + if (p->attrHead < NSVG_MAX_ATTR-1) { + p->attrHead++; + memcpy(&p->attr[p->attrHead], &p->attr[p->attrHead-1], sizeof(NSVGattrib)); + } +} + +static void nsvg__popAttr(NSVGparser* p) +{ + if (p->attrHead > 0) + p->attrHead--; +} + +static float nsvg__actualOrigX(NSVGparser* p) +{ + return p->viewMinx; +} + +static float nsvg__actualOrigY(NSVGparser* p) +{ + return p->viewMiny; +} + +static float nsvg__actualWidth(NSVGparser* p) +{ + return p->viewWidth; +} + +static float nsvg__actualHeight(NSVGparser* p) +{ + return p->viewHeight; +} + +static float nsvg__actualLength(NSVGparser* p) +{ + float w = nsvg__actualWidth(p), h = nsvg__actualHeight(p); + return sqrtf(w*w + h*h) / sqrtf(2.0f); +} + +static float nsvg__convertToPixels(NSVGparser* p, NSVGcoordinate c, float orig, float length) +{ + NSVGattrib* attr = nsvg__getAttr(p); + switch (c.units) { + case NSVG_UNITS_USER: return c.value; + case NSVG_UNITS_PX: return c.value; + case NSVG_UNITS_PT: return c.value / 72.0f * p->dpi; + case NSVG_UNITS_PC: return c.value / 6.0f * p->dpi; + case NSVG_UNITS_MM: return c.value / 25.4f * p->dpi; + case NSVG_UNITS_CM: return c.value / 2.54f * p->dpi; + case NSVG_UNITS_IN: return c.value * p->dpi; + case NSVG_UNITS_EM: return c.value * attr->fontSize; + case NSVG_UNITS_EX: return c.value * attr->fontSize * 0.52f; // x-height of Helvetica. + case NSVG_UNITS_PERCENT: return orig + c.value / 100.0f * length; + default: return c.value; + } + return c.value; +} + +static NSVGgradientData* nsvg__findGradientData(NSVGparser* p, const char* id) +{ + NSVGgradientData* grad = p->gradients; + if (id == NULL || *id == '\0') + return NULL; + while (grad != NULL) { + if (strcmp(grad->id, id) == 0) + return grad; + grad = grad->next; + } + return NULL; +} + +static NSVGgradient* nsvg__createGradient(NSVGparser* p, const char* id, const float* localBounds, float *xform, signed char* paintType) +{ + NSVGgradientData* data = NULL; + NSVGgradientData* ref = NULL; + NSVGgradientStop* stops = NULL; + NSVGgradient* grad; + float ox, oy, sw, sh, sl; + int nstops = 0; + int refIter; + + data = nsvg__findGradientData(p, id); + if (data == NULL) return NULL; + + // TODO: use ref to fill in all unset values too. + ref = data; + refIter = 0; + while (ref != NULL) { + NSVGgradientData* nextRef = NULL; + if (stops == NULL && ref->stops != NULL) { + stops = ref->stops; + nstops = ref->nstops; + break; + } + nextRef = nsvg__findGradientData(p, ref->ref); + if (nextRef == ref) break; // prevent infite loops on malformed data + ref = nextRef; + refIter++; + if (refIter > 32) break; // prevent infite loops on malformed data + } + if (stops == NULL) return NULL; + + grad = (NSVGgradient*)malloc(sizeof(NSVGgradient) + sizeof(NSVGgradientStop)*(nstops-1)); + if (grad == NULL) return NULL; + + // The shape width and height. + if (data->units == NSVG_OBJECT_SPACE) { + ox = localBounds[0]; + oy = localBounds[1]; + sw = localBounds[2] - localBounds[0]; + sh = localBounds[3] - localBounds[1]; + } else { + ox = nsvg__actualOrigX(p); + oy = nsvg__actualOrigY(p); + sw = nsvg__actualWidth(p); + sh = nsvg__actualHeight(p); + } + sl = sqrtf(sw*sw + sh*sh) / sqrtf(2.0f); + + if (data->type == NSVG_PAINT_LINEAR_GRADIENT) { + float x1, y1, x2, y2, dx, dy; + x1 = nsvg__convertToPixels(p, data->linear.x1, ox, sw); + y1 = nsvg__convertToPixels(p, data->linear.y1, oy, sh); + x2 = nsvg__convertToPixels(p, data->linear.x2, ox, sw); + y2 = nsvg__convertToPixels(p, data->linear.y2, oy, sh); + // Calculate transform aligned to the line + dx = x2 - x1; + dy = y2 - y1; + grad->xform[0] = dy; grad->xform[1] = -dx; + grad->xform[2] = dx; grad->xform[3] = dy; + grad->xform[4] = x1; grad->xform[5] = y1; + } else { + float cx, cy, fx, fy, r; + cx = nsvg__convertToPixels(p, data->radial.cx, ox, sw); + cy = nsvg__convertToPixels(p, data->radial.cy, oy, sh); + fx = nsvg__convertToPixels(p, data->radial.fx, ox, sw); + fy = nsvg__convertToPixels(p, data->radial.fy, oy, sh); + r = nsvg__convertToPixels(p, data->radial.r, 0, sl); + // Calculate transform aligned to the circle + grad->xform[0] = r; grad->xform[1] = 0; + grad->xform[2] = 0; grad->xform[3] = r; + grad->xform[4] = cx; grad->xform[5] = cy; + grad->fx = fx / r; + grad->fy = fy / r; + } + + nsvg__xformMultiply(grad->xform, data->xform); + nsvg__xformMultiply(grad->xform, xform); + + grad->spread = data->spread; + memcpy(grad->stops, stops, nstops*sizeof(NSVGgradientStop)); + grad->nstops = nstops; + + *paintType = data->type; + + return grad; +} + +static float nsvg__getAverageScale(float* t) +{ + float sx = sqrtf(t[0]*t[0] + t[2]*t[2]); + float sy = sqrtf(t[1]*t[1] + t[3]*t[3]); + return (sx + sy) * 0.5f; +} + +static void nsvg__getLocalBounds(float* bounds, NSVGshape *shape, float* xform) +{ + NSVGpath* path; + float curve[4*2], curveBounds[4]; + int i, first = 1; + for (path = shape->paths; path != NULL; path = path->next) { + nsvg__xformPoint(&curve[0], &curve[1], path->pts[0], path->pts[1], xform); + for (i = 0; i < path->npts-1; i += 3) { + nsvg__xformPoint(&curve[2], &curve[3], path->pts[(i+1)*2], path->pts[(i+1)*2+1], xform); + nsvg__xformPoint(&curve[4], &curve[5], path->pts[(i+2)*2], path->pts[(i+2)*2+1], xform); + nsvg__xformPoint(&curve[6], &curve[7], path->pts[(i+3)*2], path->pts[(i+3)*2+1], xform); + nsvg__curveBounds(curveBounds, curve); + if (first) { + bounds[0] = curveBounds[0]; + bounds[1] = curveBounds[1]; + bounds[2] = curveBounds[2]; + bounds[3] = curveBounds[3]; + first = 0; + } else { + bounds[0] = nsvg__minf(bounds[0], curveBounds[0]); + bounds[1] = nsvg__minf(bounds[1], curveBounds[1]); + bounds[2] = nsvg__maxf(bounds[2], curveBounds[2]); + bounds[3] = nsvg__maxf(bounds[3], curveBounds[3]); + } + curve[0] = curve[6]; + curve[1] = curve[7]; + } + } +} + +static void nsvg__addShape(NSVGparser* p) +{ + NSVGattrib* attr = nsvg__getAttr(p); + float scale = 1.0f; + NSVGshape* shape; + NSVGpath* path; + int i; + + if (p->plist == NULL) + return; + + shape = (NSVGshape*)malloc(sizeof(NSVGshape)); + if (shape == NULL) goto error; + memset(shape, 0, sizeof(NSVGshape)); + + memcpy(shape->id, attr->id, sizeof shape->id); + memcpy(shape->fillGradient, attr->fillGradient, sizeof shape->fillGradient); + memcpy(shape->strokeGradient, attr->strokeGradient, sizeof shape->strokeGradient); + memcpy(shape->xform, attr->xform, sizeof shape->xform); + scale = nsvg__getAverageScale(attr->xform); + shape->strokeWidth = attr->strokeWidth * scale; + shape->strokeDashOffset = attr->strokeDashOffset * scale; + shape->strokeDashCount = (char)attr->strokeDashCount; + for (i = 0; i < attr->strokeDashCount; i++) + shape->strokeDashArray[i] = attr->strokeDashArray[i] * scale; + shape->strokeLineJoin = attr->strokeLineJoin; + shape->strokeLineCap = attr->strokeLineCap; + shape->miterLimit = attr->miterLimit; + shape->fillRule = attr->fillRule; + shape->opacity = attr->opacity; + + shape->paths = p->plist; + p->plist = NULL; + + // Calculate shape bounds + shape->bounds[0] = shape->paths->bounds[0]; + shape->bounds[1] = shape->paths->bounds[1]; + shape->bounds[2] = shape->paths->bounds[2]; + shape->bounds[3] = shape->paths->bounds[3]; + for (path = shape->paths->next; path != NULL; path = path->next) { + shape->bounds[0] = nsvg__minf(shape->bounds[0], path->bounds[0]); + shape->bounds[1] = nsvg__minf(shape->bounds[1], path->bounds[1]); + shape->bounds[2] = nsvg__maxf(shape->bounds[2], path->bounds[2]); + shape->bounds[3] = nsvg__maxf(shape->bounds[3], path->bounds[3]); + } + + // Set fill + if (attr->hasFill == 0) { + shape->fill.type = NSVG_PAINT_NONE; + } else if (attr->hasFill == 1) { + shape->fill.type = NSVG_PAINT_COLOR; + shape->fill.color = attr->fillColor; + shape->fill.color |= (unsigned int)(attr->fillOpacity*255) << 24; + } else if (attr->hasFill == 2) { + shape->fill.type = NSVG_PAINT_UNDEF; + } + + // Set stroke + if (attr->hasStroke == 0) { + shape->stroke.type = NSVG_PAINT_NONE; + } else if (attr->hasStroke == 1) { + shape->stroke.type = NSVG_PAINT_COLOR; + shape->stroke.color = attr->strokeColor; + shape->stroke.color |= (unsigned int)(attr->strokeOpacity*255) << 24; + } else if (attr->hasStroke == 2) { + shape->stroke.type = NSVG_PAINT_UNDEF; + } + + // Set flags + shape->flags = (attr->visible ? NSVG_FLAGS_VISIBLE : 0x00); + + // Add to tail + if (p->image->shapes == NULL) + p->image->shapes = shape; + else + p->shapesTail->next = shape; + p->shapesTail = shape; + + return; + +error: + if (shape) free(shape); +} + +static void nsvg__addPath(NSVGparser* p, char closed) +{ + NSVGattrib* attr = nsvg__getAttr(p); + NSVGpath* path = NULL; + float bounds[4]; + float* curve; + int i; + + if (p->npts < 4) + return; + + if (closed) + nsvg__lineTo(p, p->pts[0], p->pts[1]); + + // Expect 1 + N*3 points (N = number of cubic bezier segments). + if ((p->npts % 3) != 1) + return; + + path = (NSVGpath*)malloc(sizeof(NSVGpath)); + if (path == NULL) goto error; + memset(path, 0, sizeof(NSVGpath)); + + path->pts = (float*)malloc(p->npts*2*sizeof(float)); + if (path->pts == NULL) goto error; + path->closed = closed; + path->npts = p->npts; + + // Transform path. + for (i = 0; i < p->npts; ++i) + nsvg__xformPoint(&path->pts[i*2], &path->pts[i*2+1], p->pts[i*2], p->pts[i*2+1], attr->xform); + + // Find bounds + for (i = 0; i < path->npts-1; i += 3) { + curve = &path->pts[i*2]; + nsvg__curveBounds(bounds, curve); + if (i == 0) { + path->bounds[0] = bounds[0]; + path->bounds[1] = bounds[1]; + path->bounds[2] = bounds[2]; + path->bounds[3] = bounds[3]; + } else { + path->bounds[0] = nsvg__minf(path->bounds[0], bounds[0]); + path->bounds[1] = nsvg__minf(path->bounds[1], bounds[1]); + path->bounds[2] = nsvg__maxf(path->bounds[2], bounds[2]); + path->bounds[3] = nsvg__maxf(path->bounds[3], bounds[3]); + } + } + + path->next = p->plist; + p->plist = path; + + return; + +error: + if (path != NULL) { + if (path->pts != NULL) free(path->pts); + free(path); + } +} + +// We roll our own string to float because the std library one uses locale and messes things up. +static double nsvg__atof(const char* s) +{ + char* cur = (char*)s; + char* end = NULL; + double res = 0.0, sign = 1.0; + long long intPart = 0, fracPart = 0; + char hasIntPart = 0, hasFracPart = 0; + + // Parse optional sign + if (*cur == '+') { + cur++; + } else if (*cur == '-') { + sign = -1; + cur++; + } + + // Parse integer part + if (nsvg__isdigit(*cur)) { + // Parse digit sequence + intPart = strtoll(cur, &end, 10); + if (cur != end) { + res = (double)intPart; + hasIntPart = 1; + cur = end; + } + } + + // Parse fractional part. + if (*cur == '.') { + cur++; // Skip '.' + if (nsvg__isdigit(*cur)) { + // Parse digit sequence + fracPart = strtoll(cur, &end, 10); + if (cur != end) { + res += (double)fracPart / pow(10.0, (double)(end - cur)); + hasFracPart = 1; + cur = end; + } + } + } + + // A valid number should have integer or fractional part. + if (!hasIntPart && !hasFracPart) + return 0.0; + + // Parse optional exponent + if (*cur == 'e' || *cur == 'E') { + long expPart = 0; + cur++; // skip 'E' + expPart = strtol(cur, &end, 10); // Parse digit sequence with sign + if (cur != end) { + res *= pow(10.0, (double)expPart); + } + } + + return res * sign; +} + + +static const char* nsvg__parseNumber(const char* s, char* it, const int size) +{ + const int last = size-1; + int i = 0; + + // sign + if (*s == '-' || *s == '+') { + if (i < last) it[i++] = *s; + s++; + } + // integer part + while (*s && nsvg__isdigit(*s)) { + if (i < last) it[i++] = *s; + s++; + } + if (*s == '.') { + // decimal point + if (i < last) it[i++] = *s; + s++; + // fraction part + while (*s && nsvg__isdigit(*s)) { + if (i < last) it[i++] = *s; + s++; + } + } + // exponent + if ((*s == 'e' || *s == 'E') && (s[1] != 'm' && s[1] != 'x')) { + if (i < last) it[i++] = *s; + s++; + if (*s == '-' || *s == '+') { + if (i < last) it[i++] = *s; + s++; + } + while (*s && nsvg__isdigit(*s)) { + if (i < last) it[i++] = *s; + s++; + } + } + it[i] = '\0'; + + return s; +} + +static const char* nsvg__getNextPathItemWhenArcFlag(const char* s, char* it) +{ + it[0] = '\0'; + while (*s && (nsvg__isspace(*s) || *s == ',')) s++; + if (!*s) return s; + if (*s == '0' || *s == '1') { + it[0] = *s++; + it[1] = '\0'; + return s; + } + return s; +} + +static const char* nsvg__getNextPathItem(const char* s, char* it) +{ + it[0] = '\0'; + // Skip white spaces and commas + while (*s && (nsvg__isspace(*s) || *s == ',')) s++; + if (!*s) return s; + if (*s == '-' || *s == '+' || *s == '.' || nsvg__isdigit(*s)) { + s = nsvg__parseNumber(s, it, 64); + } else { + // Parse command + it[0] = *s++; + it[1] = '\0'; + return s; + } + + return s; +} + +static unsigned int nsvg__parseColorHex(const char* str) +{ + unsigned int r=0, g=0, b=0; + if (sscanf(str, "#%2x%2x%2x", &r, &g, &b) == 3 ) // 2 digit hex + return NSVG_RGB(r, g, b); + if (sscanf(str, "#%1x%1x%1x", &r, &g, &b) == 3 ) // 1 digit hex, e.g. #abc -> 0xccbbaa + return NSVG_RGB(r*17, g*17, b*17); // same effect as (r<<4|r), (g<<4|g), .. + return NSVG_RGB(128, 128, 128); +} + +// Parse rgb color. The pointer 'str' must point at "rgb(" (4+ characters). +// This function returns gray (rgb(128, 128, 128) == '#808080') on parse errors +// for backwards compatibility. Note: other image viewers return black instead. + +static unsigned int nsvg__parseColorRGB(const char* str) +{ + int i; + unsigned int rgbi[3]; + float rgbf[3]; + // try decimal integers first + if (sscanf(str, "rgb(%u, %u, %u)", &rgbi[0], &rgbi[1], &rgbi[2]) != 3) { + // integers failed, try percent values (float, locale independent) + const char delimiter[3] = {',', ',', ')'}; + str += 4; // skip "rgb(" + for (i = 0; i < 3; i++) { + while (*str && (nsvg__isspace(*str))) str++; // skip leading spaces + if (*str == '+') str++; // skip '+' (don't allow '-') + if (!*str) break; + rgbf[i] = nsvg__atof(str); + + // Note 1: it would be great if nsvg__atof() returned how many + // bytes it consumed but it doesn't. We need to skip the number, + // the '%' character, spaces, and the delimiter ',' or ')'. + + // Note 2: The following code does not allow values like "33.%", + // i.e. a decimal point w/o fractional part, but this is consistent + // with other image viewers, e.g. firefox, chrome, eog, gimp. + + while (*str && nsvg__isdigit(*str)) str++; // skip integer part + if (*str == '.') { + str++; + if (!nsvg__isdigit(*str)) break; // error: no digit after '.' + while (*str && nsvg__isdigit(*str)) str++; // skip fractional part + } + if (*str == '%') str++; else break; + while (*str && nsvg__isspace(*str)) str++; + if (*str == delimiter[i]) str++; + else break; + } + if (i == 3) { + rgbi[0] = roundf(rgbf[0] * 2.55f); + rgbi[1] = roundf(rgbf[1] * 2.55f); + rgbi[2] = roundf(rgbf[2] * 2.55f); + } else { + rgbi[0] = rgbi[1] = rgbi[2] = 128; + } + } + // clip values as the CSS spec requires + for (i = 0; i < 3; i++) { + if (rgbi[i] > 255) rgbi[i] = 255; + } + return NSVG_RGB(rgbi[0], rgbi[1], rgbi[2]); +} + +typedef struct NSVGNamedColor { + const char* name; + unsigned int color; +} NSVGNamedColor; + +NSVGNamedColor nsvg__colors[] = { + + { "red", NSVG_RGB(255, 0, 0) }, + { "green", NSVG_RGB( 0, 128, 0) }, + { "blue", NSVG_RGB( 0, 0, 255) }, + { "yellow", NSVG_RGB(255, 255, 0) }, + { "cyan", NSVG_RGB( 0, 255, 255) }, + { "magenta", NSVG_RGB(255, 0, 255) }, + { "black", NSVG_RGB( 0, 0, 0) }, + { "grey", NSVG_RGB(128, 128, 128) }, + { "gray", NSVG_RGB(128, 128, 128) }, + { "white", NSVG_RGB(255, 255, 255) }, + +#ifdef NANOSVG_ALL_COLOR_KEYWORDS + { "aliceblue", NSVG_RGB(240, 248, 255) }, + { "antiquewhite", NSVG_RGB(250, 235, 215) }, + { "aqua", NSVG_RGB( 0, 255, 255) }, + { "aquamarine", NSVG_RGB(127, 255, 212) }, + { "azure", NSVG_RGB(240, 255, 255) }, + { "beige", NSVG_RGB(245, 245, 220) }, + { "bisque", NSVG_RGB(255, 228, 196) }, + { "blanchedalmond", NSVG_RGB(255, 235, 205) }, + { "blueviolet", NSVG_RGB(138, 43, 226) }, + { "brown", NSVG_RGB(165, 42, 42) }, + { "burlywood", NSVG_RGB(222, 184, 135) }, + { "cadetblue", NSVG_RGB( 95, 158, 160) }, + { "chartreuse", NSVG_RGB(127, 255, 0) }, + { "chocolate", NSVG_RGB(210, 105, 30) }, + { "coral", NSVG_RGB(255, 127, 80) }, + { "cornflowerblue", NSVG_RGB(100, 149, 237) }, + { "cornsilk", NSVG_RGB(255, 248, 220) }, + { "crimson", NSVG_RGB(220, 20, 60) }, + { "darkblue", NSVG_RGB( 0, 0, 139) }, + { "darkcyan", NSVG_RGB( 0, 139, 139) }, + { "darkgoldenrod", NSVG_RGB(184, 134, 11) }, + { "darkgray", NSVG_RGB(169, 169, 169) }, + { "darkgreen", NSVG_RGB( 0, 100, 0) }, + { "darkgrey", NSVG_RGB(169, 169, 169) }, + { "darkkhaki", NSVG_RGB(189, 183, 107) }, + { "darkmagenta", NSVG_RGB(139, 0, 139) }, + { "darkolivegreen", NSVG_RGB( 85, 107, 47) }, + { "darkorange", NSVG_RGB(255, 140, 0) }, + { "darkorchid", NSVG_RGB(153, 50, 204) }, + { "darkred", NSVG_RGB(139, 0, 0) }, + { "darksalmon", NSVG_RGB(233, 150, 122) }, + { "darkseagreen", NSVG_RGB(143, 188, 143) }, + { "darkslateblue", NSVG_RGB( 72, 61, 139) }, + { "darkslategray", NSVG_RGB( 47, 79, 79) }, + { "darkslategrey", NSVG_RGB( 47, 79, 79) }, + { "darkturquoise", NSVG_RGB( 0, 206, 209) }, + { "darkviolet", NSVG_RGB(148, 0, 211) }, + { "deeppink", NSVG_RGB(255, 20, 147) }, + { "deepskyblue", NSVG_RGB( 0, 191, 255) }, + { "dimgray", NSVG_RGB(105, 105, 105) }, + { "dimgrey", NSVG_RGB(105, 105, 105) }, + { "dodgerblue", NSVG_RGB( 30, 144, 255) }, + { "firebrick", NSVG_RGB(178, 34, 34) }, + { "floralwhite", NSVG_RGB(255, 250, 240) }, + { "forestgreen", NSVG_RGB( 34, 139, 34) }, + { "fuchsia", NSVG_RGB(255, 0, 255) }, + { "gainsboro", NSVG_RGB(220, 220, 220) }, + { "ghostwhite", NSVG_RGB(248, 248, 255) }, + { "gold", NSVG_RGB(255, 215, 0) }, + { "goldenrod", NSVG_RGB(218, 165, 32) }, + { "greenyellow", NSVG_RGB(173, 255, 47) }, + { "honeydew", NSVG_RGB(240, 255, 240) }, + { "hotpink", NSVG_RGB(255, 105, 180) }, + { "indianred", NSVG_RGB(205, 92, 92) }, + { "indigo", NSVG_RGB( 75, 0, 130) }, + { "ivory", NSVG_RGB(255, 255, 240) }, + { "khaki", NSVG_RGB(240, 230, 140) }, + { "lavender", NSVG_RGB(230, 230, 250) }, + { "lavenderblush", NSVG_RGB(255, 240, 245) }, + { "lawngreen", NSVG_RGB(124, 252, 0) }, + { "lemonchiffon", NSVG_RGB(255, 250, 205) }, + { "lightblue", NSVG_RGB(173, 216, 230) }, + { "lightcoral", NSVG_RGB(240, 128, 128) }, + { "lightcyan", NSVG_RGB(224, 255, 255) }, + { "lightgoldenrodyellow", NSVG_RGB(250, 250, 210) }, + { "lightgray", NSVG_RGB(211, 211, 211) }, + { "lightgreen", NSVG_RGB(144, 238, 144) }, + { "lightgrey", NSVG_RGB(211, 211, 211) }, + { "lightpink", NSVG_RGB(255, 182, 193) }, + { "lightsalmon", NSVG_RGB(255, 160, 122) }, + { "lightseagreen", NSVG_RGB( 32, 178, 170) }, + { "lightskyblue", NSVG_RGB(135, 206, 250) }, + { "lightslategray", NSVG_RGB(119, 136, 153) }, + { "lightslategrey", NSVG_RGB(119, 136, 153) }, + { "lightsteelblue", NSVG_RGB(176, 196, 222) }, + { "lightyellow", NSVG_RGB(255, 255, 224) }, + { "lime", NSVG_RGB( 0, 255, 0) }, + { "limegreen", NSVG_RGB( 50, 205, 50) }, + { "linen", NSVG_RGB(250, 240, 230) }, + { "maroon", NSVG_RGB(128, 0, 0) }, + { "mediumaquamarine", NSVG_RGB(102, 205, 170) }, + { "mediumblue", NSVG_RGB( 0, 0, 205) }, + { "mediumorchid", NSVG_RGB(186, 85, 211) }, + { "mediumpurple", NSVG_RGB(147, 112, 219) }, + { "mediumseagreen", NSVG_RGB( 60, 179, 113) }, + { "mediumslateblue", NSVG_RGB(123, 104, 238) }, + { "mediumspringgreen", NSVG_RGB( 0, 250, 154) }, + { "mediumturquoise", NSVG_RGB( 72, 209, 204) }, + { "mediumvioletred", NSVG_RGB(199, 21, 133) }, + { "midnightblue", NSVG_RGB( 25, 25, 112) }, + { "mintcream", NSVG_RGB(245, 255, 250) }, + { "mistyrose", NSVG_RGB(255, 228, 225) }, + { "moccasin", NSVG_RGB(255, 228, 181) }, + { "navajowhite", NSVG_RGB(255, 222, 173) }, + { "navy", NSVG_RGB( 0, 0, 128) }, + { "oldlace", NSVG_RGB(253, 245, 230) }, + { "olive", NSVG_RGB(128, 128, 0) }, + { "olivedrab", NSVG_RGB(107, 142, 35) }, + { "orange", NSVG_RGB(255, 165, 0) }, + { "orangered", NSVG_RGB(255, 69, 0) }, + { "orchid", NSVG_RGB(218, 112, 214) }, + { "palegoldenrod", NSVG_RGB(238, 232, 170) }, + { "palegreen", NSVG_RGB(152, 251, 152) }, + { "paleturquoise", NSVG_RGB(175, 238, 238) }, + { "palevioletred", NSVG_RGB(219, 112, 147) }, + { "papayawhip", NSVG_RGB(255, 239, 213) }, + { "peachpuff", NSVG_RGB(255, 218, 185) }, + { "peru", NSVG_RGB(205, 133, 63) }, + { "pink", NSVG_RGB(255, 192, 203) }, + { "plum", NSVG_RGB(221, 160, 221) }, + { "powderblue", NSVG_RGB(176, 224, 230) }, + { "purple", NSVG_RGB(128, 0, 128) }, + { "rosybrown", NSVG_RGB(188, 143, 143) }, + { "royalblue", NSVG_RGB( 65, 105, 225) }, + { "saddlebrown", NSVG_RGB(139, 69, 19) }, + { "salmon", NSVG_RGB(250, 128, 114) }, + { "sandybrown", NSVG_RGB(244, 164, 96) }, + { "seagreen", NSVG_RGB( 46, 139, 87) }, + { "seashell", NSVG_RGB(255, 245, 238) }, + { "sienna", NSVG_RGB(160, 82, 45) }, + { "silver", NSVG_RGB(192, 192, 192) }, + { "skyblue", NSVG_RGB(135, 206, 235) }, + { "slateblue", NSVG_RGB(106, 90, 205) }, + { "slategray", NSVG_RGB(112, 128, 144) }, + { "slategrey", NSVG_RGB(112, 128, 144) }, + { "snow", NSVG_RGB(255, 250, 250) }, + { "springgreen", NSVG_RGB( 0, 255, 127) }, + { "steelblue", NSVG_RGB( 70, 130, 180) }, + { "tan", NSVG_RGB(210, 180, 140) }, + { "teal", NSVG_RGB( 0, 128, 128) }, + { "thistle", NSVG_RGB(216, 191, 216) }, + { "tomato", NSVG_RGB(255, 99, 71) }, + { "turquoise", NSVG_RGB( 64, 224, 208) }, + { "violet", NSVG_RGB(238, 130, 238) }, + { "wheat", NSVG_RGB(245, 222, 179) }, + { "whitesmoke", NSVG_RGB(245, 245, 245) }, + { "yellowgreen", NSVG_RGB(154, 205, 50) }, +#endif +}; + +static unsigned int nsvg__parseColorName(const char* str) +{ + int i, ncolors = sizeof(nsvg__colors) / sizeof(NSVGNamedColor); + + for (i = 0; i < ncolors; i++) { + if (strcmp(nsvg__colors[i].name, str) == 0) { + return nsvg__colors[i].color; + } + } + + return NSVG_RGB(128, 128, 128); +} + +static unsigned int nsvg__parseColor(const char* str) +{ + size_t len = 0; + while(*str == ' ') ++str; + len = strlen(str); + if (len >= 1 && *str == '#') + return nsvg__parseColorHex(str); + else if (len >= 4 && str[0] == 'r' && str[1] == 'g' && str[2] == 'b' && str[3] == '(') + return nsvg__parseColorRGB(str); + return nsvg__parseColorName(str); +} + +static float nsvg__parseOpacity(const char* str) +{ + float val = nsvg__atof(str); + if (val < 0.0f) val = 0.0f; + if (val > 1.0f) val = 1.0f; + return val; +} + +static float nsvg__parseMiterLimit(const char* str) +{ + float val = nsvg__atof(str); + if (val < 0.0f) val = 0.0f; + return val; +} + +static int nsvg__parseUnits(const char* units) +{ + if (units[0] == 'p' && units[1] == 'x') + return NSVG_UNITS_PX; + else if (units[0] == 'p' && units[1] == 't') + return NSVG_UNITS_PT; + else if (units[0] == 'p' && units[1] == 'c') + return NSVG_UNITS_PC; + else if (units[0] == 'm' && units[1] == 'm') + return NSVG_UNITS_MM; + else if (units[0] == 'c' && units[1] == 'm') + return NSVG_UNITS_CM; + else if (units[0] == 'i' && units[1] == 'n') + return NSVG_UNITS_IN; + else if (units[0] == '%') + return NSVG_UNITS_PERCENT; + else if (units[0] == 'e' && units[1] == 'm') + return NSVG_UNITS_EM; + else if (units[0] == 'e' && units[1] == 'x') + return NSVG_UNITS_EX; + return NSVG_UNITS_USER; +} + +static int nsvg__isCoordinate(const char* s) +{ + // optional sign + if (*s == '-' || *s == '+') + s++; + // must have at least one digit, or start by a dot + return (nsvg__isdigit(*s) || *s == '.'); +} + +static NSVGcoordinate nsvg__parseCoordinateRaw(const char* str) +{ + NSVGcoordinate coord = {0, NSVG_UNITS_USER}; + char buf[64]; + coord.units = nsvg__parseUnits(nsvg__parseNumber(str, buf, 64)); + coord.value = nsvg__atof(buf); + return coord; +} + +static NSVGcoordinate nsvg__coord(float v, int units) +{ + NSVGcoordinate coord = {v, units}; + return coord; +} + +static float nsvg__parseCoordinate(NSVGparser* p, const char* str, float orig, float length) +{ + NSVGcoordinate coord = nsvg__parseCoordinateRaw(str); + return nsvg__convertToPixels(p, coord, orig, length); +} + +static int nsvg__parseTransformArgs(const char* str, float* args, int maxNa, int* na) +{ + const char* end; + const char* ptr; + char it[64]; + + *na = 0; + ptr = str; + while (*ptr && *ptr != '(') ++ptr; + if (*ptr == 0) + return 1; + end = ptr; + while (*end && *end != ')') ++end; + if (*end == 0) + return 1; + + while (ptr < end) { + if (*ptr == '-' || *ptr == '+' || *ptr == '.' || nsvg__isdigit(*ptr)) { + if (*na >= maxNa) return 0; + ptr = nsvg__parseNumber(ptr, it, 64); + args[(*na)++] = (float)nsvg__atof(it); + } else { + ++ptr; + } + } + return (int)(end - str); +} + + +static int nsvg__parseMatrix(float* xform, const char* str) +{ + float t[6]; + int na = 0; + int len = nsvg__parseTransformArgs(str, t, 6, &na); + if (na != 6) return len; + memcpy(xform, t, sizeof(float)*6); + return len; +} + +static int nsvg__parseTranslate(float* xform, const char* str) +{ + float args[2]; + float t[6]; + int na = 0; + int len = nsvg__parseTransformArgs(str, args, 2, &na); + if (na == 1) args[1] = 0.0; + + nsvg__xformSetTranslation(t, args[0], args[1]); + memcpy(xform, t, sizeof(float)*6); + return len; +} + +static int nsvg__parseScale(float* xform, const char* str) +{ + float args[2]; + int na = 0; + float t[6]; + int len = nsvg__parseTransformArgs(str, args, 2, &na); + if (na == 1) args[1] = args[0]; + nsvg__xformSetScale(t, args[0], args[1]); + memcpy(xform, t, sizeof(float)*6); + return len; +} + +static int nsvg__parseSkewX(float* xform, const char* str) +{ + float args[1]; + int na = 0; + float t[6]; + int len = nsvg__parseTransformArgs(str, args, 1, &na); + nsvg__xformSetSkewX(t, args[0]/180.0f*NSVG_PI); + memcpy(xform, t, sizeof(float)*6); + return len; +} + +static int nsvg__parseSkewY(float* xform, const char* str) +{ + float args[1]; + int na = 0; + float t[6]; + int len = nsvg__parseTransformArgs(str, args, 1, &na); + nsvg__xformSetSkewY(t, args[0]/180.0f*NSVG_PI); + memcpy(xform, t, sizeof(float)*6); + return len; +} + +static int nsvg__parseRotate(float* xform, const char* str) +{ + float args[3]; + int na = 0; + float m[6]; + float t[6]; + int len = nsvg__parseTransformArgs(str, args, 3, &na); + if (na == 1) + args[1] = args[2] = 0.0f; + nsvg__xformIdentity(m); + + if (na > 1) { + nsvg__xformSetTranslation(t, -args[1], -args[2]); + nsvg__xformMultiply(m, t); + } + + nsvg__xformSetRotation(t, args[0]/180.0f*NSVG_PI); + nsvg__xformMultiply(m, t); + + if (na > 1) { + nsvg__xformSetTranslation(t, args[1], args[2]); + nsvg__xformMultiply(m, t); + } + + memcpy(xform, m, sizeof(float)*6); + + return len; +} + +static void nsvg__parseTransform(float* xform, const char* str) +{ + float t[6]; + int len; + nsvg__xformIdentity(xform); + while (*str) + { + if (strncmp(str, "matrix", 6) == 0) + len = nsvg__parseMatrix(t, str); + else if (strncmp(str, "translate", 9) == 0) + len = nsvg__parseTranslate(t, str); + else if (strncmp(str, "scale", 5) == 0) + len = nsvg__parseScale(t, str); + else if (strncmp(str, "rotate", 6) == 0) + len = nsvg__parseRotate(t, str); + else if (strncmp(str, "skewX", 5) == 0) + len = nsvg__parseSkewX(t, str); + else if (strncmp(str, "skewY", 5) == 0) + len = nsvg__parseSkewY(t, str); + else{ + ++str; + continue; + } + if (len != 0) { + str += len; + } else { + ++str; + continue; + } + + nsvg__xformPremultiply(xform, t); + } +} + +static void nsvg__parseUrl(char* id, const char* str) +{ + int i = 0; + str += 4; // "url("; + if (*str && *str == '#') + str++; + while (i < 63 && *str && *str != ')') { + id[i] = *str++; + i++; + } + id[i] = '\0'; +} + +static char nsvg__parseLineCap(const char* str) +{ + if (strcmp(str, "butt") == 0) + return NSVG_CAP_BUTT; + else if (strcmp(str, "round") == 0) + return NSVG_CAP_ROUND; + else if (strcmp(str, "square") == 0) + return NSVG_CAP_SQUARE; + // TODO: handle inherit. + return NSVG_CAP_BUTT; +} + +static char nsvg__parseLineJoin(const char* str) +{ + if (strcmp(str, "miter") == 0) + return NSVG_JOIN_MITER; + else if (strcmp(str, "round") == 0) + return NSVG_JOIN_ROUND; + else if (strcmp(str, "bevel") == 0) + return NSVG_JOIN_BEVEL; + // TODO: handle inherit. + return NSVG_JOIN_MITER; +} + +static char nsvg__parseFillRule(const char* str) +{ + if (strcmp(str, "nonzero") == 0) + return NSVG_FILLRULE_NONZERO; + else if (strcmp(str, "evenodd") == 0) + return NSVG_FILLRULE_EVENODD; + // TODO: handle inherit. + return NSVG_FILLRULE_NONZERO; +} + +static const char* nsvg__getNextDashItem(const char* s, char* it) +{ + int n = 0; + it[0] = '\0'; + // Skip white spaces and commas + while (*s && (nsvg__isspace(*s) || *s == ',')) s++; + // Advance until whitespace, comma or end. + while (*s && (!nsvg__isspace(*s) && *s != ',')) { + if (n < 63) + it[n++] = *s; + s++; + } + it[n++] = '\0'; + return s; +} + +static int nsvg__parseStrokeDashArray(NSVGparser* p, const char* str, float* strokeDashArray) +{ + char item[64]; + int count = 0, i; + float sum = 0.0f; + + // Handle "none" + if (str[0] == 'n') + return 0; + + // Parse dashes + while (*str) { + str = nsvg__getNextDashItem(str, item); + if (!*item) break; + if (count < NSVG_MAX_DASHES) + strokeDashArray[count++] = fabsf(nsvg__parseCoordinate(p, item, 0.0f, nsvg__actualLength(p))); + } + + for (i = 0; i < count; i++) + sum += strokeDashArray[i]; + if (sum <= 1e-6f) + count = 0; + + return count; +} + +static void nsvg__parseStyle(NSVGparser* p, const char* str); + +static int nsvg__parseAttr(NSVGparser* p, const char* name, const char* value) +{ + float xform[6]; + NSVGattrib* attr = nsvg__getAttr(p); + if (!attr) return 0; + + if (strcmp(name, "style") == 0) { + nsvg__parseStyle(p, value); + } else if (strcmp(name, "display") == 0) { + if (strcmp(value, "none") == 0) + attr->visible = 0; + // Don't reset ->visible on display:inline, one display:none hides the whole subtree + + } else if (strcmp(name, "fill") == 0) { + if (strcmp(value, "none") == 0) { + attr->hasFill = 0; + } else if (strncmp(value, "url(", 4) == 0) { + attr->hasFill = 2; + nsvg__parseUrl(attr->fillGradient, value); + } else { + attr->hasFill = 1; + attr->fillColor = nsvg__parseColor(value); + } + } else if (strcmp(name, "opacity") == 0) { + attr->opacity = nsvg__parseOpacity(value); + } else if (strcmp(name, "fill-opacity") == 0) { + attr->fillOpacity = nsvg__parseOpacity(value); + } else if (strcmp(name, "stroke") == 0) { + if (strcmp(value, "none") == 0) { + attr->hasStroke = 0; + } else if (strncmp(value, "url(", 4) == 0) { + attr->hasStroke = 2; + nsvg__parseUrl(attr->strokeGradient, value); + } else { + attr->hasStroke = 1; + attr->strokeColor = nsvg__parseColor(value); + } + } else if (strcmp(name, "stroke-width") == 0) { + attr->strokeWidth = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); + } else if (strcmp(name, "stroke-dasharray") == 0) { + attr->strokeDashCount = nsvg__parseStrokeDashArray(p, value, attr->strokeDashArray); + } else if (strcmp(name, "stroke-dashoffset") == 0) { + attr->strokeDashOffset = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); + } else if (strcmp(name, "stroke-opacity") == 0) { + attr->strokeOpacity = nsvg__parseOpacity(value); + } else if (strcmp(name, "stroke-linecap") == 0) { + attr->strokeLineCap = nsvg__parseLineCap(value); + } else if (strcmp(name, "stroke-linejoin") == 0) { + attr->strokeLineJoin = nsvg__parseLineJoin(value); + } else if (strcmp(name, "stroke-miterlimit") == 0) { + attr->miterLimit = nsvg__parseMiterLimit(value); + } else if (strcmp(name, "fill-rule") == 0) { + attr->fillRule = nsvg__parseFillRule(value); + } else if (strcmp(name, "font-size") == 0) { + attr->fontSize = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); + } else if (strcmp(name, "transform") == 0) { + nsvg__parseTransform(xform, value); + nsvg__xformPremultiply(attr->xform, xform); + } else if (strcmp(name, "stop-color") == 0) { + attr->stopColor = nsvg__parseColor(value); + } else if (strcmp(name, "stop-opacity") == 0) { + attr->stopOpacity = nsvg__parseOpacity(value); + } else if (strcmp(name, "offset") == 0) { + attr->stopOffset = nsvg__parseCoordinate(p, value, 0.0f, 1.0f); + } else if (strcmp(name, "id") == 0) { + strncpy(attr->id, value, 63); + attr->id[63] = '\0'; + } else { + return 0; + } + return 1; +} + +static int nsvg__parseNameValue(NSVGparser* p, const char* start, const char* end) +{ + const char* str; + const char* val; + char name[512]; + char value[512]; + int n; + + str = start; + while (str < end && *str != ':') ++str; + + val = str; + + // Right Trim + while (str > start && (*str == ':' || nsvg__isspace(*str))) --str; + ++str; + + n = (int)(str - start); + if (n > 511) n = 511; + if (n) memcpy(name, start, n); + name[n] = 0; + + while (val < end && (*val == ':' || nsvg__isspace(*val))) ++val; + + n = (int)(end - val); + if (n > 511) n = 511; + if (n) memcpy(value, val, n); + value[n] = 0; + + return nsvg__parseAttr(p, name, value); +} + +static void nsvg__parseStyle(NSVGparser* p, const char* str) +{ + const char* start; + const char* end; + + while (*str) { + // Left Trim + while(*str && nsvg__isspace(*str)) ++str; + start = str; + while(*str && *str != ';') ++str; + end = str; + + // Right Trim + while (end > start && (*end == ';' || nsvg__isspace(*end))) --end; + ++end; + + nsvg__parseNameValue(p, start, end); + if (*str) ++str; + } +} + +static void nsvg__parseAttribs(NSVGparser* p, const char** attr) +{ + int i; + for (i = 0; attr[i]; i += 2) + { + if (strcmp(attr[i], "style") == 0) + nsvg__parseStyle(p, attr[i + 1]); + else + nsvg__parseAttr(p, attr[i], attr[i + 1]); + } +} + +static int nsvg__getArgsPerElement(char cmd) +{ + switch (cmd) { + case 'v': + case 'V': + case 'h': + case 'H': + return 1; + case 'm': + case 'M': + case 'l': + case 'L': + case 't': + case 'T': + return 2; + case 'q': + case 'Q': + case 's': + case 'S': + return 4; + case 'c': + case 'C': + return 6; + case 'a': + case 'A': + return 7; + case 'z': + case 'Z': + return 0; + } + return -1; +} + +static void nsvg__pathMoveTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) +{ + if (rel) { + *cpx += args[0]; + *cpy += args[1]; + } else { + *cpx = args[0]; + *cpy = args[1]; + } + nsvg__moveTo(p, *cpx, *cpy); +} + +static void nsvg__pathLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) +{ + if (rel) { + *cpx += args[0]; + *cpy += args[1]; + } else { + *cpx = args[0]; + *cpy = args[1]; + } + nsvg__lineTo(p, *cpx, *cpy); +} + +static void nsvg__pathHLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) +{ + if (rel) + *cpx += args[0]; + else + *cpx = args[0]; + nsvg__lineTo(p, *cpx, *cpy); +} + +static void nsvg__pathVLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) +{ + if (rel) + *cpy += args[0]; + else + *cpy = args[0]; + nsvg__lineTo(p, *cpx, *cpy); +} + +static void nsvg__pathCubicBezTo(NSVGparser* p, float* cpx, float* cpy, + float* cpx2, float* cpy2, float* args, int rel) +{ + float x2, y2, cx1, cy1, cx2, cy2; + + if (rel) { + cx1 = *cpx + args[0]; + cy1 = *cpy + args[1]; + cx2 = *cpx + args[2]; + cy2 = *cpy + args[3]; + x2 = *cpx + args[4]; + y2 = *cpy + args[5]; + } else { + cx1 = args[0]; + cy1 = args[1]; + cx2 = args[2]; + cy2 = args[3]; + x2 = args[4]; + y2 = args[5]; + } + + nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); + + *cpx2 = cx2; + *cpy2 = cy2; + *cpx = x2; + *cpy = y2; +} + +static void nsvg__pathCubicBezShortTo(NSVGparser* p, float* cpx, float* cpy, + float* cpx2, float* cpy2, float* args, int rel) +{ + float x1, y1, x2, y2, cx1, cy1, cx2, cy2; + + x1 = *cpx; + y1 = *cpy; + if (rel) { + cx2 = *cpx + args[0]; + cy2 = *cpy + args[1]; + x2 = *cpx + args[2]; + y2 = *cpy + args[3]; + } else { + cx2 = args[0]; + cy2 = args[1]; + x2 = args[2]; + y2 = args[3]; + } + + cx1 = 2*x1 - *cpx2; + cy1 = 2*y1 - *cpy2; + + nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); + + *cpx2 = cx2; + *cpy2 = cy2; + *cpx = x2; + *cpy = y2; +} + +static void nsvg__pathQuadBezTo(NSVGparser* p, float* cpx, float* cpy, + float* cpx2, float* cpy2, float* args, int rel) +{ + float x1, y1, x2, y2, cx, cy; + float cx1, cy1, cx2, cy2; + + x1 = *cpx; + y1 = *cpy; + if (rel) { + cx = *cpx + args[0]; + cy = *cpy + args[1]; + x2 = *cpx + args[2]; + y2 = *cpy + args[3]; + } else { + cx = args[0]; + cy = args[1]; + x2 = args[2]; + y2 = args[3]; + } + + // Convert to cubic bezier + cx1 = x1 + 2.0f/3.0f*(cx - x1); + cy1 = y1 + 2.0f/3.0f*(cy - y1); + cx2 = x2 + 2.0f/3.0f*(cx - x2); + cy2 = y2 + 2.0f/3.0f*(cy - y2); + + nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); + + *cpx2 = cx; + *cpy2 = cy; + *cpx = x2; + *cpy = y2; +} + +static void nsvg__pathQuadBezShortTo(NSVGparser* p, float* cpx, float* cpy, + float* cpx2, float* cpy2, float* args, int rel) +{ + float x1, y1, x2, y2, cx, cy; + float cx1, cy1, cx2, cy2; + + x1 = *cpx; + y1 = *cpy; + if (rel) { + x2 = *cpx + args[0]; + y2 = *cpy + args[1]; + } else { + x2 = args[0]; + y2 = args[1]; + } + + cx = 2*x1 - *cpx2; + cy = 2*y1 - *cpy2; + + // Convert to cubix bezier + cx1 = x1 + 2.0f/3.0f*(cx - x1); + cy1 = y1 + 2.0f/3.0f*(cy - y1); + cx2 = x2 + 2.0f/3.0f*(cx - x2); + cy2 = y2 + 2.0f/3.0f*(cy - y2); + + nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); + + *cpx2 = cx; + *cpy2 = cy; + *cpx = x2; + *cpy = y2; +} + +static float nsvg__sqr(float x) { return x*x; } +static float nsvg__vmag(float x, float y) { return sqrtf(x*x + y*y); } + +static float nsvg__vecrat(float ux, float uy, float vx, float vy) +{ + return (ux*vx + uy*vy) / (nsvg__vmag(ux,uy) * nsvg__vmag(vx,vy)); +} + +static float nsvg__vecang(float ux, float uy, float vx, float vy) +{ + float r = nsvg__vecrat(ux,uy, vx,vy); + if (r < -1.0f) r = -1.0f; + if (r > 1.0f) r = 1.0f; + return ((ux*vy < uy*vx) ? -1.0f : 1.0f) * acosf(r); +} + +static void nsvg__pathArcTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) +{ + // Ported from canvg (https://code.google.com/p/canvg/) + float rx, ry, rotx; + float x1, y1, x2, y2, cx, cy, dx, dy, d; + float x1p, y1p, cxp, cyp, s, sa, sb; + float ux, uy, vx, vy, a1, da; + float x, y, tanx, tany, a, px = 0, py = 0, ptanx = 0, ptany = 0, t[6]; + float sinrx, cosrx; + int fa, fs; + int i, ndivs; + float hda, kappa; + + rx = fabsf(args[0]); // y radius + ry = fabsf(args[1]); // x radius + rotx = args[2] / 180.0f * NSVG_PI; // x rotation angle + fa = fabsf(args[3]) > 1e-6 ? 1 : 0; // Large arc + fs = fabsf(args[4]) > 1e-6 ? 1 : 0; // Sweep direction + x1 = *cpx; // start point + y1 = *cpy; + if (rel) { // end point + x2 = *cpx + args[5]; + y2 = *cpy + args[6]; + } else { + x2 = args[5]; + y2 = args[6]; + } + + dx = x1 - x2; + dy = y1 - y2; + d = sqrtf(dx*dx + dy*dy); + if (d < 1e-6f || rx < 1e-6f || ry < 1e-6f) { + // The arc degenerates to a line + nsvg__lineTo(p, x2, y2); + *cpx = x2; + *cpy = y2; + return; + } + + sinrx = sinf(rotx); + cosrx = cosf(rotx); + + // Convert to center point parameterization. + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + // 1) Compute x1', y1' + x1p = cosrx * dx / 2.0f + sinrx * dy / 2.0f; + y1p = -sinrx * dx / 2.0f + cosrx * dy / 2.0f; + d = nsvg__sqr(x1p)/nsvg__sqr(rx) + nsvg__sqr(y1p)/nsvg__sqr(ry); + if (d > 1) { + d = sqrtf(d); + rx *= d; + ry *= d; + } + // 2) Compute cx', cy' + s = 0.0f; + sa = nsvg__sqr(rx)*nsvg__sqr(ry) - nsvg__sqr(rx)*nsvg__sqr(y1p) - nsvg__sqr(ry)*nsvg__sqr(x1p); + sb = nsvg__sqr(rx)*nsvg__sqr(y1p) + nsvg__sqr(ry)*nsvg__sqr(x1p); + if (sa < 0.0f) sa = 0.0f; + if (sb > 0.0f) + s = sqrtf(sa / sb); + if (fa == fs) + s = -s; + cxp = s * rx * y1p / ry; + cyp = s * -ry * x1p / rx; + + // 3) Compute cx,cy from cx',cy' + cx = (x1 + x2)/2.0f + cosrx*cxp - sinrx*cyp; + cy = (y1 + y2)/2.0f + sinrx*cxp + cosrx*cyp; + + // 4) Calculate theta1, and delta theta. + ux = (x1p - cxp) / rx; + uy = (y1p - cyp) / ry; + vx = (-x1p - cxp) / rx; + vy = (-y1p - cyp) / ry; + a1 = nsvg__vecang(1.0f,0.0f, ux,uy); // Initial angle + da = nsvg__vecang(ux,uy, vx,vy); // Delta angle + +// if (vecrat(ux,uy,vx,vy) <= -1.0f) da = NSVG_PI; +// if (vecrat(ux,uy,vx,vy) >= 1.0f) da = 0; + + if (fs == 0 && da > 0) + da -= 2 * NSVG_PI; + else if (fs == 1 && da < 0) + da += 2 * NSVG_PI; + + // Approximate the arc using cubic spline segments. + t[0] = cosrx; t[1] = sinrx; + t[2] = -sinrx; t[3] = cosrx; + t[4] = cx; t[5] = cy; + + // Split arc into max 90 degree segments. + // The loop assumes an iteration per end point (including start and end), this +1. + ndivs = (int)(fabsf(da) / (NSVG_PI*0.5f) + 1.0f); + hda = (da / (float)ndivs) / 2.0f; + // Fix for ticket #179: division by 0: avoid cotangens around 0 (infinite) + if ((hda < 1e-3f) && (hda > -1e-3f)) + hda *= 0.5f; + else + hda = (1.0f - cosf(hda)) / sinf(hda); + kappa = fabsf(4.0f / 3.0f * hda); + if (da < 0.0f) + kappa = -kappa; + + for (i = 0; i <= ndivs; i++) { + a = a1 + da * ((float)i/(float)ndivs); + dx = cosf(a); + dy = sinf(a); + nsvg__xformPoint(&x, &y, dx*rx, dy*ry, t); // position + nsvg__xformVec(&tanx, &tany, -dy*rx * kappa, dx*ry * kappa, t); // tangent + if (i > 0) + nsvg__cubicBezTo(p, px+ptanx,py+ptany, x-tanx, y-tany, x, y); + px = x; + py = y; + ptanx = tanx; + ptany = tany; + } + + *cpx = x2; + *cpy = y2; +} + +static void nsvg__parsePath(NSVGparser* p, const char** attr) +{ + const char* s = NULL; + char cmd = '\0'; + float args[10]; + int nargs; + int rargs = 0; + char initPoint; + float cpx, cpy, cpx2, cpy2; + const char* tmp[4]; + char closedFlag; + int i; + char item[64]; + + for (i = 0; attr[i]; i += 2) { + if (strcmp(attr[i], "d") == 0) { + s = attr[i + 1]; + } else { + tmp[0] = attr[i]; + tmp[1] = attr[i + 1]; + tmp[2] = 0; + tmp[3] = 0; + nsvg__parseAttribs(p, tmp); + } + } + + if (s) { + nsvg__resetPath(p); + cpx = 0; cpy = 0; + cpx2 = 0; cpy2 = 0; + initPoint = 0; + closedFlag = 0; + nargs = 0; + + while (*s) { + item[0] = '\0'; + if ((cmd == 'A' || cmd == 'a') && (nargs == 3 || nargs == 4)) + s = nsvg__getNextPathItemWhenArcFlag(s, item); + if (!*item) + s = nsvg__getNextPathItem(s, item); + if (!*item) break; + if (cmd != '\0' && nsvg__isCoordinate(item)) { + if (nargs < 10) + args[nargs++] = (float)nsvg__atof(item); + if (nargs >= rargs) { + switch (cmd) { + case 'm': + case 'M': + nsvg__pathMoveTo(p, &cpx, &cpy, args, cmd == 'm' ? 1 : 0); + // Moveto can be followed by multiple coordinate pairs, + // which should be treated as linetos. + cmd = (cmd == 'm') ? 'l' : 'L'; + rargs = nsvg__getArgsPerElement(cmd); + cpx2 = cpx; cpy2 = cpy; + initPoint = 1; + break; + case 'l': + case 'L': + nsvg__pathLineTo(p, &cpx, &cpy, args, cmd == 'l' ? 1 : 0); + cpx2 = cpx; cpy2 = cpy; + break; + case 'H': + case 'h': + nsvg__pathHLineTo(p, &cpx, &cpy, args, cmd == 'h' ? 1 : 0); + cpx2 = cpx; cpy2 = cpy; + break; + case 'V': + case 'v': + nsvg__pathVLineTo(p, &cpx, &cpy, args, cmd == 'v' ? 1 : 0); + cpx2 = cpx; cpy2 = cpy; + break; + case 'C': + case 'c': + nsvg__pathCubicBezTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 'c' ? 1 : 0); + break; + case 'S': + case 's': + nsvg__pathCubicBezShortTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 's' ? 1 : 0); + break; + case 'Q': + case 'q': + nsvg__pathQuadBezTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 'q' ? 1 : 0); + break; + case 'T': + case 't': + nsvg__pathQuadBezShortTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 't' ? 1 : 0); + break; + case 'A': + case 'a': + nsvg__pathArcTo(p, &cpx, &cpy, args, cmd == 'a' ? 1 : 0); + cpx2 = cpx; cpy2 = cpy; + break; + default: + if (nargs >= 2) { + cpx = args[nargs-2]; + cpy = args[nargs-1]; + cpx2 = cpx; cpy2 = cpy; + } + break; + } + nargs = 0; + } + } else { + cmd = item[0]; + if (cmd == 'M' || cmd == 'm') { + // Commit path. + if (p->npts > 0) + nsvg__addPath(p, closedFlag); + // Start new subpath. + nsvg__resetPath(p); + closedFlag = 0; + nargs = 0; + } else if (initPoint == 0) { + // Do not allow other commands until initial point has been set (moveTo called once). + cmd = '\0'; + } + if (cmd == 'Z' || cmd == 'z') { + closedFlag = 1; + // Commit path. + if (p->npts > 0) { + // Move current point to first point + cpx = p->pts[0]; + cpy = p->pts[1]; + cpx2 = cpx; cpy2 = cpy; + nsvg__addPath(p, closedFlag); + } + // Start new subpath. + nsvg__resetPath(p); + nsvg__moveTo(p, cpx, cpy); + closedFlag = 0; + nargs = 0; + } + rargs = nsvg__getArgsPerElement(cmd); + if (rargs == -1) { + // Command not recognized + cmd = '\0'; + rargs = 0; + } + } + } + // Commit path. + if (p->npts) + nsvg__addPath(p, closedFlag); + } + + nsvg__addShape(p); +} + +static void nsvg__parseRect(NSVGparser* p, const char** attr) +{ + float x = 0.0f; + float y = 0.0f; + float w = 0.0f; + float h = 0.0f; + float rx = -1.0f; // marks not set + float ry = -1.0f; + int i; + + for (i = 0; attr[i]; i += 2) { + if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { + if (strcmp(attr[i], "x") == 0) x = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); + if (strcmp(attr[i], "y") == 0) y = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); + if (strcmp(attr[i], "width") == 0) w = nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p)); + if (strcmp(attr[i], "height") == 0) h = nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p)); + if (strcmp(attr[i], "rx") == 0) rx = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p))); + if (strcmp(attr[i], "ry") == 0) ry = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p))); + } + } + + if (rx < 0.0f && ry > 0.0f) rx = ry; + if (ry < 0.0f && rx > 0.0f) ry = rx; + if (rx < 0.0f) rx = 0.0f; + if (ry < 0.0f) ry = 0.0f; + if (rx > w/2.0f) rx = w/2.0f; + if (ry > h/2.0f) ry = h/2.0f; + + if (w != 0.0f && h != 0.0f) { + nsvg__resetPath(p); + + if (rx < 0.00001f || ry < 0.0001f) { + nsvg__moveTo(p, x, y); + nsvg__lineTo(p, x+w, y); + nsvg__lineTo(p, x+w, y+h); + nsvg__lineTo(p, x, y+h); + } else { + // Rounded rectangle + nsvg__moveTo(p, x+rx, y); + nsvg__lineTo(p, x+w-rx, y); + nsvg__cubicBezTo(p, x+w-rx*(1-NSVG_KAPPA90), y, x+w, y+ry*(1-NSVG_KAPPA90), x+w, y+ry); + nsvg__lineTo(p, x+w, y+h-ry); + nsvg__cubicBezTo(p, x+w, y+h-ry*(1-NSVG_KAPPA90), x+w-rx*(1-NSVG_KAPPA90), y+h, x+w-rx, y+h); + nsvg__lineTo(p, x+rx, y+h); + nsvg__cubicBezTo(p, x+rx*(1-NSVG_KAPPA90), y+h, x, y+h-ry*(1-NSVG_KAPPA90), x, y+h-ry); + nsvg__lineTo(p, x, y+ry); + nsvg__cubicBezTo(p, x, y+ry*(1-NSVG_KAPPA90), x+rx*(1-NSVG_KAPPA90), y, x+rx, y); + } + + nsvg__addPath(p, 1); + + nsvg__addShape(p); + } +} + +static void nsvg__parseCircle(NSVGparser* p, const char** attr) +{ + float cx = 0.0f; + float cy = 0.0f; + float r = 0.0f; + int i; + + for (i = 0; attr[i]; i += 2) { + if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { + if (strcmp(attr[i], "cx") == 0) cx = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); + if (strcmp(attr[i], "cy") == 0) cy = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); + if (strcmp(attr[i], "r") == 0) r = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualLength(p))); + } + } + + if (r > 0.0f) { + nsvg__resetPath(p); + + nsvg__moveTo(p, cx+r, cy); + nsvg__cubicBezTo(p, cx+r, cy+r*NSVG_KAPPA90, cx+r*NSVG_KAPPA90, cy+r, cx, cy+r); + nsvg__cubicBezTo(p, cx-r*NSVG_KAPPA90, cy+r, cx-r, cy+r*NSVG_KAPPA90, cx-r, cy); + nsvg__cubicBezTo(p, cx-r, cy-r*NSVG_KAPPA90, cx-r*NSVG_KAPPA90, cy-r, cx, cy-r); + nsvg__cubicBezTo(p, cx+r*NSVG_KAPPA90, cy-r, cx+r, cy-r*NSVG_KAPPA90, cx+r, cy); + + nsvg__addPath(p, 1); + + nsvg__addShape(p); + } +} + +static void nsvg__parseEllipse(NSVGparser* p, const char** attr) +{ + float cx = 0.0f; + float cy = 0.0f; + float rx = 0.0f; + float ry = 0.0f; + int i; + + for (i = 0; attr[i]; i += 2) { + if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { + if (strcmp(attr[i], "cx") == 0) cx = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); + if (strcmp(attr[i], "cy") == 0) cy = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); + if (strcmp(attr[i], "rx") == 0) rx = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p))); + if (strcmp(attr[i], "ry") == 0) ry = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p))); + } + } + + if (rx > 0.0f && ry > 0.0f) { + + nsvg__resetPath(p); + + nsvg__moveTo(p, cx+rx, cy); + nsvg__cubicBezTo(p, cx+rx, cy+ry*NSVG_KAPPA90, cx+rx*NSVG_KAPPA90, cy+ry, cx, cy+ry); + nsvg__cubicBezTo(p, cx-rx*NSVG_KAPPA90, cy+ry, cx-rx, cy+ry*NSVG_KAPPA90, cx-rx, cy); + nsvg__cubicBezTo(p, cx-rx, cy-ry*NSVG_KAPPA90, cx-rx*NSVG_KAPPA90, cy-ry, cx, cy-ry); + nsvg__cubicBezTo(p, cx+rx*NSVG_KAPPA90, cy-ry, cx+rx, cy-ry*NSVG_KAPPA90, cx+rx, cy); + + nsvg__addPath(p, 1); + + nsvg__addShape(p); + } +} + +static void nsvg__parseLine(NSVGparser* p, const char** attr) +{ + float x1 = 0.0; + float y1 = 0.0; + float x2 = 0.0; + float y2 = 0.0; + int i; + + for (i = 0; attr[i]; i += 2) { + if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { + if (strcmp(attr[i], "x1") == 0) x1 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); + if (strcmp(attr[i], "y1") == 0) y1 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); + if (strcmp(attr[i], "x2") == 0) x2 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); + if (strcmp(attr[i], "y2") == 0) y2 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); + } + } + + nsvg__resetPath(p); + + nsvg__moveTo(p, x1, y1); + nsvg__lineTo(p, x2, y2); + + nsvg__addPath(p, 0); + + nsvg__addShape(p); +} + +static void nsvg__parsePoly(NSVGparser* p, const char** attr, int closeFlag) +{ + int i; + const char* s; + float args[2]; + int nargs, npts = 0; + char item[64]; + + nsvg__resetPath(p); + + for (i = 0; attr[i]; i += 2) { + if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { + if (strcmp(attr[i], "points") == 0) { + s = attr[i + 1]; + nargs = 0; + while (*s) { + s = nsvg__getNextPathItem(s, item); + args[nargs++] = (float)nsvg__atof(item); + if (nargs >= 2) { + if (npts == 0) + nsvg__moveTo(p, args[0], args[1]); + else + nsvg__lineTo(p, args[0], args[1]); + nargs = 0; + npts++; + } + } + } + } + } + + nsvg__addPath(p, (char)closeFlag); + + nsvg__addShape(p); +} + +static void nsvg__parseSVG(NSVGparser* p, const char** attr) +{ + int i; + for (i = 0; attr[i]; i += 2) { + if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { + if (strcmp(attr[i], "width") == 0) { + p->image->width = nsvg__parseCoordinate(p, attr[i + 1], 0.0f, 0.0f); + } else if (strcmp(attr[i], "height") == 0) { + p->image->height = nsvg__parseCoordinate(p, attr[i + 1], 0.0f, 0.0f); + } else if (strcmp(attr[i], "viewBox") == 0) { + const char *s = attr[i + 1]; + char buf[64]; + s = nsvg__parseNumber(s, buf, 64); + p->viewMinx = nsvg__atof(buf); + while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; + if (!*s) return; + s = nsvg__parseNumber(s, buf, 64); + p->viewMiny = nsvg__atof(buf); + while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; + if (!*s) return; + s = nsvg__parseNumber(s, buf, 64); + p->viewWidth = nsvg__atof(buf); + while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; + if (!*s) return; + s = nsvg__parseNumber(s, buf, 64); + p->viewHeight = nsvg__atof(buf); + } else if (strcmp(attr[i], "preserveAspectRatio") == 0) { + if (strstr(attr[i + 1], "none") != 0) { + // No uniform scaling + p->alignType = NSVG_ALIGN_NONE; + } else { + // Parse X align + if (strstr(attr[i + 1], "xMin") != 0) + p->alignX = NSVG_ALIGN_MIN; + else if (strstr(attr[i + 1], "xMid") != 0) + p->alignX = NSVG_ALIGN_MID; + else if (strstr(attr[i + 1], "xMax") != 0) + p->alignX = NSVG_ALIGN_MAX; + // Parse X align + if (strstr(attr[i + 1], "yMin") != 0) + p->alignY = NSVG_ALIGN_MIN; + else if (strstr(attr[i + 1], "yMid") != 0) + p->alignY = NSVG_ALIGN_MID; + else if (strstr(attr[i + 1], "yMax") != 0) + p->alignY = NSVG_ALIGN_MAX; + // Parse meet/slice + p->alignType = NSVG_ALIGN_MEET; + if (strstr(attr[i + 1], "slice") != 0) + p->alignType = NSVG_ALIGN_SLICE; + } + } + } + } +} + +static void nsvg__parseGradient(NSVGparser* p, const char** attr, signed char type) +{ + int i; + NSVGgradientData* grad = (NSVGgradientData*)malloc(sizeof(NSVGgradientData)); + if (grad == NULL) return; + memset(grad, 0, sizeof(NSVGgradientData)); + grad->units = NSVG_OBJECT_SPACE; + grad->type = type; + if (grad->type == NSVG_PAINT_LINEAR_GRADIENT) { + grad->linear.x1 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); + grad->linear.y1 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); + grad->linear.x2 = nsvg__coord(100.0f, NSVG_UNITS_PERCENT); + grad->linear.y2 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); + } else if (grad->type == NSVG_PAINT_RADIAL_GRADIENT) { + grad->radial.cx = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); + grad->radial.cy = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); + grad->radial.r = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); + } + + nsvg__xformIdentity(grad->xform); + + for (i = 0; attr[i]; i += 2) { + if (strcmp(attr[i], "id") == 0) { + strncpy(grad->id, attr[i+1], 63); + grad->id[63] = '\0'; + } else if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { + if (strcmp(attr[i], "gradientUnits") == 0) { + if (strcmp(attr[i+1], "objectBoundingBox") == 0) + grad->units = NSVG_OBJECT_SPACE; + else + grad->units = NSVG_USER_SPACE; + } else if (strcmp(attr[i], "gradientTransform") == 0) { + nsvg__parseTransform(grad->xform, attr[i + 1]); + } else if (strcmp(attr[i], "cx") == 0) { + grad->radial.cx = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "cy") == 0) { + grad->radial.cy = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "r") == 0) { + grad->radial.r = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "fx") == 0) { + grad->radial.fx = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "fy") == 0) { + grad->radial.fy = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "x1") == 0) { + grad->linear.x1 = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "y1") == 0) { + grad->linear.y1 = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "x2") == 0) { + grad->linear.x2 = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "y2") == 0) { + grad->linear.y2 = nsvg__parseCoordinateRaw(attr[i + 1]); + } else if (strcmp(attr[i], "spreadMethod") == 0) { + if (strcmp(attr[i+1], "pad") == 0) + grad->spread = NSVG_SPREAD_PAD; + else if (strcmp(attr[i+1], "reflect") == 0) + grad->spread = NSVG_SPREAD_REFLECT; + else if (strcmp(attr[i+1], "repeat") == 0) + grad->spread = NSVG_SPREAD_REPEAT; + } else if (strcmp(attr[i], "xlink:href") == 0) { + const char *href = attr[i+1]; + strncpy(grad->ref, href+1, 62); + grad->ref[62] = '\0'; + } + } + } + + grad->next = p->gradients; + p->gradients = grad; +} + +static void nsvg__parseGradientStop(NSVGparser* p, const char** attr) +{ + NSVGattrib* curAttr = nsvg__getAttr(p); + NSVGgradientData* grad; + NSVGgradientStop* stop; + int i, idx; + + curAttr->stopOffset = 0; + curAttr->stopColor = 0; + curAttr->stopOpacity = 1.0f; + + for (i = 0; attr[i]; i += 2) { + nsvg__parseAttr(p, attr[i], attr[i + 1]); + } + + // Add stop to the last gradient. + grad = p->gradients; + if (grad == NULL) return; + + grad->nstops++; + grad->stops = (NSVGgradientStop*)realloc(grad->stops, sizeof(NSVGgradientStop)*grad->nstops); + if (grad->stops == NULL) return; + + // Insert + idx = grad->nstops-1; + for (i = 0; i < grad->nstops-1; i++) { + if (curAttr->stopOffset < grad->stops[i].offset) { + idx = i; + break; + } + } + if (idx != grad->nstops-1) { + for (i = grad->nstops-1; i > idx; i--) + grad->stops[i] = grad->stops[i-1]; + } + + stop = &grad->stops[idx]; + stop->color = curAttr->stopColor; + stop->color |= (unsigned int)(curAttr->stopOpacity*255) << 24; + stop->offset = curAttr->stopOffset; +} + +static void nsvg__startElement(void* ud, const char* el, const char** attr) +{ + NSVGparser* p = (NSVGparser*)ud; + + if (p->defsFlag) { + // Skip everything but gradients in defs + if (strcmp(el, "linearGradient") == 0) { + nsvg__parseGradient(p, attr, NSVG_PAINT_LINEAR_GRADIENT); + } else if (strcmp(el, "radialGradient") == 0) { + nsvg__parseGradient(p, attr, NSVG_PAINT_RADIAL_GRADIENT); + } else if (strcmp(el, "stop") == 0) { + nsvg__parseGradientStop(p, attr); + } + return; + } + + if (strcmp(el, "g") == 0) { + nsvg__pushAttr(p); + nsvg__parseAttribs(p, attr); + } else if (strcmp(el, "path") == 0) { + if (p->pathFlag) // Do not allow nested paths. + return; + nsvg__pushAttr(p); + nsvg__parsePath(p, attr); + nsvg__popAttr(p); + } else if (strcmp(el, "rect") == 0) { + nsvg__pushAttr(p); + nsvg__parseRect(p, attr); + nsvg__popAttr(p); + } else if (strcmp(el, "circle") == 0) { + nsvg__pushAttr(p); + nsvg__parseCircle(p, attr); + nsvg__popAttr(p); + } else if (strcmp(el, "ellipse") == 0) { + nsvg__pushAttr(p); + nsvg__parseEllipse(p, attr); + nsvg__popAttr(p); + } else if (strcmp(el, "line") == 0) { + nsvg__pushAttr(p); + nsvg__parseLine(p, attr); + nsvg__popAttr(p); + } else if (strcmp(el, "polyline") == 0) { + nsvg__pushAttr(p); + nsvg__parsePoly(p, attr, 0); + nsvg__popAttr(p); + } else if (strcmp(el, "polygon") == 0) { + nsvg__pushAttr(p); + nsvg__parsePoly(p, attr, 1); + nsvg__popAttr(p); + } else if (strcmp(el, "linearGradient") == 0) { + nsvg__parseGradient(p, attr, NSVG_PAINT_LINEAR_GRADIENT); + } else if (strcmp(el, "radialGradient") == 0) { + nsvg__parseGradient(p, attr, NSVG_PAINT_RADIAL_GRADIENT); + } else if (strcmp(el, "stop") == 0) { + nsvg__parseGradientStop(p, attr); + } else if (strcmp(el, "defs") == 0) { + p->defsFlag = 1; + } else if (strcmp(el, "svg") == 0) { + nsvg__parseSVG(p, attr); + } +} + +static void nsvg__endElement(void* ud, const char* el) +{ + NSVGparser* p = (NSVGparser*)ud; + + if (strcmp(el, "g") == 0) { + nsvg__popAttr(p); + } else if (strcmp(el, "path") == 0) { + p->pathFlag = 0; + } else if (strcmp(el, "defs") == 0) { + p->defsFlag = 0; + } +} + +static void nsvg__content(void* ud, const char* s) +{ + NSVG_NOTUSED(ud); + NSVG_NOTUSED(s); + // empty +} + +static void nsvg__imageBounds(NSVGparser* p, float* bounds) +{ + NSVGshape* shape; + shape = p->image->shapes; + if (shape == NULL) { + bounds[0] = bounds[1] = bounds[2] = bounds[3] = 0.0; + return; + } + bounds[0] = shape->bounds[0]; + bounds[1] = shape->bounds[1]; + bounds[2] = shape->bounds[2]; + bounds[3] = shape->bounds[3]; + for (shape = shape->next; shape != NULL; shape = shape->next) { + bounds[0] = nsvg__minf(bounds[0], shape->bounds[0]); + bounds[1] = nsvg__minf(bounds[1], shape->bounds[1]); + bounds[2] = nsvg__maxf(bounds[2], shape->bounds[2]); + bounds[3] = nsvg__maxf(bounds[3], shape->bounds[3]); + } +} + +static float nsvg__viewAlign(float content, float container, int type) +{ + if (type == NSVG_ALIGN_MIN) + return 0; + else if (type == NSVG_ALIGN_MAX) + return container - content; + // mid + return (container - content) * 0.5f; +} + +static void nsvg__scaleGradient(NSVGgradient* grad, float tx, float ty, float sx, float sy) +{ + float t[6]; + nsvg__xformSetTranslation(t, tx, ty); + nsvg__xformMultiply (grad->xform, t); + + nsvg__xformSetScale(t, sx, sy); + nsvg__xformMultiply (grad->xform, t); +} + +static void nsvg__scaleToViewbox(NSVGparser* p, const char* units) +{ + NSVGshape* shape; + NSVGpath* path; + float tx, ty, sx, sy, us, bounds[4], t[6], avgs; + int i; + float* pt; + + // Guess image size if not set completely. + nsvg__imageBounds(p, bounds); + + if (p->viewWidth == 0) { + if (p->image->width > 0) { + p->viewWidth = p->image->width; + } else { + p->viewMinx = bounds[0]; + p->viewWidth = bounds[2] - bounds[0]; + } + } + if (p->viewHeight == 0) { + if (p->image->height > 0) { + p->viewHeight = p->image->height; + } else { + p->viewMiny = bounds[1]; + p->viewHeight = bounds[3] - bounds[1]; + } + } + if (p->image->width == 0) + p->image->width = p->viewWidth; + if (p->image->height == 0) + p->image->height = p->viewHeight; + + tx = -p->viewMinx; + ty = -p->viewMiny; + sx = p->viewWidth > 0 ? p->image->width / p->viewWidth : 0; + sy = p->viewHeight > 0 ? p->image->height / p->viewHeight : 0; + // Unit scaling + us = 1.0f / nsvg__convertToPixels(p, nsvg__coord(1.0f, nsvg__parseUnits(units)), 0.0f, 1.0f); + + // Fix aspect ratio + if (p->alignType == NSVG_ALIGN_MEET) { + // fit whole image into viewbox + sx = sy = nsvg__minf(sx, sy); + tx += nsvg__viewAlign(p->viewWidth*sx, p->image->width, p->alignX) / sx; + ty += nsvg__viewAlign(p->viewHeight*sy, p->image->height, p->alignY) / sy; + } else if (p->alignType == NSVG_ALIGN_SLICE) { + // fill whole viewbox with image + sx = sy = nsvg__maxf(sx, sy); + tx += nsvg__viewAlign(p->viewWidth*sx, p->image->width, p->alignX) / sx; + ty += nsvg__viewAlign(p->viewHeight*sy, p->image->height, p->alignY) / sy; + } + + // Transform + sx *= us; + sy *= us; + avgs = (sx+sy) / 2.0f; + for (shape = p->image->shapes; shape != NULL; shape = shape->next) { + shape->bounds[0] = (shape->bounds[0] + tx) * sx; + shape->bounds[1] = (shape->bounds[1] + ty) * sy; + shape->bounds[2] = (shape->bounds[2] + tx) * sx; + shape->bounds[3] = (shape->bounds[3] + ty) * sy; + for (path = shape->paths; path != NULL; path = path->next) { + path->bounds[0] = (path->bounds[0] + tx) * sx; + path->bounds[1] = (path->bounds[1] + ty) * sy; + path->bounds[2] = (path->bounds[2] + tx) * sx; + path->bounds[3] = (path->bounds[3] + ty) * sy; + for (i =0; i < path->npts; i++) { + pt = &path->pts[i*2]; + pt[0] = (pt[0] + tx) * sx; + pt[1] = (pt[1] + ty) * sy; + } + } + + if (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT || shape->fill.type == NSVG_PAINT_RADIAL_GRADIENT) { + nsvg__scaleGradient(shape->fill.gradient, tx,ty, sx,sy); + memcpy(t, shape->fill.gradient->xform, sizeof(float)*6); + nsvg__xformInverse(shape->fill.gradient->xform, t); + } + if (shape->stroke.type == NSVG_PAINT_LINEAR_GRADIENT || shape->stroke.type == NSVG_PAINT_RADIAL_GRADIENT) { + nsvg__scaleGradient(shape->stroke.gradient, tx,ty, sx,sy); + memcpy(t, shape->stroke.gradient->xform, sizeof(float)*6); + nsvg__xformInverse(shape->stroke.gradient->xform, t); + } + + shape->strokeWidth *= avgs; + shape->strokeDashOffset *= avgs; + for (i = 0; i < shape->strokeDashCount; i++) + shape->strokeDashArray[i] *= avgs; + } +} + +static void nsvg__createGradients(NSVGparser* p) +{ + NSVGshape* shape; + + for (shape = p->image->shapes; shape != NULL; shape = shape->next) { + if (shape->fill.type == NSVG_PAINT_UNDEF) { + if (shape->fillGradient[0] != '\0') { + float inv[6], localBounds[4]; + nsvg__xformInverse(inv, shape->xform); + nsvg__getLocalBounds(localBounds, shape, inv); + shape->fill.gradient = nsvg__createGradient(p, shape->fillGradient, localBounds, shape->xform, &shape->fill.type); + } + if (shape->fill.type == NSVG_PAINT_UNDEF) { + shape->fill.type = NSVG_PAINT_NONE; + } + } + if (shape->stroke.type == NSVG_PAINT_UNDEF) { + if (shape->strokeGradient[0] != '\0') { + float inv[6], localBounds[4]; + nsvg__xformInverse(inv, shape->xform); + nsvg__getLocalBounds(localBounds, shape, inv); + shape->stroke.gradient = nsvg__createGradient(p, shape->strokeGradient, localBounds, shape->xform, &shape->stroke.type); + } + if (shape->stroke.type == NSVG_PAINT_UNDEF) { + shape->stroke.type = NSVG_PAINT_NONE; + } + } + } +} + +NSVGimage* nsvgParse(char* input, const char* units, float dpi) +{ + NSVGparser* p; + NSVGimage* ret = 0; + + p = nsvg__createParser(); + if (p == NULL) { + return NULL; + } + p->dpi = dpi; + + nsvg__parseXML(input, nsvg__startElement, nsvg__endElement, nsvg__content, p); + + // Create gradients after all definitions have been parsed + nsvg__createGradients(p); + + // Scale to viewBox + nsvg__scaleToViewbox(p, units); + + ret = p->image; + p->image = NULL; + + nsvg__deleteParser(p); + + return ret; +} + +NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi) +{ + FILE* fp = NULL; + size_t size; + char* data = NULL; + NSVGimage* image = NULL; + + fp = fopen(filename, "rb"); + if (!fp) goto error; + fseek(fp, 0, SEEK_END); + size = ftell(fp); + fseek(fp, 0, SEEK_SET); + data = (char*)malloc(size+1); + if (data == NULL) goto error; + if (fread(data, 1, size, fp) != size) goto error; + data[size] = '\0'; // Must be null terminated. + fclose(fp); + image = nsvgParse(data, units, dpi); + free(data); + + return image; + +error: + if (fp) fclose(fp); + if (data) free(data); + if (image) nsvgDelete(image); + return NULL; +} + +NSVGpath* nsvgDuplicatePath(NSVGpath* p) +{ + NSVGpath* res = NULL; + + if (p == NULL) + return NULL; + + res = (NSVGpath*)malloc(sizeof(NSVGpath)); + if (res == NULL) goto error; + memset(res, 0, sizeof(NSVGpath)); + + res->pts = (float*)malloc(p->npts*2*sizeof(float)); + if (res->pts == NULL) goto error; + memcpy(res->pts, p->pts, p->npts * sizeof(float) * 2); + res->npts = p->npts; + + memcpy(res->bounds, p->bounds, sizeof(p->bounds)); + + res->closed = p->closed; + + return res; + +error: + if (res != NULL) { + free(res->pts); + free(res); + } + return NULL; +} + +void nsvgDelete(NSVGimage* image) +{ + NSVGshape *snext, *shape; + if (image == NULL) return; + shape = image->shapes; + while (shape != NULL) { + snext = shape->next; + nsvg__deletePaths(shape->paths); + nsvg__deletePaint(&shape->fill); + nsvg__deletePaint(&shape->stroke); + free(shape); + shape = snext; + } + free(image); +} + +#endif // NANOSVG_IMPLEMENTATION + +#endif // NANOSVG_H diff --git a/svg/nanosvgrast.h b/svg/nanosvgrast.h new file mode 100644 index 0000000..90d42e9 --- /dev/null +++ b/svg/nanosvgrast.h @@ -0,0 +1,1460 @@ +/* + * Copyright (c) 2013-14 Mikko Mononen memon@inside.org + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * The polygon rasterization is heavily based on stb_truetype rasterizer + * by Sean Barrett - http://nothings.org/ + * + */ + +#ifndef NANOSVGRAST_H +#define NANOSVGRAST_H + +#include "nanosvg.h" + +#ifndef NANOSVGRAST_CPLUSPLUS +#ifdef __cplusplus +extern "C" { +#endif +#endif + +typedef struct NSVGrasterizer NSVGrasterizer; + +/* Example Usage: + // Load SVG + NSVGimage* image; + image = nsvgParseFromFile("test.svg", "px", 96); + + // Create rasterizer (can be used to render multiple images). + struct NSVGrasterizer* rast = nsvgCreateRasterizer(); + // Allocate memory for image + unsigned char* img = malloc(w*h*4); + // Rasterize + nsvgRasterize(rast, image, 0,0,1, img, w, h, w*4); +*/ + +// Allocated rasterizer context. +NSVGrasterizer* nsvgCreateRasterizer(void); + +// Rasterizes SVG image, returns RGBA image (non-premultiplied alpha) +// r - pointer to rasterizer context +// image - pointer to image to rasterize +// tx,ty - image offset (applied after scaling) +// scale - image scale +// dst - pointer to destination image data, 4 bytes per pixel (RGBA) +// w - width of the image to render +// h - height of the image to render +// stride - number of bytes per scaleline in the destination buffer +void nsvgRasterize(NSVGrasterizer* r, + NSVGimage* image, float tx, float ty, float scale, + unsigned char* dst, int w, int h, int stride); + +// Deletes rasterizer context. +void nsvgDeleteRasterizer(NSVGrasterizer*); + + +#ifndef NANOSVGRAST_CPLUSPLUS +#ifdef __cplusplus +} +#endif +#endif + +#ifdef NANOSVGRAST_IMPLEMENTATION + +#include +#include +#include + +#define NSVG__SUBSAMPLES 5 +#define NSVG__FIXSHIFT 10 +#define NSVG__FIX (1 << NSVG__FIXSHIFT) +#define NSVG__FIXMASK (NSVG__FIX-1) +#define NSVG__MEMPAGE_SIZE 1024 + +typedef struct NSVGedge { + float x0,y0, x1,y1; + int dir; + struct NSVGedge* next; +} NSVGedge; + +typedef struct NSVGpoint { + float x, y; + float dx, dy; + float len; + float dmx, dmy; + unsigned char flags; +} NSVGpoint; + +typedef struct NSVGactiveEdge { + int x,dx; + float ey; + int dir; + struct NSVGactiveEdge *next; +} NSVGactiveEdge; + +typedef struct NSVGmemPage { + unsigned char mem[NSVG__MEMPAGE_SIZE]; + int size; + struct NSVGmemPage* next; +} NSVGmemPage; + +typedef struct NSVGcachedPaint { + signed char type; + char spread; + float xform[6]; + unsigned int colors[256]; +} NSVGcachedPaint; + +struct NSVGrasterizer +{ + float px, py; + + float tessTol; + float distTol; + + NSVGedge* edges; + int nedges; + int cedges; + + NSVGpoint* points; + int npoints; + int cpoints; + + NSVGpoint* points2; + int npoints2; + int cpoints2; + + NSVGactiveEdge* freelist; + NSVGmemPage* pages; + NSVGmemPage* curpage; + + unsigned char* scanline; + int cscanline; + + unsigned char* bitmap; + int width, height, stride; +}; + +NSVGrasterizer* nsvgCreateRasterizer(void) +{ + NSVGrasterizer* r = (NSVGrasterizer*)malloc(sizeof(NSVGrasterizer)); + if (r == NULL) goto error; + memset(r, 0, sizeof(NSVGrasterizer)); + + r->tessTol = 0.25f; + r->distTol = 0.01f; + + return r; + +error: + nsvgDeleteRasterizer(r); + return NULL; +} + +void nsvgDeleteRasterizer(NSVGrasterizer* r) +{ + NSVGmemPage* p; + + if (r == NULL) return; + + p = r->pages; + while (p != NULL) { + NSVGmemPage* next = p->next; + free(p); + p = next; + } + + if (r->edges) free(r->edges); + if (r->points) free(r->points); + if (r->points2) free(r->points2); + if (r->scanline) free(r->scanline); + + free(r); +} + +static NSVGmemPage* nsvg__nextPage(NSVGrasterizer* r, NSVGmemPage* cur) +{ + NSVGmemPage *newp; + + // If using existing chain, return the next page in chain + if (cur != NULL && cur->next != NULL) { + return cur->next; + } + + // Alloc new page + newp = (NSVGmemPage*)malloc(sizeof(NSVGmemPage)); + if (newp == NULL) return NULL; + memset(newp, 0, sizeof(NSVGmemPage)); + + // Add to linked list + if (cur != NULL) + cur->next = newp; + else + r->pages = newp; + + return newp; +} + +static void nsvg__resetPool(NSVGrasterizer* r) +{ + NSVGmemPage* p = r->pages; + while (p != NULL) { + p->size = 0; + p = p->next; + } + r->curpage = r->pages; +} + +static unsigned char* nsvg__alloc(NSVGrasterizer* r, int size) +{ + unsigned char* buf; + if (size > NSVG__MEMPAGE_SIZE) return NULL; + if (r->curpage == NULL || r->curpage->size+size > NSVG__MEMPAGE_SIZE) { + r->curpage = nsvg__nextPage(r, r->curpage); + } + buf = &r->curpage->mem[r->curpage->size]; + r->curpage->size += size; + return buf; +} + +static int nsvg__ptEquals(float x1, float y1, float x2, float y2, float tol) +{ + float dx = x2 - x1; + float dy = y2 - y1; + return dx*dx + dy*dy < tol*tol; +} + +static void nsvg__addPathPoint(NSVGrasterizer* r, float x, float y, int flags) +{ + NSVGpoint* pt; + + if (r->npoints > 0) { + pt = &r->points[r->npoints-1]; + if (nsvg__ptEquals(pt->x,pt->y, x,y, r->distTol)) { + pt->flags = (unsigned char)(pt->flags | flags); + return; + } + } + + if (r->npoints+1 > r->cpoints) { + r->cpoints = r->cpoints > 0 ? r->cpoints * 2 : 64; + r->points = (NSVGpoint*)realloc(r->points, sizeof(NSVGpoint) * r->cpoints); + if (r->points == NULL) return; + } + + pt = &r->points[r->npoints]; + pt->x = x; + pt->y = y; + pt->flags = (unsigned char)flags; + r->npoints++; +} + +static void nsvg__appendPathPoint(NSVGrasterizer* r, NSVGpoint pt) +{ + if (r->npoints+1 > r->cpoints) { + r->cpoints = r->cpoints > 0 ? r->cpoints * 2 : 64; + r->points = (NSVGpoint*)realloc(r->points, sizeof(NSVGpoint) * r->cpoints); + if (r->points == NULL) return; + } + r->points[r->npoints] = pt; + r->npoints++; +} + +static void nsvg__duplicatePoints(NSVGrasterizer* r) +{ + if (r->npoints > r->cpoints2) { + r->cpoints2 = r->npoints; + r->points2 = (NSVGpoint*)realloc(r->points2, sizeof(NSVGpoint) * r->cpoints2); + if (r->points2 == NULL) return; + } + + memcpy(r->points2, r->points, sizeof(NSVGpoint) * r->npoints); + r->npoints2 = r->npoints; +} + +static void nsvg__addEdge(NSVGrasterizer* r, float x0, float y0, float x1, float y1) +{ + NSVGedge* e; + + // Skip horizontal edges + if (y0 == y1) + return; + + if (r->nedges+1 > r->cedges) { + r->cedges = r->cedges > 0 ? r->cedges * 2 : 64; + r->edges = (NSVGedge*)realloc(r->edges, sizeof(NSVGedge) * r->cedges); + if (r->edges == NULL) return; + } + + e = &r->edges[r->nedges]; + r->nedges++; + + if (y0 < y1) { + e->x0 = x0; + e->y0 = y0; + e->x1 = x1; + e->y1 = y1; + e->dir = 1; + } else { + e->x0 = x1; + e->y0 = y1; + e->x1 = x0; + e->y1 = y0; + e->dir = -1; + } +} + +static float nsvg__normalize(float *x, float* y) +{ + float d = sqrtf((*x)*(*x) + (*y)*(*y)); + if (d > 1e-6f) { + float id = 1.0f / d; + *x *= id; + *y *= id; + } + return d; +} + +static float nsvg__absf(float x) { return x < 0 ? -x : x; } +static float nsvg__roundf(float x) { return (x >= 0) ? floorf(x + 0.5) : ceilf(x - 0.5); } + +static void nsvg__flattenCubicBez(NSVGrasterizer* r, + float x1, float y1, float x2, float y2, + float x3, float y3, float x4, float y4, + int level, int type) +{ + float x12,y12,x23,y23,x34,y34,x123,y123,x234,y234,x1234,y1234; + float dx,dy,d2,d3; + + if (level > 10) return; + + x12 = (x1+x2)*0.5f; + y12 = (y1+y2)*0.5f; + x23 = (x2+x3)*0.5f; + y23 = (y2+y3)*0.5f; + x34 = (x3+x4)*0.5f; + y34 = (y3+y4)*0.5f; + x123 = (x12+x23)*0.5f; + y123 = (y12+y23)*0.5f; + + dx = x4 - x1; + dy = y4 - y1; + d2 = nsvg__absf((x2 - x4) * dy - (y2 - y4) * dx); + d3 = nsvg__absf((x3 - x4) * dy - (y3 - y4) * dx); + + if ((d2 + d3)*(d2 + d3) < r->tessTol * (dx*dx + dy*dy)) { + nsvg__addPathPoint(r, x4, y4, type); + return; + } + + x234 = (x23+x34)*0.5f; + y234 = (y23+y34)*0.5f; + x1234 = (x123+x234)*0.5f; + y1234 = (y123+y234)*0.5f; + + nsvg__flattenCubicBez(r, x1,y1, x12,y12, x123,y123, x1234,y1234, level+1, 0); + nsvg__flattenCubicBez(r, x1234,y1234, x234,y234, x34,y34, x4,y4, level+1, type); +} + +static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float scale) +{ + int i, j; + NSVGpath* path; + + for (path = shape->paths; path != NULL; path = path->next) { + r->npoints = 0; + // Flatten path + nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); + for (i = 0; i < path->npts-1; i += 3) { + float* p = &path->pts[i*2]; + nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, 0); + } + // Close path + nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); + // Build edges + for (i = 0, j = r->npoints-1; i < r->npoints; j = i++) + nsvg__addEdge(r, r->points[j].x, r->points[j].y, r->points[i].x, r->points[i].y); + } +} + +enum NSVGpointFlags +{ + NSVG_PT_CORNER = 0x01, + NSVG_PT_BEVEL = 0x02, + NSVG_PT_LEFT = 0x04 +}; + +static void nsvg__initClosed(NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) +{ + float w = lineWidth * 0.5f; + float dx = p1->x - p0->x; + float dy = p1->y - p0->y; + float len = nsvg__normalize(&dx, &dy); + float px = p0->x + dx*len*0.5f, py = p0->y + dy*len*0.5f; + float dlx = dy, dly = -dx; + float lx = px - dlx*w, ly = py - dly*w; + float rx = px + dlx*w, ry = py + dly*w; + left->x = lx; left->y = ly; + right->x = rx; right->y = ry; +} + +static void nsvg__buttCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int connect) +{ + float w = lineWidth * 0.5f; + float px = p->x, py = p->y; + float dlx = dy, dly = -dx; + float lx = px - dlx*w, ly = py - dly*w; + float rx = px + dlx*w, ry = py + dly*w; + + nsvg__addEdge(r, lx, ly, rx, ry); + + if (connect) { + nsvg__addEdge(r, left->x, left->y, lx, ly); + nsvg__addEdge(r, rx, ry, right->x, right->y); + } + left->x = lx; left->y = ly; + right->x = rx; right->y = ry; +} + +static void nsvg__squareCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int connect) +{ + float w = lineWidth * 0.5f; + float px = p->x - dx*w, py = p->y - dy*w; + float dlx = dy, dly = -dx; + float lx = px - dlx*w, ly = py - dly*w; + float rx = px + dlx*w, ry = py + dly*w; + + nsvg__addEdge(r, lx, ly, rx, ry); + + if (connect) { + nsvg__addEdge(r, left->x, left->y, lx, ly); + nsvg__addEdge(r, rx, ry, right->x, right->y); + } + left->x = lx; left->y = ly; + right->x = rx; right->y = ry; +} + +#ifndef NSVG_PI +#define NSVG_PI (3.14159265358979323846264338327f) +#endif + +static void nsvg__roundCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int ncap, int connect) +{ + int i; + float w = lineWidth * 0.5f; + float px = p->x, py = p->y; + float dlx = dy, dly = -dx; + float lx = 0, ly = 0, rx = 0, ry = 0, prevx = 0, prevy = 0; + + for (i = 0; i < ncap; i++) { + float a = (float)i/(float)(ncap-1)*NSVG_PI; + float ax = cosf(a) * w, ay = sinf(a) * w; + float x = px - dlx*ax - dx*ay; + float y = py - dly*ax - dy*ay; + + if (i > 0) + nsvg__addEdge(r, prevx, prevy, x, y); + + prevx = x; + prevy = y; + + if (i == 0) { + lx = x; ly = y; + } else if (i == ncap-1) { + rx = x; ry = y; + } + } + + if (connect) { + nsvg__addEdge(r, left->x, left->y, lx, ly); + nsvg__addEdge(r, rx, ry, right->x, right->y); + } + + left->x = lx; left->y = ly; + right->x = rx; right->y = ry; +} + +static void nsvg__bevelJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) +{ + float w = lineWidth * 0.5f; + float dlx0 = p0->dy, dly0 = -p0->dx; + float dlx1 = p1->dy, dly1 = -p1->dx; + float lx0 = p1->x - (dlx0 * w), ly0 = p1->y - (dly0 * w); + float rx0 = p1->x + (dlx0 * w), ry0 = p1->y + (dly0 * w); + float lx1 = p1->x - (dlx1 * w), ly1 = p1->y - (dly1 * w); + float rx1 = p1->x + (dlx1 * w), ry1 = p1->y + (dly1 * w); + + nsvg__addEdge(r, lx0, ly0, left->x, left->y); + nsvg__addEdge(r, lx1, ly1, lx0, ly0); + + nsvg__addEdge(r, right->x, right->y, rx0, ry0); + nsvg__addEdge(r, rx0, ry0, rx1, ry1); + + left->x = lx1; left->y = ly1; + right->x = rx1; right->y = ry1; +} + +static void nsvg__miterJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) +{ + float w = lineWidth * 0.5f; + float dlx0 = p0->dy, dly0 = -p0->dx; + float dlx1 = p1->dy, dly1 = -p1->dx; + float lx0, rx0, lx1, rx1; + float ly0, ry0, ly1, ry1; + + if (p1->flags & NSVG_PT_LEFT) { + lx0 = lx1 = p1->x - p1->dmx * w; + ly0 = ly1 = p1->y - p1->dmy * w; + nsvg__addEdge(r, lx1, ly1, left->x, left->y); + + rx0 = p1->x + (dlx0 * w); + ry0 = p1->y + (dly0 * w); + rx1 = p1->x + (dlx1 * w); + ry1 = p1->y + (dly1 * w); + nsvg__addEdge(r, right->x, right->y, rx0, ry0); + nsvg__addEdge(r, rx0, ry0, rx1, ry1); + } else { + lx0 = p1->x - (dlx0 * w); + ly0 = p1->y - (dly0 * w); + lx1 = p1->x - (dlx1 * w); + ly1 = p1->y - (dly1 * w); + nsvg__addEdge(r, lx0, ly0, left->x, left->y); + nsvg__addEdge(r, lx1, ly1, lx0, ly0); + + rx0 = rx1 = p1->x + p1->dmx * w; + ry0 = ry1 = p1->y + p1->dmy * w; + nsvg__addEdge(r, right->x, right->y, rx1, ry1); + } + + left->x = lx1; left->y = ly1; + right->x = rx1; right->y = ry1; +} + +static void nsvg__roundJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth, int ncap) +{ + int i, n; + float w = lineWidth * 0.5f; + float dlx0 = p0->dy, dly0 = -p0->dx; + float dlx1 = p1->dy, dly1 = -p1->dx; + float a0 = atan2f(dly0, dlx0); + float a1 = atan2f(dly1, dlx1); + float da = a1 - a0; + float lx, ly, rx, ry; + + if (da < NSVG_PI) da += NSVG_PI*2; + if (da > NSVG_PI) da -= NSVG_PI*2; + + n = (int)ceilf((nsvg__absf(da) / NSVG_PI) * (float)ncap); + if (n < 2) n = 2; + if (n > ncap) n = ncap; + + lx = left->x; + ly = left->y; + rx = right->x; + ry = right->y; + + for (i = 0; i < n; i++) { + float u = (float)i/(float)(n-1); + float a = a0 + u*da; + float ax = cosf(a) * w, ay = sinf(a) * w; + float lx1 = p1->x - ax, ly1 = p1->y - ay; + float rx1 = p1->x + ax, ry1 = p1->y + ay; + + nsvg__addEdge(r, lx1, ly1, lx, ly); + nsvg__addEdge(r, rx, ry, rx1, ry1); + + lx = lx1; ly = ly1; + rx = rx1; ry = ry1; + } + + left->x = lx; left->y = ly; + right->x = rx; right->y = ry; +} + +static void nsvg__straightJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p1, float lineWidth) +{ + float w = lineWidth * 0.5f; + float lx = p1->x - (p1->dmx * w), ly = p1->y - (p1->dmy * w); + float rx = p1->x + (p1->dmx * w), ry = p1->y + (p1->dmy * w); + + nsvg__addEdge(r, lx, ly, left->x, left->y); + nsvg__addEdge(r, right->x, right->y, rx, ry); + + left->x = lx; left->y = ly; + right->x = rx; right->y = ry; +} + +static int nsvg__curveDivs(float r, float arc, float tol) +{ + float da = acosf(r / (r + tol)) * 2.0f; + int divs = (int)ceilf(arc / da); + if (divs < 2) divs = 2; + return divs; +} + +static void nsvg__expandStroke(NSVGrasterizer* r, NSVGpoint* points, int npoints, int closed, int lineJoin, int lineCap, float lineWidth) +{ + int ncap = nsvg__curveDivs(lineWidth*0.5f, NSVG_PI, r->tessTol); // Calculate divisions per half circle. + NSVGpoint left = {0,0,0,0,0,0,0,0}, right = {0,0,0,0,0,0,0,0}, firstLeft = {0,0,0,0,0,0,0,0}, firstRight = {0,0,0,0,0,0,0,0}; + NSVGpoint* p0, *p1; + int j, s, e; + + // Build stroke edges + if (closed) { + // Looping + p0 = &points[npoints-1]; + p1 = &points[0]; + s = 0; + e = npoints; + } else { + // Add cap + p0 = &points[0]; + p1 = &points[1]; + s = 1; + e = npoints-1; + } + + if (closed) { + nsvg__initClosed(&left, &right, p0, p1, lineWidth); + firstLeft = left; + firstRight = right; + } else { + // Add cap + float dx = p1->x - p0->x; + float dy = p1->y - p0->y; + nsvg__normalize(&dx, &dy); + if (lineCap == NSVG_CAP_BUTT) + nsvg__buttCap(r, &left, &right, p0, dx, dy, lineWidth, 0); + else if (lineCap == NSVG_CAP_SQUARE) + nsvg__squareCap(r, &left, &right, p0, dx, dy, lineWidth, 0); + else if (lineCap == NSVG_CAP_ROUND) + nsvg__roundCap(r, &left, &right, p0, dx, dy, lineWidth, ncap, 0); + } + + for (j = s; j < e; ++j) { + if (p1->flags & NSVG_PT_CORNER) { + if (lineJoin == NSVG_JOIN_ROUND) + nsvg__roundJoin(r, &left, &right, p0, p1, lineWidth, ncap); + else if (lineJoin == NSVG_JOIN_BEVEL || (p1->flags & NSVG_PT_BEVEL)) + nsvg__bevelJoin(r, &left, &right, p0, p1, lineWidth); + else + nsvg__miterJoin(r, &left, &right, p0, p1, lineWidth); + } else { + nsvg__straightJoin(r, &left, &right, p1, lineWidth); + } + p0 = p1++; + } + + if (closed) { + // Loop it + nsvg__addEdge(r, firstLeft.x, firstLeft.y, left.x, left.y); + nsvg__addEdge(r, right.x, right.y, firstRight.x, firstRight.y); + } else { + // Add cap + float dx = p1->x - p0->x; + float dy = p1->y - p0->y; + nsvg__normalize(&dx, &dy); + if (lineCap == NSVG_CAP_BUTT) + nsvg__buttCap(r, &right, &left, p1, -dx, -dy, lineWidth, 1); + else if (lineCap == NSVG_CAP_SQUARE) + nsvg__squareCap(r, &right, &left, p1, -dx, -dy, lineWidth, 1); + else if (lineCap == NSVG_CAP_ROUND) + nsvg__roundCap(r, &right, &left, p1, -dx, -dy, lineWidth, ncap, 1); + } +} + +static void nsvg__prepareStroke(NSVGrasterizer* r, float miterLimit, int lineJoin) +{ + int i, j; + NSVGpoint* p0, *p1; + + p0 = &r->points[r->npoints-1]; + p1 = &r->points[0]; + for (i = 0; i < r->npoints; i++) { + // Calculate segment direction and length + p0->dx = p1->x - p0->x; + p0->dy = p1->y - p0->y; + p0->len = nsvg__normalize(&p0->dx, &p0->dy); + // Advance + p0 = p1++; + } + + // calculate joins + p0 = &r->points[r->npoints-1]; + p1 = &r->points[0]; + for (j = 0; j < r->npoints; j++) { + float dlx0, dly0, dlx1, dly1, dmr2, cross; + dlx0 = p0->dy; + dly0 = -p0->dx; + dlx1 = p1->dy; + dly1 = -p1->dx; + // Calculate extrusions + p1->dmx = (dlx0 + dlx1) * 0.5f; + p1->dmy = (dly0 + dly1) * 0.5f; + dmr2 = p1->dmx*p1->dmx + p1->dmy*p1->dmy; + if (dmr2 > 0.000001f) { + float s2 = 1.0f / dmr2; + if (s2 > 600.0f) { + s2 = 600.0f; + } + p1->dmx *= s2; + p1->dmy *= s2; + } + + // Clear flags, but keep the corner. + p1->flags = (p1->flags & NSVG_PT_CORNER) ? NSVG_PT_CORNER : 0; + + // Keep track of left turns. + cross = p1->dx * p0->dy - p0->dx * p1->dy; + if (cross > 0.0f) + p1->flags |= NSVG_PT_LEFT; + + // Check to see if the corner needs to be beveled. + if (p1->flags & NSVG_PT_CORNER) { + if ((dmr2 * miterLimit*miterLimit) < 1.0f || lineJoin == NSVG_JOIN_BEVEL || lineJoin == NSVG_JOIN_ROUND) { + p1->flags |= NSVG_PT_BEVEL; + } + } + + p0 = p1++; + } +} + +static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float scale) +{ + int i, j, closed; + NSVGpath* path; + NSVGpoint* p0, *p1; + float miterLimit = shape->miterLimit; + int lineJoin = shape->strokeLineJoin; + int lineCap = shape->strokeLineCap; + float lineWidth = shape->strokeWidth * scale; + + for (path = shape->paths; path != NULL; path = path->next) { + // Flatten path + r->npoints = 0; + nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, NSVG_PT_CORNER); + for (i = 0; i < path->npts-1; i += 3) { + float* p = &path->pts[i*2]; + nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, NSVG_PT_CORNER); + } + if (r->npoints < 2) + continue; + + closed = path->closed; + + // If the first and last points are the same, remove the last, mark as closed path. + p0 = &r->points[r->npoints-1]; + p1 = &r->points[0]; + if (nsvg__ptEquals(p0->x,p0->y, p1->x,p1->y, r->distTol)) { + r->npoints--; + p0 = &r->points[r->npoints-1]; + closed = 1; + } + + if (shape->strokeDashCount > 0) { + int idash = 0, dashState = 1; + float totalDist = 0, dashLen, allDashLen, dashOffset; + NSVGpoint cur; + + if (closed) + nsvg__appendPathPoint(r, r->points[0]); + + // Duplicate points -> points2. + nsvg__duplicatePoints(r); + + r->npoints = 0; + cur = r->points2[0]; + nsvg__appendPathPoint(r, cur); + + // Figure out dash offset. + allDashLen = 0; + for (j = 0; j < shape->strokeDashCount; j++) + allDashLen += shape->strokeDashArray[j]; + if (shape->strokeDashCount & 1) + allDashLen *= 2.0f; + // Find location inside pattern + dashOffset = fmodf(shape->strokeDashOffset, allDashLen); + if (dashOffset < 0.0f) + dashOffset += allDashLen; + + while (dashOffset > shape->strokeDashArray[idash]) { + dashOffset -= shape->strokeDashArray[idash]; + idash = (idash + 1) % shape->strokeDashCount; + } + dashLen = (shape->strokeDashArray[idash] - dashOffset) * scale; + + for (j = 1; j < r->npoints2; ) { + float dx = r->points2[j].x - cur.x; + float dy = r->points2[j].y - cur.y; + float dist = sqrtf(dx*dx + dy*dy); + + if ((totalDist + dist) > dashLen) { + // Calculate intermediate point + float d = (dashLen - totalDist) / dist; + float x = cur.x + dx * d; + float y = cur.y + dy * d; + nsvg__addPathPoint(r, x, y, NSVG_PT_CORNER); + + // Stroke + if (r->npoints > 1 && dashState) { + nsvg__prepareStroke(r, miterLimit, lineJoin); + nsvg__expandStroke(r, r->points, r->npoints, 0, lineJoin, lineCap, lineWidth); + } + // Advance dash pattern + dashState = !dashState; + idash = (idash+1) % shape->strokeDashCount; + dashLen = shape->strokeDashArray[idash] * scale; + // Restart + cur.x = x; + cur.y = y; + cur.flags = NSVG_PT_CORNER; + totalDist = 0.0f; + r->npoints = 0; + nsvg__appendPathPoint(r, cur); + } else { + totalDist += dist; + cur = r->points2[j]; + nsvg__appendPathPoint(r, cur); + j++; + } + } + // Stroke any leftover path + if (r->npoints > 1 && dashState) + nsvg__expandStroke(r, r->points, r->npoints, 0, lineJoin, lineCap, lineWidth); + } else { + nsvg__prepareStroke(r, miterLimit, lineJoin); + nsvg__expandStroke(r, r->points, r->npoints, closed, lineJoin, lineCap, lineWidth); + } + } +} + +static int nsvg__cmpEdge(const void *p, const void *q) +{ + const NSVGedge* a = (const NSVGedge*)p; + const NSVGedge* b = (const NSVGedge*)q; + + if (a->y0 < b->y0) return -1; + if (a->y0 > b->y0) return 1; + return 0; +} + + +static NSVGactiveEdge* nsvg__addActive(NSVGrasterizer* r, NSVGedge* e, float startPoint) +{ + NSVGactiveEdge* z; + + if (r->freelist != NULL) { + // Restore from freelist. + z = r->freelist; + r->freelist = z->next; + } else { + // Alloc new edge. + z = (NSVGactiveEdge*)nsvg__alloc(r, sizeof(NSVGactiveEdge)); + if (z == NULL) return NULL; + } + + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); +// STBTT_assert(e->y0 <= start_point); + // round dx down to avoid going too far + if (dxdy < 0) + z->dx = (int)(-nsvg__roundf(NSVG__FIX * -dxdy)); + else + z->dx = (int)nsvg__roundf(NSVG__FIX * dxdy); + z->x = (int)nsvg__roundf(NSVG__FIX * (e->x0 + dxdy * (startPoint - e->y0))); +// z->x -= off_x * FIX; + z->ey = e->y1; + z->next = 0; + z->dir = e->dir; + + return z; +} + +static void nsvg__freeActive(NSVGrasterizer* r, NSVGactiveEdge* z) +{ + z->next = r->freelist; + r->freelist = z; +} + +static void nsvg__fillScanline(unsigned char* scanline, int len, int x0, int x1, int maxWeight, int* xmin, int* xmax) +{ + int i = x0 >> NSVG__FIXSHIFT; + int j = x1 >> NSVG__FIXSHIFT; + if (i < *xmin) *xmin = i; + if (j > *xmax) *xmax = j; + if (i < len && j >= 0) { + if (i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = (unsigned char)(scanline[i] + ((x1 - x0) * maxWeight >> NSVG__FIXSHIFT)); + } else { + if (i >= 0) // add antialiasing for x0 + scanline[i] = (unsigned char)(scanline[i] + (((NSVG__FIX - (x0 & NSVG__FIXMASK)) * maxWeight) >> NSVG__FIXSHIFT)); + else + i = -1; // clip + + if (j < len) // add antialiasing for x1 + scanline[j] = (unsigned char)(scanline[j] + (((x1 & NSVG__FIXMASK) * maxWeight) >> NSVG__FIXSHIFT)); + else + j = len; // clip + + for (++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = (unsigned char)(scanline[i] + maxWeight); + } + } +} + +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void nsvg__fillActiveEdges(unsigned char* scanline, int len, NSVGactiveEdge* e, int maxWeight, int* xmin, int* xmax, char fillRule) +{ + // non-zero winding fill + int x0 = 0, w = 0; + + if (fillRule == NSVG_FILLRULE_NONZERO) { + // Non-zero + while (e != NULL) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w += e->dir; + } else { + int x1 = e->x; w += e->dir; + // if we went to zero, we need to draw + if (w == 0) + nsvg__fillScanline(scanline, len, x0, x1, maxWeight, xmin, xmax); + } + e = e->next; + } + } else if (fillRule == NSVG_FILLRULE_EVENODD) { + // Even-odd + while (e != NULL) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w = 1; + } else { + int x1 = e->x; w = 0; + nsvg__fillScanline(scanline, len, x0, x1, maxWeight, xmin, xmax); + } + e = e->next; + } + } +} + +static float nsvg__clampf(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } + +static unsigned int nsvg__RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return ((unsigned int)r) | ((unsigned int)g << 8) | ((unsigned int)b << 16) | ((unsigned int)a << 24); +} + +static unsigned int nsvg__lerpRGBA(unsigned int c0, unsigned int c1, float u) +{ + int iu = (int)(nsvg__clampf(u, 0.0f, 1.0f) * 256.0f); + int r = (((c0) & 0xff)*(256-iu) + (((c1) & 0xff)*iu)) >> 8; + int g = (((c0>>8) & 0xff)*(256-iu) + (((c1>>8) & 0xff)*iu)) >> 8; + int b = (((c0>>16) & 0xff)*(256-iu) + (((c1>>16) & 0xff)*iu)) >> 8; + int a = (((c0>>24) & 0xff)*(256-iu) + (((c1>>24) & 0xff)*iu)) >> 8; + return nsvg__RGBA((unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a); +} + +static unsigned int nsvg__applyOpacity(unsigned int c, float u) +{ + int iu = (int)(nsvg__clampf(u, 0.0f, 1.0f) * 256.0f); + int r = (c) & 0xff; + int g = (c>>8) & 0xff; + int b = (c>>16) & 0xff; + int a = (((c>>24) & 0xff)*iu) >> 8; + return nsvg__RGBA((unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a); +} + +static inline int nsvg__div255(int x) +{ + return ((x+1) * 257) >> 16; +} + +static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char* cover, int x, int y, + float tx, float ty, float scale, NSVGcachedPaint* cache) +{ + + if (cache->type == NSVG_PAINT_COLOR) { + int i, cr, cg, cb, ca; + cr = cache->colors[0] & 0xff; + cg = (cache->colors[0] >> 8) & 0xff; + cb = (cache->colors[0] >> 16) & 0xff; + ca = (cache->colors[0] >> 24) & 0xff; + + for (i = 0; i < count; i++) { + int r,g,b; + int a = nsvg__div255((int)cover[0] * ca); + int ia = 255 - a; + // Premultiply + r = nsvg__div255(cr * a); + g = nsvg__div255(cg * a); + b = nsvg__div255(cb * a); + + // Blend over + r += nsvg__div255(ia * (int)dst[0]); + g += nsvg__div255(ia * (int)dst[1]); + b += nsvg__div255(ia * (int)dst[2]); + a += nsvg__div255(ia * (int)dst[3]); + + dst[0] = (unsigned char)r; + dst[1] = (unsigned char)g; + dst[2] = (unsigned char)b; + dst[3] = (unsigned char)a; + + cover++; + dst += 4; + } + } else if (cache->type == NSVG_PAINT_LINEAR_GRADIENT) { + // TODO: spread modes. + // TODO: plenty of opportunities to optimize. + float fx, fy, dx, gy; + float* t = cache->xform; + int i, cr, cg, cb, ca; + unsigned int c; + + fx = ((float)x - tx) / scale; + fy = ((float)y - ty) / scale; + dx = 1.0f / scale; + + for (i = 0; i < count; i++) { + int r,g,b,a,ia; + gy = fx*t[1] + fy*t[3] + t[5]; + c = cache->colors[(int)nsvg__clampf(gy*255.0f, 0, 255.0f)]; + cr = (c) & 0xff; + cg = (c >> 8) & 0xff; + cb = (c >> 16) & 0xff; + ca = (c >> 24) & 0xff; + + a = nsvg__div255((int)cover[0] * ca); + ia = 255 - a; + + // Premultiply + r = nsvg__div255(cr * a); + g = nsvg__div255(cg * a); + b = nsvg__div255(cb * a); + + // Blend over + r += nsvg__div255(ia * (int)dst[0]); + g += nsvg__div255(ia * (int)dst[1]); + b += nsvg__div255(ia * (int)dst[2]); + a += nsvg__div255(ia * (int)dst[3]); + + dst[0] = (unsigned char)r; + dst[1] = (unsigned char)g; + dst[2] = (unsigned char)b; + dst[3] = (unsigned char)a; + + cover++; + dst += 4; + fx += dx; + } + } else if (cache->type == NSVG_PAINT_RADIAL_GRADIENT) { + // TODO: spread modes. + // TODO: plenty of opportunities to optimize. + // TODO: focus (fx,fy) + float fx, fy, dx, gx, gy, gd; + float* t = cache->xform; + int i, cr, cg, cb, ca; + unsigned int c; + + fx = ((float)x - tx) / scale; + fy = ((float)y - ty) / scale; + dx = 1.0f / scale; + + for (i = 0; i < count; i++) { + int r,g,b,a,ia; + gx = fx*t[0] + fy*t[2] + t[4]; + gy = fx*t[1] + fy*t[3] + t[5]; + gd = sqrtf(gx*gx + gy*gy); + c = cache->colors[(int)nsvg__clampf(gd*255.0f, 0, 255.0f)]; + cr = (c) & 0xff; + cg = (c >> 8) & 0xff; + cb = (c >> 16) & 0xff; + ca = (c >> 24) & 0xff; + + a = nsvg__div255((int)cover[0] * ca); + ia = 255 - a; + + // Premultiply + r = nsvg__div255(cr * a); + g = nsvg__div255(cg * a); + b = nsvg__div255(cb * a); + + // Blend over + r += nsvg__div255(ia * (int)dst[0]); + g += nsvg__div255(ia * (int)dst[1]); + b += nsvg__div255(ia * (int)dst[2]); + a += nsvg__div255(ia * (int)dst[3]); + + dst[0] = (unsigned char)r; + dst[1] = (unsigned char)g; + dst[2] = (unsigned char)b; + dst[3] = (unsigned char)a; + + cover++; + dst += 4; + fx += dx; + } + } +} + +static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty, float scale, NSVGcachedPaint* cache, char fillRule) +{ + NSVGactiveEdge *active = NULL; + int y, s; + int e = 0; + int maxWeight = (255 / NSVG__SUBSAMPLES); // weight per vertical scanline + int xmin, xmax; + + for (y = 0; y < r->height; y++) { + memset(r->scanline, 0, r->width); + xmin = r->width; + xmax = 0; + for (s = 0; s < NSVG__SUBSAMPLES; ++s) { + // find center of pixel for this scanline + float scany = (float)(y*NSVG__SUBSAMPLES + s) + 0.5f; + NSVGactiveEdge **step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while (*step) { + NSVGactiveEdge *z = *step; + if (z->ey <= scany) { + *step = z->next; // delete from list +// NSVG__assert(z->valid); + nsvg__freeActive(r, z); + } else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for (;;) { + int changed = 0; + step = &active; + while (*step && (*step)->next) { + if ((*step)->x > (*step)->next->x) { + NSVGactiveEdge* t = *step; + NSVGactiveEdge* q = t->next; + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if (!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while (e < r->nedges && r->edges[e].y0 <= scany) { + if (r->edges[e].y1 > scany) { + NSVGactiveEdge* z = nsvg__addActive(r, &r->edges[e], scany); + if (z == NULL) break; + // find insertion point + if (active == NULL) { + active = z; + } else if (z->x < active->x) { + // insert at front + z->next = active; + active = z; + } else { + // find thing to insert AFTER + NSVGactiveEdge* p = active; + while (p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + e++; + } + + // now process all active edges in non-zero fashion + if (active != NULL) + nsvg__fillActiveEdges(r->scanline, r->width, active, maxWeight, &xmin, &xmax, fillRule); + } + // Blit + if (xmin < 0) xmin = 0; + if (xmax > r->width-1) xmax = r->width-1; + if (xmin <= xmax) { + nsvg__scanlineSolid(&r->bitmap[y * r->stride] + xmin*4, xmax-xmin+1, &r->scanline[xmin], xmin, y, tx,ty, scale, cache); + } + } + +} + +static void nsvg__unpremultiplyAlpha(unsigned char* image, int w, int h, int stride) +{ + int x,y; + + // Unpremultiply + for (y = 0; y < h; y++) { + unsigned char *row = &image[y*stride]; + for (x = 0; x < w; x++) { + int r = row[0], g = row[1], b = row[2], a = row[3]; + if (a != 0) { + row[0] = (unsigned char)(r*255/a); + row[1] = (unsigned char)(g*255/a); + row[2] = (unsigned char)(b*255/a); + } + row += 4; + } + } + + // Defringe + for (y = 0; y < h; y++) { + unsigned char *row = &image[y*stride]; + for (x = 0; x < w; x++) { + int r = 0, g = 0, b = 0, a = row[3], n = 0; + if (a == 0) { + if (x-1 > 0 && row[-1] != 0) { + r += row[-4]; + g += row[-3]; + b += row[-2]; + n++; + } + if (x+1 < w && row[7] != 0) { + r += row[4]; + g += row[5]; + b += row[6]; + n++; + } + if (y-1 > 0 && row[-stride+3] != 0) { + r += row[-stride]; + g += row[-stride+1]; + b += row[-stride+2]; + n++; + } + if (y+1 < h && row[stride+3] != 0) { + r += row[stride]; + g += row[stride+1]; + b += row[stride+2]; + n++; + } + if (n > 0) { + row[0] = (unsigned char)(r/n); + row[1] = (unsigned char)(g/n); + row[2] = (unsigned char)(b/n); + } + } + row += 4; + } + } +} + + +static void nsvg__initPaint(NSVGcachedPaint* cache, NSVGpaint* paint, float opacity) +{ + int i, j; + NSVGgradient* grad; + + cache->type = paint->type; + + if (paint->type == NSVG_PAINT_COLOR) { + cache->colors[0] = nsvg__applyOpacity(paint->color, opacity); + return; + } + + grad = paint->gradient; + + cache->spread = grad->spread; + memcpy(cache->xform, grad->xform, sizeof(float)*6); + + if (grad->nstops == 0) { + for (i = 0; i < 256; i++) + cache->colors[i] = 0; + } else if (grad->nstops == 1) { + unsigned int color = nsvg__applyOpacity(grad->stops[0].color, opacity); + for (i = 0; i < 256; i++) + cache->colors[i] = color; + } else { + unsigned int ca, cb = 0; + float ua, ub, du, u; + int ia, ib, count; + + ca = nsvg__applyOpacity(grad->stops[0].color, opacity); + ua = nsvg__clampf(grad->stops[0].offset, 0, 1); + ub = nsvg__clampf(grad->stops[grad->nstops-1].offset, ua, 1); + ia = (int)(ua * 255.0f); + ib = (int)(ub * 255.0f); + for (i = 0; i < ia; i++) { + cache->colors[i] = ca; + } + + for (i = 0; i < grad->nstops-1; i++) { + ca = nsvg__applyOpacity(grad->stops[i].color, opacity); + cb = nsvg__applyOpacity(grad->stops[i+1].color, opacity); + ua = nsvg__clampf(grad->stops[i].offset, 0, 1); + ub = nsvg__clampf(grad->stops[i+1].offset, 0, 1); + ia = (int)(ua * 255.0f); + ib = (int)(ub * 255.0f); + count = ib - ia; + if (count <= 0) continue; + u = 0; + du = 1.0f / (float)count; + for (j = 0; j < count; j++) { + cache->colors[ia+j] = nsvg__lerpRGBA(ca,cb,u); + u += du; + } + } + + for (i = ib; i < 256; i++) + cache->colors[i] = cb; + } + +} + +/* +static void dumpEdges(NSVGrasterizer* r, const char* name) +{ + float xmin = 0, xmax = 0, ymin = 0, ymax = 0; + NSVGedge *e = NULL; + int i; + if (r->nedges == 0) return; + FILE* fp = fopen(name, "w"); + if (fp == NULL) return; + + xmin = xmax = r->edges[0].x0; + ymin = ymax = r->edges[0].y0; + for (i = 0; i < r->nedges; i++) { + e = &r->edges[i]; + xmin = nsvg__minf(xmin, e->x0); + xmin = nsvg__minf(xmin, e->x1); + xmax = nsvg__maxf(xmax, e->x0); + xmax = nsvg__maxf(xmax, e->x1); + ymin = nsvg__minf(ymin, e->y0); + ymin = nsvg__minf(ymin, e->y1); + ymax = nsvg__maxf(ymax, e->y0); + ymax = nsvg__maxf(ymax, e->y1); + } + + fprintf(fp, "", xmin, ymin, (xmax - xmin), (ymax - ymin)); + + for (i = 0; i < r->nedges; i++) { + e = &r->edges[i]; + fprintf(fp ,"", e->x0,e->y0, e->x1,e->y1); + } + + for (i = 0; i < r->npoints; i++) { + if (i+1 < r->npoints) + fprintf(fp ,"", r->points[i].x, r->points[i].y, r->points[i+1].x, r->points[i+1].y); + fprintf(fp ,"", r->points[i].x, r->points[i].y, r->points[i].flags == 0 ? "#f00" : "#0f0"); + } + + fprintf(fp, ""); + fclose(fp); +} +*/ + +void nsvgRasterize(NSVGrasterizer* r, + NSVGimage* image, float tx, float ty, float scale, + unsigned char* dst, int w, int h, int stride) +{ + NSVGshape *shape = NULL; + NSVGedge *e = NULL; + NSVGcachedPaint cache; + int i; + + r->bitmap = dst; + r->width = w; + r->height = h; + r->stride = stride; + + if (w > r->cscanline) { + r->cscanline = w; + r->scanline = (unsigned char*)realloc(r->scanline, w); + if (r->scanline == NULL) return; + } + + for (i = 0; i < h; i++) + memset(&dst[i*stride], 0, w*4); + + for (shape = image->shapes; shape != NULL; shape = shape->next) { + if (!(shape->flags & NSVG_FLAGS_VISIBLE)) + continue; + + if (shape->fill.type != NSVG_PAINT_NONE) { + nsvg__resetPool(r); + r->freelist = NULL; + r->nedges = 0; + + nsvg__flattenShape(r, shape, scale); + + // Scale and translate edges + for (i = 0; i < r->nedges; i++) { + e = &r->edges[i]; + e->x0 = tx + e->x0; + e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; + e->x1 = tx + e->x1; + e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; + } + + // Rasterize edges + if (r->nedges != 0) + qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); + + // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule + nsvg__initPaint(&cache, &shape->fill, shape->opacity); + + nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, shape->fillRule); + } + if (shape->stroke.type != NSVG_PAINT_NONE && (shape->strokeWidth * scale) > 0.01f) { + nsvg__resetPool(r); + r->freelist = NULL; + r->nedges = 0; + + nsvg__flattenShapeStroke(r, shape, scale); + +// dumpEdges(r, "edge.svg"); + + // Scale and translate edges + for (i = 0; i < r->nedges; i++) { + e = &r->edges[i]; + e->x0 = tx + e->x0; + e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; + e->x1 = tx + e->x1; + e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; + } + + // Rasterize edges + if (r->nedges != 0) + qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); + + // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule + nsvg__initPaint(&cache, &shape->stroke, shape->opacity); + + nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, NSVG_FILLRULE_NONZERO); + } + } + + nsvg__unpremultiplyAlpha(dst, w, h, stride); + + r->bitmap = NULL; + r->width = 0; + r->height = 0; + r->stride = 0; +} + +#endif // NANOSVGRAST_IMPLEMENTATION + +#endif // NANOSVGRAST_H diff --git a/svg/stb_image_write.h b/svg/stb_image_write.h new file mode 100644 index 0000000..e4b32ed --- /dev/null +++ b/svg/stb_image_write.h @@ -0,0 +1,1724 @@ +/* stb_image_write - v1.16 - public domain - http://nothings.org/stb + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk + + Before #including, + + #define STB_IMAGE_WRITE_IMPLEMENTATION + + in the file that you want to have the implementation. + + Will probably not work correctly with strict-aliasing optimizations. + +ABOUT: + + This header file is a library for writing images to C stdio or a callback. + + The PNG output is not optimal; it is 20-50% larger than the file + written by a decent optimizing implementation; though providing a custom + zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. + +BUILDING: + + You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. + You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace + malloc,realloc,free. + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), + +UNICODE: + + If compiling for Windows and you wish to use Unicode filenames, compile + with + #define STBIW_WINDOWS_UTF8 + and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert + Windows wchar_t filenames to utf8. + +USAGE: + + There are five functions, one for each image file format: + + int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically + + There are also five equivalent functions that use an arbitrary write function. You are + expected to open/close your file-equivalent before and after calling these: + + int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); + int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + + where the callback is: + void stbi_write_func(void *context, void *data, int size); + + You can configure it with these global variables: + int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE + int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression + int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. + + Each function returns 0 on failure and non-0 on success. + + The functions create an image file defined by the parameters. The image + is a rectangle of pixels stored from left-to-right, top-to-bottom. + Each pixel contains 'comp' channels of data stored interleaved with 8-bits + per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is + monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. + The *data pointer points to the first byte of the top-left-most pixel. + For PNG, "stride_in_bytes" is the distance in bytes from the first byte of + a row of pixels to the first byte of the next row of pixels. + + PNG creates output files with the same number of components as the input. + The BMP format expands Y to RGB in the file format and does not + output alpha. + + PNG supports writing rectangles of data even when the bytes storing rows of + data are not consecutive in memory (e.g. sub-rectangles of a larger image), + by supplying the stride between the beginning of adjacent rows. The other + formats do not. (Thus you cannot write a native-format BMP through the BMP + writer, both because it is in BGR order and because it may have padding + at the end of the line.) + + PNG allows you to set the deflate compression level by setting the global + variable 'stbi_write_png_compression_level' (it defaults to 8). + + HDR expects linear float data. Since the format is always 32-bit rgb(e) + data, alpha (if provided) is discarded, and for monochrome data it is + replicated across all three channels. + + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + JPEG does ignore alpha channels in input data; quality is between 1 and 100. + Higher quality looks better but results in a bigger image. + JPEG baseline (no JPEG progressive). + +CREDITS: + + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + + bugfixes: + github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + Andrew Kensler + +LICENSE + + See end of file for license information. + +*/ + +#ifndef INCLUDE_STB_IMAGE_WRITE_H +#define INCLUDE_STB_IMAGE_WRITE_H + +#include + +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else +#ifdef __cplusplus +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif +#endif + +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +STBIWDEF int stbi_write_tga_with_rle; +STBIWDEF int stbi_write_png_compression_level; +STBIWDEF int stbi_write_force_png_filter; +#endif + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); + +#ifdef STBIW_WINDOWS_UTF8 +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif +#endif + +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + +#endif//INCLUDE_STB_IMAGE_WRITE_H + +#ifdef STB_IMAGE_WRITE_IMPLEMENTATION + +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + +#include +#include +#include +#include + +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) +// ok +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." +#endif + +#ifndef STBIW_MALLOC +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#endif + + +#ifndef STBIW_MEMMOVE +#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) +#endif + + +#ifndef STBIW_ASSERT +#include +#define STBIW_ASSERT(x) assert(x) +#endif + +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +static int stbi__flip_vertically_on_write = 0; + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; + unsigned char buffer[64]; + int buf_used; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) +#ifdef __cplusplus +#define STBIW_EXTERN extern "C" +#else +#define STBIW_EXTERN extern +#endif +STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); + +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbiw__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f = stbiw__fopen(filename, "wb"); + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } + default: + STBIW_ASSERT(0); + return; + } + } +} + +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__write_flush(stbi__write_context *s) +{ + if (s->buf_used) { + s->func(s->context, &s->buffer, s->buf_used); + s->buf_used = 0; + } +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write1(stbi__write_context *s, unsigned char a) +{ + if ((size_t)s->buf_used + 1 > sizeof(s->buffer)) + stbiw__write_flush(s); + s->buffer[s->buf_used++] = a; +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) +{ + int n; + if ((size_t)s->buf_used + 3 > sizeof(s->buffer)) + stbiw__write_flush(s); + n = s->buf_used; + s->buf_used = n+3; + s->buffer[n+0] = a; + s->buffer[n+1] = b; + s->buffer[n+2] = c; +} + +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + stbiw__write1(s, d[comp - 1]); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + stbiw__write1(s, d[0]); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + stbiw__write1(s, d[comp - 1]); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ + stbiw_uint32 zero = 0; + int i,j, j_end; + + if (y <= 0) + return; + + if (stbi__flip_vertically_on_write) + vdir *= -1; + + if (vdir < 0) { + j_end = -1; j = y-1; + } else { + j_end = y; j = 0; + } + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); + } + stbiw__write_flush(s); + s->func(s->context, &zero, scanline_pad); + } +} + +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +{ + if (y < 0 || x < 0) { + return 0; + } else { + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; + } +} + +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) +{ + if (comp != 4) { + // write RGB bitmap + int pad = (-x*3) & 3; + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header + } else { + // RGBA bitmaps need a v4 header + // use BI_BITFIELDS mode with 32bpp and alpha mask + // (straight BI_RGB with alpha mask doesn't work in most readers) + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0, + "11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444", + 'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header + 108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header + } +} + +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) +{ + int has_alpha = (comp == 2 || comp == 4); + int colorbytes = has_alpha ? comp-1 : comp; + int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + stbiw__write1(s, header); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + stbiw__write1(s, header); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + stbiw__write_flush(s); + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR writer +// by Baldur Karlsson + +#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) + +#ifndef STBI_WRITE_NO_STDIO + +static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) +{ + int exponent; + float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); + + if (maxcomp < 1e-32f) { + rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; + } else { + float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; + + rgbe[0] = (unsigned char)(linear[0] * normalize); + rgbe[1] = (unsigned char)(linear[1] * normalize); + rgbe[2] = (unsigned char)(linear[2] * normalize); + rgbe[3] = (unsigned char)(exponent + 128); + } +} + +static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) +{ + unsigned char lengthbyte = STBIW_UCHAR(length+128); + STBIW_ASSERT(length+128 <= 255); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); +} + +static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) +{ + unsigned char lengthbyte = STBIW_UCHAR(length); + STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); +} + +static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) +{ + unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; + unsigned char rgbe[4]; + float linear[3]; + int x; + + scanlineheader[2] = (width&0xff00)>>8; + scanlineheader[3] = (width&0x00ff); + + /* skip RLE for images too small or large */ + if (width < 8 || width >= 32768) { + for (x=0; x < width; x++) { + switch (ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + s->func(s->context, rgbe, 4); + } + } else { + int c,r; + /* encode into scratch buffer */ + for (x=0; x < width; x++) { + switch(ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + scratch[x + width*0] = rgbe[0]; + scratch[x + width*1] = rgbe[1]; + scratch[x + width*2] = rgbe[2]; + scratch[x + width*3] = rgbe[3]; + } + + s->func(s->context, scanlineheader, 4); + + /* RLE each component separately */ + for (c=0; c < 4; c++) { + unsigned char *comp = &scratch[width*c]; + + x = 0; + while (x < width) { + // find first run + r = x; + while (r+2 < width) { + if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) + break; + ++r; + } + if (r+2 >= width) + r = width; + // dump up to first run + while (x < r) { + int len = r-x; + if (len > 128) len = 128; + stbiw__write_dump_data(s, len, &comp[x]); + x += len; + } + // if there's a run, output it + if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd + // find next byte after run + while (r < width && comp[r] == comp[x]) + ++r; + // output run up to r + while (x < r) { + int len = r-x; + if (len > 127) len = 127; + stbiw__write_run_data(s, len, comp[x]); + x += len; + } + } + } + } + } +} + +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) +{ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. + unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef __STDC_LIB_EXT1__ + len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + + for(i=0; i < y; i++) + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); + STBIW_FREE(scratch); + return 1; + } +} + +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS +// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() +#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) +#define stbiw__sbm(a) stbiw__sbraw(a)[0] +#define stbiw__sbn(a) stbiw__sbraw(a)[1] + +#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) +#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) +#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) +#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) +#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) + +static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) +#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) +// default huffman tables +#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) +#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) +#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) +#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) +#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) +#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) + +#define stbiw__ZHASH 16384 + +#endif // STBIW_ZLIB_COMPRESS + +STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw__sbpush(out, 0x78); // DEFLATE 32K window + stbiw__sbpush(out, 0x5e); // FLEVEL = 1 + stbiw__zlib_add(1,1); // BFINAL = 1 + stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbiw__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) { best=d; bestloc=hlist[j]; } + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw__sbn(hash_table[h]) = quality; + } + stbiw__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); + hlist = hash_table[h]; + n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); // distance back + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw__zlib_huff(j+257); + if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); + if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbiw__zlib_huffb(data[i]); + stbiw__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbiw__zlib_add(0,1); + + for (i=0; i < stbiw__ZHASH; ++i) + (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + // store uncompressed instead if compression was worse + if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) { + stbiw__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1 + for (j = 0; j < data_len;) { + int blocklen = data_len - j; + if (blocklen > 32767) blocklen = 32767; + stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression + stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN + stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN + stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8)); + memcpy(out+stbiw__sbn(out), data+j, blocklen); + stbiw__sbn(out) += blocklen; + j += blocklen; + } + } + + { + // compute adler32 on input + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } + s1 %= 65521; s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw__sbn(out); + // make returned pointer freeable + STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); + return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ +#ifdef STBIW_CRC32 + return STBIW_CRC32(buffer, len); +#else + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +#endif +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + + if (type==0) { + memcpy(line_buffer, z, width*n); + return; + } + + // first loop isn't optimized since it's just one pixel + for (i = 0; i < n; ++i) { + switch (type) { + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + switch (type) { + case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; + case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } +} + +STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = stbi_write_force_png_filter; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); + STBIW_FREE(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); // header length + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + + f = stbiw__fopen(filename, "wb"); + if (!f) { STBIW_FREE(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + STBIW_FREE(png); + return 1; +} +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k, subsample; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + subsample = quality <= 90 ? 1 : 0; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + const unsigned char *dataR = (const unsigned char *)data; + const unsigned char *dataG = dataR + ofsG; + const unsigned char *dataB = dataR + ofsB; + int x, y, pos; + if(subsample) { + for(y = 0; y < height; y += 16) { + for(x = 0; x < width; x += 16) { + float Y[256], U[256], V[256]; + for(row = y, pos = 0; row < y+16; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+16; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + + // subsample U,V + { + float subU[64], subV[64]; + int yy, xx; + for(yy = 0, pos = 0; yy < 8; ++yy) { + for(xx = 0; xx < 8; ++xx, ++pos) { + int j = yy*32+xx*2; + subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; + subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; + } + } + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + } else { + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float Y[64], U[64], V[64]; + for(row = y, pos = 0; row < y+8; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+8; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + 1.16 (2021-07-11) + make Deflate code emit uncompressed blocks when it would otherwise expand + support writing BMPs with alpha channel + 1.15 (2020-07-13) unknown + 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels + 1.13 + 1.12 + 1.11 (2019-08-11) + + 1.10 (2019-02-07) + support utf8 filenames in Windows; fix warnings and platform ifdefs + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support + 0.98 (2015-04-08) + added STBIW_MALLOC, STBIW_ASSERT etc + 0.97 (2015-01-18) + fixed HDR asserts, rewrote HDR rle logic + 0.96 (2015-01-17) + add HDR output + fix monochrome BMP + 0.95 (2014-08-17) + add monochrome TGA output + 0.94 (2014-05-31) + rename private functions to avoid conflicts with stb_image.h + 0.93 (2014-05-27) + warning fixes + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ From fa1de4ed4ad88f0555fe05e53a8ff19ef605bd4a Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 6 Mar 2025 15:42:35 +0100 Subject: [PATCH 008/109] Make macros consistent, get rid of deprecated sys_vgui, fix a bunch of warnings, clean up buffered tcl/tk images when object is deleted --- pdlua.c | 11 +++++------ pdlua.h | 4 +++- pdlua_gfx.h | 57 +++++++++++++++++++++++++++++++++-------------------- 3 files changed, 44 insertions(+), 28 deletions(-) diff --git a/pdlua.c b/pdlua.c index 562340d..0177864 100644 --- a/pdlua.c +++ b/pdlua.c @@ -788,7 +788,7 @@ static void pdlua_motion(t_gobj *z, t_floatarg dx, t_floatarg dy, t_floatarg up) #endif { -#if !PLUGDATA +#ifndef PLUGDATA #ifndef PURR_DATA if (!up) #endif @@ -806,7 +806,7 @@ static void pdlua_motion(t_gobj *z, t_floatarg dx, t_floatarg dy, static int pdlua_click(t_gobj *z, t_glist *gl, int xpos, int ypos, int shift, int alt, int dbl, int doit){ t_pdlua *x = (t_pdlua *)z; -#if !PLUGDATA +#ifndef PLUGDATA if(x->has_gui) { int zoom = glist_getzoom(gl); @@ -842,13 +842,12 @@ static int pdlua_click(t_gobj *z, t_glist *gl, int xpos, int ypos, int shift, in static void pdlua_displace(t_gobj *z, t_glist *glist, int dx, int dy){ t_pdlua *x = (t_pdlua *)z; - if(x->has_gui) { x->pd.te_xpix += dx, x->pd.te_ypix += dy; dx *= glist_getzoom(glist), dy *= glist_getzoom(glist); -#if !PLUGDATA +#ifndef PLUGDATA gfx_displace((t_pdlua*)z, glist, dx, dy); #endif } @@ -1051,7 +1050,7 @@ static void pdlua_menu_open(t_pdlua *o) if (nw_gui_vmess) nw_gui_vmess("open_textfile", "s", pathname); else - sys_vgui("::pd_menucommands::menu_openfile {%s}\n", pathname); + pdgui_vmess("::pd_menucommands::menu_openfile", "s", pathname); #endif } else { lua_pop(__L(), 2); /* pop name, global "pd"*/ @@ -1449,7 +1448,7 @@ static int pdlua_object_new(lua_State *L) o->gfx.width = 80; o->gfx.height = 80; -#if !PLUGDATA +#ifndef PLUGDATA // Init graphics state for pd o->gfx.mouse_drag_x = 0; o->gfx.mouse_drag_y = 0; diff --git a/pdlua.h b/pdlua.h index e05942f..789b4e4 100644 --- a/pdlua.h +++ b/pdlua.h @@ -31,7 +31,7 @@ typedef struct _pdlua_gfx int width, height; void *object; -#if !PLUGDATA +#ifndef PLUGDATA char object_tag[128]; // Tcl/tk tag that is attached to all drawings char order_tag[64]; // Tag for invisible line, used to preserve correct object ordering char current_item_tag[64]; // Tcl/tk tag that is only attached to the current drawing in progress @@ -45,8 +45,10 @@ typedef struct _pdlua_gfx // Variables to keep track of mouse button state and drag position int mouse_drag_x, mouse_drag_y, mouse_down; int first_draw; +#ifndef PURR_DATA uint64_t* images; int num_images; +#endif #else int current_layer; void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*); // Callback to perform drawing in plugdata diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 7db1c31..4042c15 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -21,12 +21,14 @@ * */ +#if !defined(PLUGDATA) && !defined(PURR_DATA) #define NANOSVG_IMPLEMENTATION #include "svg/nanosvg.h" #define NANOSVGRAST_IMPLEMENTATION #include "svg/nanosvgrast.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "svg/stb_image_write.h" +#endif #ifdef PURR_DATA @@ -92,21 +94,28 @@ static int free_path(lua_State* L); static void pdlua_gfx_clear(t_pdlua *obj, int layer, int removed); // only for pd-vanilla, to delete all tcl/tk items void pdlua_gfx_free(t_pdlua_gfx *gfx) { -#if !PLUGDATA +#ifndef PLUGDATA for(int i = 0; i < gfx->num_layers; i++) { freebytes(gfx->layer_tags[i], 64); } freebytes(gfx->layer_tags, gfx->num_layers); if(gfx->transforms) freebytes(gfx->transforms, gfx->num_transforms * sizeof(gfx_transform)); - // TODO: delete images from tcl/tk? +#ifndef PURR_DATA + for(int i = 0; i < gfx->num_images; i++) + { + char image_name[64]; + snprintf(image_name, 64, "pix%llu", gfx->images[i]); + pdgui_vmess(0, "rrs", "image", "delete", image_name); + } if(gfx->num_images) freebytes(gfx->images, gfx->num_images * sizeof(uint64_t)); #endif +#endif } // Trigger repaint callback in lua script void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { -#if !PLUGDATA +#ifndef PLUGDATA o->gfx.first_draw = firsttime; #endif lua_getglobal(__L(), "pd"); @@ -120,7 +129,7 @@ void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { } lua_pop(__L(), 1); /* pop the global "pd" */ -#if !PLUGDATA +#ifndef PLUGDATA o->gfx.first_draw = 0; #endif } @@ -791,7 +800,9 @@ static void get_bounds_args(lua_State* L, t_pdlua *obj, int* x1, int* y1, int* x static void gfx_displace(t_pdlua *x, t_glist *glist, int dx, int dy) { #ifndef PURR_DATA - sys_vgui(".x%lx.c move .x%lx %d %d\n", glist_getcanvas(x->canvas), (long)x, dx, dy); + char obj_name[32]; + snprintf(obj_name, 32 ,".x%lx", (long)x); + pdgui_vmess(0, "crs ii", glist_getcanvas(x->canvas), "move", obj_name, dx, dy); #else gui_vmess("gui_text_displace", "xsii", glist_getcanvas(x->canvas), x->gfx.object_tag, dx, dy); #endif @@ -814,7 +825,6 @@ static int gfx_initialize(t_pdlua *obj) { t_pdlua_gfx *gfx = &obj->gfx; - t_object *ob = (t_object*)obj; #ifndef PURR_DATA snprintf(gfx->object_tag, 128, ".x%lx", (long)obj); gfx->object_tag[127] = '\0'; @@ -1369,7 +1379,7 @@ static uint64_t pdlua_image_hash(unsigned char *str) uint64_t hash = 5381; int c; - while (c = *str++) + while ((c = *str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ return hash; @@ -1400,7 +1410,7 @@ static char *pdlua_base64_encode(const unsigned char *data, char *encoded_data = malloc(output_length+1); if (encoded_data == NULL) return NULL; - for (int i = 0, j = 0; i < input_length;) { + for (size_t i = 0, j = 0; i < input_length;) { uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; @@ -1434,7 +1444,7 @@ static int draw_svg(lua_State* L) { float scale = (scale_x + scale_y) * 0.5f; char* svg_text = strdup(luaL_checkstring(L, 1)); - uint64_t svg_hash = pdlua_image_hash(svg_text); + uint64_t svg_hash = pdlua_image_hash((unsigned char*)svg_text); int x = luaL_checknumber(L, 2); int y = luaL_checknumber(L, 3); @@ -1458,7 +1468,7 @@ static int draw_svg(lua_State* L) { if(gfx->images[i] == svg_hash) { char image_name[64]; - snprintf(image_name, 64, "pix%lu", svg_hash); + snprintf(image_name, 64, "pix%llu", svg_hash); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); return 0; } @@ -1483,7 +1493,7 @@ static int draw_svg(lua_State* L) { int h = (int)image->height * scale; int image_size = w * h * channels; - char* bitmap_data = getbytes(image_size); + unsigned char* bitmap_data = getbytes(image_size); if (!bitmap_data) { pd_error(0, "[pdlua]: Failed to allocate memory for bitmap."); return 0; @@ -1500,7 +1510,7 @@ static int draw_svg(lua_State* L) { } // Encode PNG data to Base64 - char* encoded_png = pdlua_base64_encode((char*)png_buf, png_size); + char* encoded_png = pdlua_base64_encode((unsigned char*)png_buf, png_size); free(png_buf); if (!encoded_png) { @@ -1521,7 +1531,7 @@ static int draw_svg(lua_State* L) { gfx->num_images++; char image_name[64]; - snprintf(image_name, 64, "pix%lu", svg_hash); + snprintf(image_name, 64, "pix%llu", svg_hash); pdgui_vmess(0, "rrr s rs", "image", "create", "photo", image_name, "-data", encoded_png); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); @@ -1559,13 +1569,16 @@ static int stroke_path(lua_State* L) { #ifndef PURR_DATA pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "line", 0, 0, 0, 0, "-width", stroke_width, "-fill", gfx->current_color, "-tags", 3, tags); - sys_vgui(".x%lx.c coords %s", cnv, tags[1]); + t_float* transformed_coordinates = getbytes(path->num_path_segments * 2 * sizeof(t_float)); for (int i = 0; i < path->num_path_segments; i++) { - float x = path->path_segments[i * 2], y = path->path_segments[i * 2 + 1]; + float x = path->path_segments[i * 2], y = path->path_segments[i * 2 + 1]; transform_point_float(gfx, &x, &y); - sys_vgui(" %f %f", (x * canvas_zoom) + obj_x, (y * canvas_zoom) + obj_y); + transformed_coordinates[i * 2] = (x * canvas_zoom) + obj_x; + transformed_coordinates[i * 2 + 1] = (y * canvas_zoom) + obj_y; } - sys_vgui("\n"); + pdgui_vmess(0, "crs F", cnv, "coords", tags[1], path->num_path_segments*2, transformed_coordinates); + freebytes(transformed_coordinates, path->num_path_segments * 2 * sizeof(t_float)); + #else // PURR_DATA gui_start_vmess("gui_luagfx_stroke_path", "xsssi", cnv, tags[2], tags[1], gfx->current_color, stroke_width); @@ -1605,13 +1618,15 @@ static int fill_path(lua_State* L) { #ifndef PURR_DATA pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "polygon", 0, 0, 0, 0, "-width", 0, "-fill", gfx->current_color, "-tags", 3, tags); - sys_vgui(".x%lx.c coords %s", cnv, tags[1]); + t_float* transformed_coordinates = getbytes(path->num_path_segments * 2 * sizeof(t_float)); for (int i = 0; i < path->num_path_segments; i++) { - float x = path->path_segments[i * 2], y = path->path_segments[i * 2 + 1]; + float x = path->path_segments[i * 2], y = path->path_segments[i * 2 + 1]; transform_point_float(gfx, &x, &y); - sys_vgui(" %f %f", (x * canvas_zoom) + obj_x, (y * canvas_zoom) + obj_y); + transformed_coordinates[i * 2] = (x * canvas_zoom) + obj_x; + transformed_coordinates[i * 2 + 1] = (y * canvas_zoom) + obj_y; } - sys_vgui("\n"); + pdgui_vmess(0, "crs F", cnv, "coords", tags[1], path->num_path_segments*2, transformed_coordinates); + freebytes(transformed_coordinates, path->num_path_segments * 2 * sizeof(t_float)); #else // PURR_DATA gui_start_vmess("gui_luagfx_fill_path", "xsssi", cnv, tags[2], tags[1], gfx->current_color, 0); From c76c7dba11ca0da7b3d28047f54ed8dfa14d1b7c Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 6 Mar 2025 16:00:19 +0100 Subject: [PATCH 009/109] Add svg rendering demo to helpfile --- pdlua/hello-gui.pd_lua | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pdlua/hello-gui.pd_lua b/pdlua/hello-gui.pd_lua index 6bfdbe1..15bc04d 100644 --- a/pdlua/hello-gui.pd_lua +++ b/pdlua/hello-gui.pd_lua @@ -24,7 +24,7 @@ function hello:initialize(sel, atoms) self.mouse_down_pos = {0, 0} self.rect_down_pos = {0, 0} - self:set_size(630, 230) + self:set_size(720, 230) return true end @@ -153,6 +153,7 @@ function hello:paint(g) g:draw_text("Bezier Paths", 360, 190, 120, 12) g:draw_text("Animation", 460, 190, 120, 12) g:draw_text(" Mouse\nInteraction", 540, 190, 120, 12) + g:draw_text("SVG rendering", 630, 190, 120, 12) end function hello:paint_layer_2(g) @@ -168,6 +169,15 @@ function hello:paint_layer_3(g) g:draw_text("Drag\n me!", self.draggable_rect_x + 8, self.draggable_rect_y + 10, self.draggable_rect_size, 12) end +function hello:paint_layer_4(g) + -- Draggable rectangle + local svg_demo = [[ + + ]] + g:draw_svg(svg_demo, 650, 50) + g:draw_text("Drag\n me!", self.draggable_rect_x + 8, self.draggable_rect_y + 10, self.draggable_rect_size, 12) +end + function hello:tick() self.circle_y = self.circle_y + self.animation_speed if self.circle_y > 160 + self.circle_radius then From 4d49c3ecaa6948c86fb5fe122f0ce61c0acca268 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 7 Mar 2025 15:55:02 +0100 Subject: [PATCH 010/109] Fix bug when deleting a duplicate svg image --- pdlua_gfx.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 4042c15..839f813 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -105,7 +105,7 @@ void pdlua_gfx_free(t_pdlua_gfx *gfx) { for(int i = 0; i < gfx->num_images; i++) { char image_name[64]; - snprintf(image_name, 64, "pix%llu", gfx->images[i]); + snprintf(image_name, 64, ".x%llupix%llu", gfx, gfx->images[i]); pdgui_vmess(0, "rrs", "image", "delete", image_name); } if(gfx->num_images) freebytes(gfx->images, gfx->num_images * sizeof(uint64_t)); @@ -1468,7 +1468,7 @@ static int draw_svg(lua_State* L) { if(gfx->images[i] == svg_hash) { char image_name[64]; - snprintf(image_name, 64, "pix%llu", svg_hash); + snprintf(image_name, 64, ".x%llupix%llu", gfx, svg_hash); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); return 0; } @@ -1531,8 +1531,7 @@ static int draw_svg(lua_State* L) { gfx->num_images++; char image_name[64]; - snprintf(image_name, 64, "pix%llu", svg_hash); - + snprintf(image_name, 64, ".x%llupix%llu", gfx, svg_hash); pdgui_vmess(0, "rrr s rs", "image", "create", "photo", image_name, "-data", encoded_png); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); From 4d449d31dccc496ab0af38c50c3fecc80542bbc6 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 8 Mar 2025 15:14:25 +0100 Subject: [PATCH 011/109] Update example --- pdlua/hello-gui.pd_lua | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/pdlua/hello-gui.pd_lua b/pdlua/hello-gui.pd_lua index 15bc04d..bc560eb 100644 --- a/pdlua/hello-gui.pd_lua +++ b/pdlua/hello-gui.pd_lua @@ -58,7 +58,7 @@ function hello:mouse_drag(x, y) if dragging_rect == true then self.draggable_rect_x = self.rect_down_pos[0] + (x - self.mouse_down_pos[0]) self.draggable_rect_y = self.rect_down_pos[1] + (y - self.mouse_down_pos[1]) - self.draggable_rect_x = math.clamp(self.draggable_rect_x, 0, 620 - self.draggable_rect_size) + self.draggable_rect_x = math.clamp(self.draggable_rect_x, 0, 710 - self.draggable_rect_size) self.draggable_rect_y = math.clamp(self.draggable_rect_y, 0, 230 - self.draggable_rect_size) self:repaint(3) end @@ -153,7 +153,7 @@ function hello:paint(g) g:draw_text("Bezier Paths", 360, 190, 120, 12) g:draw_text("Animation", 460, 190, 120, 12) g:draw_text(" Mouse\nInteraction", 540, 190, 120, 12) - g:draw_text("SVG rendering", 630, 190, 120, 12) + g:draw_text(" SVG\nRendering", 640, 190, 120, 12) end function hello:paint_layer_2(g) @@ -171,11 +171,16 @@ end function hello:paint_layer_4(g) -- Draggable rectangle - local svg_demo = [[ - + local svg_demo_1 = [[ + ]] - g:draw_svg(svg_demo, 650, 50) - g:draw_text("Drag\n me!", self.draggable_rect_x + 8, self.draggable_rect_y + 10, self.draggable_rect_size, 12) + + local svg_demo_2 = [[ + + ]] + + g:draw_svg(svg_demo_1, 650, 40) + g:draw_svg(svg_demo_2, 650, 120) end function hello:tick() From 8502dee5d90d50b82ad73ee1b036d6a653c6e9a6 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 8 Mar 2025 15:19:09 +0100 Subject: [PATCH 012/109] Clean up hashing --- pdlua_gfx.h | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 839f813..c5a2d38 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -1374,7 +1374,8 @@ static int draw_text(lua_State* L) { return 0; } -static uint64_t pdlua_image_hash(unsigned char *str) +// Create single hash of svg text and render scale +static uint64_t pdlua_image_hash(unsigned char *str, float scale) { uint64_t hash = 5381; int c; @@ -1382,13 +1383,9 @@ static uint64_t pdlua_image_hash(unsigned char *str) while ((c = *str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ - return hash; -} - -uint32_t pdlua_float_hash(float f) { union { float f; uint32_t i; } u; u.f = f; - return u.i * 0x9E3779B9; + return hash ^ (u.i * 0x9E3779B9); } static char *pdlua_base64_encode(const unsigned char *data, @@ -1444,8 +1441,8 @@ static int draw_svg(lua_State* L) { float scale = (scale_x + scale_y) * 0.5f; char* svg_text = strdup(luaL_checkstring(L, 1)); - uint64_t svg_hash = pdlua_image_hash((unsigned char*)svg_text); - + uint64_t svg_hash = pdlua_image_hash((unsigned char*)svg_text, scale); + int x = luaL_checknumber(L, 2); int y = luaL_checknumber(L, 3); @@ -1457,8 +1454,6 @@ static int draw_svg(lua_State* L) { x *= canvas_zoom; y *= canvas_zoom; - svg_hash ^= pdlua_float_hash(scale); // Make sure we get a unique hash at each scale level - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA From f363065393bff65ec7f93fead231149482e90717 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 8 Mar 2025 15:19:53 +0100 Subject: [PATCH 013/109] Fix blunder --- pdlua_gfx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index c5a2d38..4b52767 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -1384,7 +1384,7 @@ static uint64_t pdlua_image_hash(unsigned char *str, float scale) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ union { float f; uint32_t i; } u; - u.f = f; + u.f = scale; return hash ^ (u.i * 0x9E3779B9); } From 96d3ceeced7005a711a3cbd79c88b61d4f71c075 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 11 Mar 2025 12:13:06 +0100 Subject: [PATCH 014/109] Fix warnings, fix potential freeze when rendering very large svg image --- pdlua_gfx.h | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 4b52767..a58a10d 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -105,7 +105,7 @@ void pdlua_gfx_free(t_pdlua_gfx *gfx) { for(int i = 0; i < gfx->num_images; i++) { char image_name[64]; - snprintf(image_name, 64, ".x%llupix%llu", gfx, gfx->images[i]); + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, gfx->images[i]); pdgui_vmess(0, "rrs", "image", "delete", image_name); } if(gfx->num_images) freebytes(gfx->images, gfx->num_images * sizeof(uint64_t)); @@ -1029,7 +1029,7 @@ static int end_paint(lua_State* L) { static int set_color(lua_State* L) { t_pdlua_gfx *gfx = pop_graphics_context(L); - int r, g, b, a; + int r, g, b; if (lua_gettop(L) == 1) { // Single argument: parse as color ID instead of RGB int color_id = luaL_checknumber(L, 1); if(color_id != 1) @@ -1056,7 +1056,7 @@ static int set_color(lua_State* L) { gfx->current_color[7] = '\0'; #else // ... but it is in Purr Data (nw.js gui) - a = 255; + int a = 255; if (lua_gettop(L) >= 4) { a = luaL_checknumber(L, 4)*255; } @@ -1445,8 +1445,9 @@ static int draw_svg(lua_State* L) { int x = luaL_checknumber(L, 2); int y = luaL_checknumber(L, 3); - + transform_point(gfx, &x, &y); + x += text_xpix((t_object*)obj, obj->canvas) / canvas_zoom; y += text_ypix((t_object*)obj, obj->canvas) / canvas_zoom; @@ -1463,7 +1464,7 @@ static int draw_svg(lua_State* L) { if(gfx->images[i] == svg_hash) { char image_name[64]; - snprintf(image_name, 64, ".x%llupix%llu", gfx, svg_hash); + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, svg_hash); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); return 0; } @@ -1484,8 +1485,10 @@ static int draw_svg(lua_State* L) { } const int channels = 4; - int w = (int)image->width * scale; - int h = (int)image->height * scale; + // Apply scale, limit size to object size + // This is not perfect clipping, but it at least prevents accidental large images from freezing pd + int w = (int)fmax(image->width * scale, gfx->width * canvas_zoom); + int h = (int)fmax(image->height* scale, gfx->height * canvas_zoom); int image_size = w * h * channels; unsigned char* bitmap_data = getbytes(image_size); @@ -1526,7 +1529,7 @@ static int draw_svg(lua_State* L) { gfx->num_images++; char image_name[64]; - snprintf(image_name, 64, ".x%llupix%llu", gfx, svg_hash); + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, svg_hash); pdgui_vmess(0, "rrr s rs", "image", "create", "photo", image_name, "-data", encoded_png); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); From 515875bec19a47c0894c497a33019086b38ddf89 Mon Sep 17 00:00:00 2001 From: "Charles K. Neimog" Date: Wed, 2 Apr 2025 17:09:36 -0300 Subject: [PATCH 015/109] add function `_properties_add`, `_properties_newframe`, `_properties_addcheckbox`, `_properties_addtextinput` and `_properties_addcolorpicker` --- pdlua.c | 24 ++++++++++++++++++++++++ pdlua.h | 11 +++++++++++ 2 files changed, 35 insertions(+) diff --git a/pdlua.c b/pdlua.c index 562340d..ca14f1b 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1403,6 +1403,11 @@ static int pdlua_class_new(lua_State *L) pdlua_widgetbehavior.w_visfn = pdlua_vis; pdlua_widgetbehavior.w_activatefn = pdlua_activate; class_setwidget(c_gfx, &pdlua_widgetbehavior); + + // NOTE: It is possible to do this just for the object, not all gui objects + class_setpropertiesfn(c_gfx, pdlua_properties); + class_addmethod(c_gfx, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); + } lua_pushlightuserdata(L, c); @@ -2802,6 +2807,25 @@ static void pdlua_init(lua_State *L) lua_pushstring(L, "_error"); lua_pushcfunction(L, pdlua_error); lua_settable(L, -3); + + // properties + lua_pushstring(L, "_properties_add"); + lua_pushcfunction(L, pdlua_properties_add); + lua_settable(L, -3); + + lua_pushstring(L, "_properties_newframe"); + lua_pushcfunction(L, pdlua_properties_newframe); + lua_settable(L, -3); + lua_pushstring(L, "_properties_addcheckbox"); + lua_pushcfunction(L, pdlua_properties_addcheckbox); + lua_settable(L, -3); + lua_pushstring(L, "_properties_addtextinput"); + lua_pushcfunction(L, pdlua_properties_addtextinput); + lua_settable(L, -3); + lua_pushstring(L, "_properties_addcolorpicker"); + lua_pushcfunction(L, pdlua_properties_addcolorpicker); + lua_settable(L, -3); + /* 20240906 ag: Added TIMEUNITPERMSEC, systime and timesince, to make clock_set useable. NOTE: TIMEUNITPERMSEC is the time unit for systime, timesince, and clock_set and is from m_sched.c. It isn't in the Pd diff --git a/pdlua.h b/pdlua.h index 0b2f24a..a4263a5 100644 --- a/pdlua.h +++ b/pdlua.h @@ -45,6 +45,17 @@ typedef struct _pdlua_gfx // Variables to keep track of mouse button state and drag position int mouse_drag_x, mouse_drag_y, mouse_down; int first_draw; + + // variables to set properties + t_symbol *current_frame; + t_symbol *properties_receiver; + int frame_count; + int max_col, max_row; + int current_col, current_row; + + int checkbox_count; + int numberbox_count; + int colorpicker_count; #else int current_layer; From 532b6990ca0a7445b9c2e14300232515c972f82e Mon Sep 17 00:00:00 2001 From: "Charles K. Neimog" Date: Wed, 2 Apr 2025 18:50:03 -0300 Subject: [PATCH 016/109] add methods for pd --- pd.lua | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/pd.lua b/pd.lua index 28b5dd1..b99e774 100644 --- a/pd.lua +++ b/pd.lua @@ -91,6 +91,30 @@ pd._perform_dsp = function (object, ...) end end +-- draw properties +pd._properties = function (object) + local obj = pd._objects[object] + if nil ~= obj and type(obj.properties) == "function" then + obj:properties() + return true + else + pd.post("not found") + return false + end +end + +-- set properties +pd._set_properties = function (object, method, args) + pd.post(method) + local obj = pd._objects[object] + if obj ~= nil and type(obj[method]) == "function" then + local propertiesmethod = obj[method] + propertiesmethod(obj, args) -- Passa `obj` explicitamente como `self` + else + pd._error(obj._object, "method ".. method .. " does not exist") + end +end + -- repaint method dispatcher pd._repaint = function (object) local obj = pd._objects[object] @@ -457,6 +481,26 @@ function pd.Class:set_args(args) pd._set_args(self._object, args) end +function pd.Class:addproperties() + pd._properties_add(self._object) +end + +function pd.Class:newframe(title, max_col) + pd._properties_newframe(self._object, title, max_col) +end + +function pd.Class:addcheckbox(text, method, init_value) + pd._properties_addcheckbox(self._object, text, method, init_value) +end + +function pd.Class:addtextinput(text, method, init_value, width) + pd._properties_addtextinput(self._object, text, method, init_value, width) +end + +function pd.Class:addcolorpicker(text, method) + pd._properties_addcolorpicker(self._object, text, method) +end + function pd.Class:canvas_realizedollar(s) return pd._canvas_realizedollar(self._object, s) end From 7cdbd9f1e8b3f49d20cfe3e6cc0e156555f33732 Mon Sep 17 00:00:00 2001 From: "Charles K. Neimog" Date: Wed, 2 Apr 2025 18:50:35 -0300 Subject: [PATCH 017/109] add method for create `frame`, `checkbox`, `textinput`, `colorpicker` --- pdlua_gfx.h | 464 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 464 insertions(+) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index a3f32ab..cf5381a 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -1582,3 +1582,467 @@ static int free_path(lua_State* L) freebytes(path->path_segments, path->num_path_segments_allocated * sizeof(int)); return 0; } + +// ╭─────────────────────────────────────╮ +// │ PROPERTIES │ +// ╰─────────────────────────────────────╯ +#ifndef PURR_DATA + +static void pdlua_properties_createdialog(t_pdlua_gfx *o) +{ + pdgui_vmess(0, "ssss", "toplevel", o->properties_receiver->s_name, "-class", "DialogWindow"); + pdgui_vmess(0, "ssss", "wm", "title", o->properties_receiver->s_name, "{[mydialog] Properties}"); + pdgui_vmess(0, "sss", "wm", "group", o->properties_receiver->s_name, "."); + pdgui_vmess(0, "sssii", "wm", "resizable", o->properties_receiver->s_name, 0, 0); + + pdgui_vmess(0, "sss", "wm", "transient", o->properties_receiver->s_name, "$::focused_window"); + pdgui_vmess(0, "ssss", o->properties_receiver->s_name, "configure", "-menu", "$::dialog_menubar"); + pdgui_vmess(0, "sssfsf", o->properties_receiver->s_name, "configure", "-padx", 0.0f, "-pady", 0.0f); +} + +static void pdlua_properties_updaterow(t_pdlua_gfx *o) +{ + o->current_col++; + if (o->current_col == o->max_col) { + o->current_row++; + o->current_col = 0; // not used for now + } +} + +static void pdlua_properties_setupbuttons(t_pdlua_gfx *o) { + char buttonsId[MAXPDSTRING]; + snprintf(buttonsId, MAXPDSTRING, ".%p.buttons", (void *)o); + + char buttonCancelId[MAXPDSTRING]; + char buttonApplyId[MAXPDSTRING]; + char buttonOkId[MAXPDSTRING]; + snprintf(buttonCancelId, MAXPDSTRING, ".%p.buttons.cancel", (void *)o); + snprintf(buttonApplyId, MAXPDSTRING, ".%p.buttons.apply", (void *)o); + snprintf(buttonOkId, MAXPDSTRING, ".%p.buttons.ok", (void *)o); + + char destroyCommand[MAXPDSTRING]; + snprintf(destroyCommand, MAXPDSTRING, "destroy .%p", (void *)o); + + // Criando o frame dos botões + pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); + pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); + + + // Cancel (Close window) + pdgui_vmess(0, "ssssss", "button", buttonCancelId, "-text", "Cancel", "-command", + destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); + + // Apply (send all data to pd and lua obj) for this must be necessary to save all the variables used in the object in a char [128][MAXPDSTRING], + // I don't think that this is good, or there is better solution? + // TODO: Need to dev the apply command + pdgui_vmess(0, "ssss", "button", buttonApplyId, "-text", "Apply"); + // pdgui_vmess(0, "ssssss", "button", buttonApplyId, "-text", "Apply", "-command", command); + pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); + + // Ok + pdgui_vmess(0, "ssssss", "button", buttonOkId, "-text", "OK", "-command", destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); +} + +static int pdlua_properties_newframe(lua_State *L) +{ + + t_pdlua *pdlua; + const char *s; + + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) + { + pdlua = lua_touserdata(L, 1); + const char *title = lua_tostring(L, 2); + int col = lua_tonumber(L, 3); + t_pdlua_gfx *o = &pdlua->gfx; + if (o) + { + o->frame_count++; + char current_frameid[MAXPDSTRING]; + snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)o, o->frame_count); + o->current_frame = gensym(current_frameid); + + // raised, sunken, flat, ridge, solid, and groove. + // Create main frame for set of configurations + pdgui_vmess(0, "sssssi", "frame", current_frameid, "-relief", "groove", "-borderwidth", 1); + pdgui_vmess(0, "sssssssisi", "pack", current_frameid, "-side", "top", "-fill", "x", "-padx", 10, + "-pady", 10); + + // Title of the Frame + char labelid[MAXPDSTRING]; + snprintf(labelid, MAXPDSTRING, "%s.title", current_frameid); + pdgui_vmess(0, "ssss", "label", labelid, "-text", title); + pdgui_vmess(0, "sssssf", "pack", labelid, "-side", "top", "-pady", 5.f); + + // Create content frame with grid layout + char content_frameid[MAXPDSTRING]; + snprintf(content_frameid, MAXPDSTRING, "%s.content", current_frameid); + pdgui_vmess(0, "ss", "frame", content_frameid); + pdgui_vmess(0, "ssss", "pack", content_frameid, "-side", "top", "-fill", "x"); + + // Configure grid with 2 equal columns + for (int i = 0; i < col; i++) { + pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frameid, i, "-weight", 1); + } + o->current_frame = gensym(content_frameid); + o->max_col = col; + o->current_col = 0; + o->current_row = 0; + } else{ + mylua_error(__L(), pdlua, "properties"); + } + } else{ + mylua_error(__L(), pdlua, "properties"); + + } + return 0; +} + +static int pdlua_properties_addcheckbox(lua_State *L) +{ + t_pdlua *pdlua; + const char *s; + + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) + { + pdlua = lua_touserdata(L, 1); + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + int init_value = lua_tonumber(L, 4); + if (pdlua == NULL){ + return 0 ; + } + + t_pdlua_gfx *o = &pdlua->gfx; + if (o) + { + char pdsend[MAXPDSTRING]; + char checkid[MAXPDSTRING]; + char checkvariable[MAXPDSTRING]; + char sanitized_frame[MAXPDSTRING]; + o->checkbox_count++; + + // Sanitize frame name (replace '.' with '_') + snprintf(sanitized_frame, MAXPDSTRING, "%s", o->current_frame->s_name); + for (char *p = sanitized_frame; *p != '\0'; p++) { + if (*p == '.') { + *p = '_'; + } + } + + // Generate unique variable name + snprintf(checkvariable, MAXPDSTRING, "::checkbox%d_%s_state", o->checkbox_count, + sanitized_frame); + + // Initialize the Tcl variable to 0 (unchecked) + pdgui_vmess(0, "ssi", "set", checkvariable, init_value); + + // Build the pdsend command + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties checkbox %s $%s]", + o->properties_receiver->s_name, method, checkvariable); + + // Create the checkbox + snprintf(checkid, MAXPDSTRING, "%s.check%d", o->current_frame->s_name, o->checkbox_count); + pdgui_vmess(0, "ssssssss", "checkbutton", checkid, "-text", text, "-variable", checkvariable, + "-command", pdsend); + + pdgui_vmess(0, "sssisi", "grid", checkid, "-row", o->current_row, "-column", o->current_col, + "-sticky", "we"); + pdlua_properties_updaterow(o); + } else { + mylua_error(__L(), pdlua, "addcheckbox"); + } + } else { + mylua_error(__L(), pdlua, "addcheckbox"); + } + return 0; +} + + +static int pdlua_properties_addtextinput(lua_State *L) +{ + t_pdlua *pdlua; + const char *s; + + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) + { + pdlua = lua_touserdata(L, 1); + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + const char *init_value = lua_tostring(L, 4); + int width = lua_tonumber(L, 5); + if (pdlua == NULL){ + mylua_error(__L(), pdlua, "pdlua is NULL"); + return 0 ; + } + + t_pdlua_gfx *o = &pdlua->gfx; + if (o) + { + char pdsend[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char buttonid[MAXPDSTRING]; + char entryid[MAXPDSTRING]; + + char numvariable[MAXPDSTRING]; + + char sanitized_frame[MAXPDSTRING]; + o->numberbox_count++; + + // Sanitize frame name (replace '.' with '_') + snprintf(sanitized_frame, MAXPDSTRING, "%s", o->current_frame->s_name); + for (char *p = sanitized_frame; *p != '\0'; p++) { + if (*p == '.') { + *p = '_'; + } + } + + // Variable save the value of gui obj + snprintf(numvariable, MAXPDSTRING, "::numberbox%d_%s_value", o->numberbox_count, + sanitized_frame); + pdgui_vmess(0, "sss", "set", numvariable, init_value); + + // Command to send it to pd + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", + o->properties_receiver->s_name, method, numvariable); + + // container for button to set and text input + char text_button_frame[MAXPDSTRING]; + snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", o->current_frame->s_name, + o->numberbox_count); + pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 1, + "-padx", 5, "-pady", 5); + + // create text for identification + snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, o->numberbox_count); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); + + // Create the number entry box + snprintf(entryid, MAXPDSTRING, "%s.numberbox%d", text_button_frame, o->numberbox_count); + pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", numvariable, "-width", width); + + // Create the set button + snprintf(buttonid, MAXPDSTRING, "%s.setbutton%d", text_button_frame, o->numberbox_count); + pdgui_vmess(0, "sssssssisi", "button", buttonid, "-text", "Set", "-command", pdsend, "-padx", + 10, "-pady", 0); + + // Pack the entry and button side by side + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", entryid, "-side", "left"); + pdgui_vmess(0, "ssss", "pack", buttonid, "-side", "right"); + pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", o->current_row, "-column", + o->current_col, "-sticky", "we", "-padx", 20, "-pady", 20); + pdlua_properties_updaterow(o); + } else{ + mylua_error(__L(), pdlua, "pdlua_gfx is NULL"); + } + } else { + mylua_error(__L(), pdlua, "Types checks failed"); + } + return 0; +} + +// static int pdlua_dialog_createcolorpicker(t_pdlua *x, const char *text, const char *method) { +static int pdlua_properties_addcolorpicker(lua_State *L) { + t_pdlua *pdlua; + const char *s; + + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) + { + pdlua = lua_touserdata(L, 1); + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + // const char *init_value = lua_tostring(L, 4); // TODO: set color here with table maybe? + if (pdlua == NULL){ + return 0 ; + } + + t_pdlua_gfx *o = &pdlua->gfx; + if (o) + { + + char pdsend[MAXPDSTRING]; + char buttonid[MAXPDSTRING]; + char colorvariable[MAXPDSTRING]; + char sanitized_frame[MAXPDSTRING]; + o->colorpicker_count++; + + // Sanitize frame name (replace '.' with '_') + snprintf(sanitized_frame, MAXPDSTRING, "%s", o->current_frame->s_name); + for (char *p = sanitized_frame; *p != '\0'; p++) { + if (*p == '.') { + *p = '_'; + } + } + + // Generate unique variable name + snprintf(colorvariable, MAXPDSTRING, "::colorpicker%d_%s_value", o->colorpicker_count, + sanitized_frame); + + // Initialize the Tcl variable to a default color + pdgui_vmess(0, "sss", "set", colorvariable, "#ffffff"); + + // Build the pdsend command to trigger color picker and send result + snprintf(pdsend, MAXPDSTRING, + "eval pdsend [concat %s _properties colorpicker %s [tk_chooseColor -initialcolor {#ffffff} -title {Choose color}]]", + o->properties_receiver->s_name, method); + + // Create the color picker button with the constructed command + snprintf(buttonid, MAXPDSTRING, "%s.colorpicker%d", o->current_frame->s_name, + o->colorpicker_count); + pdgui_vmess(0, "ssssss", "button", buttonid, "-text", text, "-command", pdsend); + + pdgui_vmess(0, "sssisi", "grid", buttonid, "-row", o->current_row, "-column", o->current_col, + "-sticky", "we"); + pdlua_properties_updaterow(o); + + } else { + mylua_error(__L(), pdlua, "addcolorpicker"); + } + } else { + mylua_error(__L(), pdlua, "addcolorpicker"); + } +} + + +static void pdlua_properties(t_gobj *z, t_glist *owner) { + t_pdlua *pdlua = (t_pdlua *)z; + t_pdlua_gfx *o = &pdlua->gfx; + + char receiver[MAXPDSTRING]; + snprintf(receiver, MAXPDSTRING, ".%p", o); + o->properties_receiver = gensym(receiver); + o->current_frame = NULL; + pd_bind(&pdlua->pd.ob_pd, o->properties_receiver); // new to unbind + + pdlua_properties_createdialog(o); // <-- create hidden window + + // main window + char frameId[MAXPDSTRING]; + snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)o); + pdgui_vmess(0, "sss", "wm", "deiconify", o->properties_receiver->s_name); // <- on sucess show the window + pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); + pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); + pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); + + // call _properties + lua_getglobal(__L(), "pd"); + lua_getfield (__L(), -1, "_properties"); + lua_pushlightuserdata(__L(), pdlua); + if (lua_pcall(__L(), 1, 1, 0)) + { + mylua_error(__L(), pdlua, "properties"); + pdgui_vmess(0, "ss", "destroy", o->properties_receiver->s_name); + return; + } + + // Get the return value (Lua pushes it onto the stack) + int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) + lua_pop(__L(), 1); // Remove the result from the stack + if (!result) + { + pdgui_vmess(0, "ss", "destroy", o->properties_receiver->s_name); + return; + } + pdlua_properties_setupbuttons(o); // <- this is independed of all previous containers + +} + +#include + +static void pdlua_properties_receiver(t_pdlua *o, t_symbol *s, int argc, t_atom *argv) +{ + if (argc < 2) + return; + + lua_getglobal(__L(), "pd"); + lua_getfield(__L(), -1, "_set_properties"); + lua_remove(__L(), -2); + + lua_pushlightuserdata(__L(), o); + lua_pushstring(__L(), atom_getsymbol(argv + 1)->s_name); + lua_newtable(__L()); // Criando a tabela + + const char *guitype = atom_getsymbol(argv)->s_name; + if (strcmp(guitype, "colorpicker") == 0) + { + const char *hexcolor = atom_getsymbol(argv + 2)->s_name; + int isvalid = 1; + + if (hexcolor == NULL || hexcolor[0] != '#' || strlen(hexcolor) != 7) { + isvalid = 0; + } else { + for (int i = 1; i < 7; i++) { + if (!isxdigit(hexcolor[i])) isvalid = 0; + } + } + + if (!isvalid) { + pd_error(o, "Invalid color string"); + return; + } + + int r, g, b; + if (sscanf(hexcolor + 1, "%2x%2x%2x", &r, &g, &b) == 3) { + lua_newtable(__L()); + lua_pushinteger(__L(), r); + lua_rawseti(__L(), -2, 1); + lua_pushinteger(__L(), g); + lua_rawseti(__L(), -2, 2); + lua_pushinteger(__L(), b); + lua_rawseti(__L(), -2, 3); + lua_rawseti(__L(), -2, 1); // Insert inner table as the first element of the outer table + } else { + pd_error(o, "Invalid color format in sscanf"); + return; + } + } else{ + for (int i = 2; i < argc; i++) + { + if (argv[i].a_type == A_FLOAT) + { + lua_pushnumber(__L(), atom_getfloat(argv + i)); + lua_rawseti(__L(), -2, i - 1); // Store at index (1-based in Lua) + } + else if (argv[i].a_type == A_SYMBOL) + { + lua_pushstring(__L(), atom_getsymbol(argv + i)->s_name); + lua_rawseti(__L(), -2, i - 1); + } + } + } + + if (lua_pcall(__L(), 3, 0, 0)) + { + mylua_error(__L(), o, "_set_properties"); // Handle error + lua_pop(__L(), 1); // Pop error message + return; + } +} + +static int pdlua_properties_add(lua_State *L) +{ + t_pdlua *lua_class; + const char *s; + if (lua_islightuserdata(L, 1)) + { + lua_class = lua_touserdata(L, 1); + if (lua_class) + { + // NOTE: Something like this would be nice + // class_setpropertiesfn((t_class *)lua_class->pd.te_g.g_pd, pdlua_properties); + // return 1; + } + } + return 0; +} + + +#endif + + From d9ca11c5add911b970e4c3a9ecd02e2e00558203 Mon Sep 17 00:00:00 2001 From: "Charles K. Neimog" Date: Wed, 2 Apr 2025 18:50:47 -0300 Subject: [PATCH 018/109] add simple example --- pd.lua | 1 - pdlua/tutorial/examples/properties-help.pd | 5 ++ pdlua/tutorial/examples/properties.pd_lua | 64 ++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 pdlua/tutorial/examples/properties-help.pd create mode 100644 pdlua/tutorial/examples/properties.pd_lua diff --git a/pd.lua b/pd.lua index b99e774..ab8e080 100644 --- a/pd.lua +++ b/pd.lua @@ -105,7 +105,6 @@ end -- set properties pd._set_properties = function (object, method, args) - pd.post(method) local obj = pd._objects[object] if obj ~= nil and type(obj[method]) == "function" then local propertiesmethod = obj[method] diff --git a/pdlua/tutorial/examples/properties-help.pd b/pdlua/tutorial/examples/properties-help.pd new file mode 100644 index 0000000..13fa5c7 --- /dev/null +++ b/pdlua/tutorial/examples/properties-help.pd @@ -0,0 +1,5 @@ +#N canvas 963 23 951 1016 10; +#X declare -lib pdlua; +#X obj 5 7 declare -lib pdlua; +#X obj 254 59 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; +#X obj 66 69 properties; diff --git a/pdlua/tutorial/examples/properties.pd_lua b/pdlua/tutorial/examples/properties.pd_lua new file mode 100644 index 0000000..4860ad5 --- /dev/null +++ b/pdlua/tutorial/examples/properties.pd_lua @@ -0,0 +1,64 @@ +local properties = pd.Class:new():register("properties") + +function properties:initialize(sel, atoms) + self.inlets = 1 + self.outlets = 1 + self.phase = 0 + self:addproperties() + self:set_size(127, 127) + + self.checkbox1 = 1 + self.checkbox2 = 1 + self.color = {155,155,155} + + self.textinput1 = "Hello" + self.textinput2 = 40 + self.bigstring = "Uidsja hasd asdhj asdy asdhjasd" + + return true +end + +function properties:properties() + self:newframe("First CheckBox", 2) + self:addcheckbox("Check Box 1", "updatecheckbox1", self.checkbox1) + self:addcheckbox("Check Box 2", "updatecheckbox2", self.checkbox2) + + self:newframe("First textinput", 2) + self:addtextinput("Check textinput 1", "updatetext1", self.textinput1, 5) + self:addtextinput("Check textinput 2", "updatetext2", self.textinput2, 5) + + self:newframe("My Color Picker", 1) + self:addcolorpicker("Background", "updatecolorbg"); +end + +function properties:updatecolorbg(args) + self.color[1] = args[1][1] + self.color[2] = args[1][2] + self.color[3] = args[1][3] + self:repaint(1) +end + +function properties:updatetext1(args) + self.textinput1 = args[1] + pd.post("textinput1 is now " .. self.textinput1); +end + +function properties:updatetext2(args) + self.textinput2 = args[1] + pd.post("textinput2 is now " .. self.textinput2); +end + +function properties:updatecheckbox1(args) + self.checkbox1 = args[1] + pd.post("checkbox1 is now " .. self.checkbox1); +end + +function properties:updatecheckbox2(args) + self.checkbox2 = args[1] + pd.post("checkbox2 is now " .. self.checkbox2); +end + +function properties:paint(g) + g:set_color(table.unpack(self.color)) + g:fill_all() +end From f19c63e41075a1524ace1812a56b056faeda2b98 Mon Sep 17 00:00:00 2001 From: "Charles K. Neimog" Date: Wed, 2 Apr 2025 19:06:17 -0300 Subject: [PATCH 019/109] fix colorpick args, following default for args in pdlua --- pdlua_gfx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index cf5381a..a7b64a1 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -1996,7 +1996,7 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol *s, int argc, t_atom lua_rawseti(__L(), -2, 2); lua_pushinteger(__L(), b); lua_rawseti(__L(), -2, 3); - lua_rawseti(__L(), -2, 1); // Insert inner table as the first element of the outer table + lua_rawseti(__L(), -2, 1); } else { pd_error(o, "Invalid color format in sscanf"); return; From 8badd68c7642550ae527067125ad5881a561a5a3 Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Fri, 20 Jun 2025 23:51:17 +0200 Subject: [PATCH 020/109] replace sys_trytoopenone() with public open_via_path() --- pdlua.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pdlua.c b/pdlua.c index 562340d..95ebb68 100644 --- a/pdlua.c +++ b/pdlua.c @@ -62,13 +62,9 @@ typedef void (*t_signal_setmultiout)(t_signal **, int); static t_signal_setmultiout g_signal_setmultiout; -// This used to be in s_stuff.h, but not anymore since 0.55.1test1. -int sys_trytoopenone(const char *dir, const char *name, const char* ext, - char *dirresult, char **nameresult, unsigned int size, int bin); - // Check for absolute filenames in the second argument. Otherwise, -// sys_trytoopenone will happily prepend the given path anyway. -#define trytoopenone(dir, name, ...) sys_trytoopenone(sys_isabsolutepath(name) ? "" : dir, name, __VA_ARGS__) +// open_via_path will happily prepend the given path anyway. +#define trytoopenone(dir, name, ...) open_via_path(sys_isabsolutepath(name) ? "" : dir, name, __VA_ARGS__) #ifdef PDINSTANCE From a1828cec722ef29ee0c17f2d280e99c9ed6261bb Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 25 Jul 2025 19:17:07 +0200 Subject: [PATCH 021/109] Compress documentation pdf file for plugdata shipping --- pdlua/tutorial/pd-lua-intro.pdf | Bin 1608381 -> 962527 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pdlua/tutorial/pd-lua-intro.pdf b/pdlua/tutorial/pd-lua-intro.pdf index 3f93aab0be03442b5eeeb7b71c8efbe1be4eeb60..09a341186e14191d52ca4626f3ace4846d4c8525 100644 GIT binary patch literal 962527 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­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

IwABuW79Z;T5M`m80|G!1DKt z9vGhiXK~od8%x6v61MrpR+&#cI9xQZcfa>-H=;ifUwNP^C2 zwaQkuIp{Z3m962Q11QTn^1B!;5jTPV{dI+`SiNMoJP+cZgvAAspDb#Re>E?O&%O33 zA3H~q;Z~XS+ftqNeckV`CTWRGg zxKAlt;(1SzSf%Ht*m<$kyE=pMt9qG)B1@etktSW51JsYb#{6O#eDo}}CjjyV#R>${ zi~r3C1q9rP6*;1bQgyxa*1b`Pk^6OnoF`{Gc0`h_AcUqkH@D z43XrcGOy@)u=O3oq{`HeP3ZufA-8P>#mNyuyVI9XIhm%7q&ijV|KjbPgJg@=Y~QkN zTf1!Awr!icY`bb#)h^q%ZQHhOzdEO1-#E9s?~RTZ_uYRoXRNg{Gh$`tjBn0w{KiP) zr(Xi@6}H?K)+PbT;GfTaQ=Vj~+f==TdNnew{sltB01`b%d!(eXMuJ3PFgbhZ=0IF3O5u-slULdg`5Aezu3 z#}^_%Dc~HT0a|uCS|}&14zs#+cVfy5SRfD{ZaNtwL1)jS{kC`}p}=UCM(D(x3ltRE~tSh|{l$?j-Gy9br1g zS-xOqzSZAm0gjJq(?v>G>v)VG9|!GIq6164$F}6x4$q~GZEt6RiHYEswxmsok0;BJ zr%}$LP{fvPyYr3Tg~MH8M8!-eQJs*j*0$CnRw7m$>t+Ud>|L^9U!=%%Y;<|x4vE~B zZ&UJgB3E0paa@@blMT9v$6iH`^rA=!|OEDrUsiEGi#|aK@}HL4Sfu zrnr(U#D}MnGUI%8t{w!o;C-n)kniI2w$?Lh7MsV{SZCqE>o!aI9AnkhKKL;m z;48;3xmz4%5vwN?mXBmdifLPg13M>43DDAseX{0zT?+@AHOe|nO5e(PxCTxlpA(f+ z5>)}tC(Cp`_6|uF!=>_#0Cn@7wk1=EKfd(#`d|nDbM?i*^slA}|EDUGe?{H?S^E5x zM*rV%{r^^J@;^{FW_J4jgu0=uHdPjl3OG(Vb43$`A%Q?f`aBBUB^z5d;fK#�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 z W883ihr^0pvd#F_-Au!yDX*L|= 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ˌi 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ℑ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%0Am*72)B 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 z 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%0ASbcDMAO6ylG7ZRYG4DNujNcv#nqIC)@9h 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

;pvPq6Z0iBMJSO*lqWi*9K72v z$NT^yslGp;(Zp_CxFEh97oS6aV9DA;o8bp`$mE`#jV4RMs-dKt@WKzFHoon%X&_OU zoP&Vlz(*qa&@`?igjDcFRA&F!XIT(V*BDr>vHmu}HWp?Iy>wWX#lFTn);Z2DOUlO1 z*i!qZ12){pXEvN2SKfbWPu(&i`tH&Gi4;1e=qc zmHmIZXLTfFXj<*N{#2LL10=dB&OT$^UWtHomQ!tfV!?oAij{2>;hO+vEdx z`|yXq^L^M>_Y=xw>Xzi|>+PES?%LP=W%GLel>W<2azDd=QsS(c@TlX7ndRZNfBd>D zNlBs@|MMLwG{dg!y!A0IWoc{eG~}B8t1j@H(C_;Vcome4cfVNH?AYpt6jgk1+&!2wBBY^-JPAuf4))QbABeOJ->Bl z`#k5QRP)1dR+3hcKNp|zQ*>v&6OJTOOYOB6rOb=Y39IjKYfnoda}nVhiMQp1$mTt8 zKK5{eN+mWj%IG~b5p7OU`^-+|Ie@XuPPLj9G0%016cPI{P(djUnp@5|?;-{4bw|bv z6J&M?yzQje$J+PMwEPs1)s1&SIT_RbUZL}omPCf*he!9ZO^G8hq0mT3=`b=zb;;{HWIX)8BJe^;4*glc{8xCP>V> zG!slF3qdeC^6{WxBL#W9o4%wmX+8zLxK@zc+YncFe{UA+Mh=%g05h~hmJ zEda9op`d?FXMt(}*~F`cPtukJ(`D~nw`7z3Bw(y~Rys252@hvZvG!eyA>$KxTU|;> z5F(Drb+GJVOT&hYzf?NpIUxcIv0&vaSUIs=#!;fjjyua)cYv@sxIpE%d3?4!dd2)@ zX&fn^7!24VX+Pv@#nY5p(3$mqdx#$c3dk`LQ%eiOC`bGeJAmmA!#)=?i!MIK=7B4W zf9Uf}KLV%cQZKbRIpy8$v`&xvr~c159e80kuTop$=EdP->D-%)Lxug|PM3a8#erYK zG}6{Zh?9{Q&#(#9DaC;%r}SP8^gUCM^o!VY&|zDUR-yffs&;6Lox1v|tvZ^}h^?m$ z_h-_16AXF3&p^u-^{LR3Gb({phRIb%LyW;LJ2Y|3YXOran(R~_=}uO^Vl479=A830 z_KVEvVnTGG3%^2g3<(lk~Fa z&Nk2=(?;D?+&R1L>t&0-;xnT+Qv)2znZ42RW%0|($L?%~%JKgMv40$uC(S?Uv2S}j za9B=EqoJD|345oPFEi9vA3Ica%B;1QALEHmm(Ocyn`%i`O;5hktfbytzsHPp+R@md z`i`j6*tEMz8v!+22R{ulN`yb~qD15`A6S#M+#<~7n08F?onw%1vAbz;4_F#>V`W{V z0i-F>K>A-qu|Qzke^MGA6z78Q?+4m%qBtHy}z6 zgl2Z#4Aqm_a&+FC>+2Fz(;mIS>MVat?TkR5M@3J_dSq7sj-E9K@`Kc`&IJXqn($_JaFSh0q9F@zK-Fys9|KrX~v%Q6n8t zUX2~6H*tHmvzuw`0NBr>F&3={`Mfb8Mk`6iXjrMW)$HxO6kx&*(beSl5$3>oj6q(x zC2ErpZ+Y3(jl{#qmJRvoCGZ~07m+mW|6VtL<&tLz&b|VFo0)IM517=}ol36gY@? zzmEXA7C|M=KpEgMKQf{#N`$PqU>)#$VxL$$J%5KjNb{9O0T222O9~CC;|I{W7GNP3 z`ARF)#)=kS!zck+g(jwC`Kq(hB~VxM3hY>5PmVc-Txv&1e*i3(U((94z;7Z%6PhwJ z@kI{#sS$<0NZ)*BHk)Uter9vvrQh`MG>z%m(QE#uZ^&rr-z)I5>Xnsk!44oY6=Ykn zbyUP_rTG%;8OiMG;D~}nY%sjI0QGE~#cARYSd(oaS%nW~QOQUjas-sRN<*{pD+m zVyt{--Ny@-kG+mzt(2-lwoyQ^rm^Z?S6{EG3H2SiX-&BT0w! zRol;DdR#Q}UC<3S62gJae|CqN6qWUXtclnpt`wAfdjmeB&n@G&AbvOC^l9zJ4T@aS9)7e-&$Qz0p*Zq1k0&mFTue`2fZ&?o zTazEcm%Qn7pKkq}#4wo(+x!h74Xh05!LYLie;fR@<>k$ep>5)O7`O9EwX>cP{G1fs zxyZ#2>*3tnD9zr>4+$>oPZ9kU^Z*U3}t$dQ|pTS*)EsTia2J>`qPF`T3*d{C`j{U@Z@*$g^=kJ7Xo z&L=L>qtKEu>XSUJ`q z(zj?-#JB0|u!;(?`w(y0)JNW(%mt15_}bLfs$>LTYdX*K7ELO@6Y^fsoS}wL){qI- zX^snWhjTV>QKMbQ_-}FX+m%os+14qhrC+=2^cK+o>+F6`D!s&NoNbfx3ROlF5rb$G z-Uou8gtEwl^8_06;8GS9Kp0%H}E z=G`s8JBSsqnWtmGdB{g85kJX57t_ZcNs`S7G*+oBptyxoMF~uqYpw!lwqhB0h4Vlr z{}h0eNhtj-pmu}=0>~oMAgUZItYnX5DkBL>YZ1AVklH^uHxlmye_Z7aO^gKhZ`One zWU~#OisRT^nt{-o^9{P%LI?jBwy;!CPNr}A;2`zAU1@(Q;AtUZfwED6%j*DF=1?nQ zNEjL>F$m_toWcKfhH)l=S9L@olBy0V2exv`tL((aRs|N0Ogs^Yi4HESOw{ChndghD z8$+so0)5HOvk2IV!_J7noeZ&wDe=~hjVbl|&1*F>rH@5q%_`$D#QGlr=tQW3lE^3& zG76|vNUjPl)B?uZG_C2F0W^&xHMT?SXDj0fIKC-n7VVHo=gKUIkkQid!WI|GG&aOp$fOlO_r)IBr) zq;3AlSL4k$nB)(m^l97(?{g->AII`%1(BOs+v_2?J7+z0KP_94<*Phac1Lr^@p)Ew zTkd-j=daN(Wl-=|9l4?STwV8?=j9=j=b1n&)jr~I&)TGsbIXO<>i9?7Z#X^@OSh51 zDW60llo`WhB7ix}-cx`|+i)R2jw7h2e9F=TI^S zNPpV~;XvsT6zfAm+4>dHQvifZ^_jCIiXkEy3m``UQ+xvu#SjqpHegB+;~)@u1|`22 z@(OjeIzau+Xq9#8pPQ#3p-K-2=nA-pcBHqb!@JdFb<=^KBb6$}3k?dd|g zh^Pnh^3r|M=~d}f>U8ynbjf1L4{w65+kF@bK+QcoAiKZZ0|}@90QD(fu{k3T&3r!$ zf+l5IgqQeGjaa}Z$gITOe3WG!1uN=edU{!-yzETATDW5Sp92O&C_|wRNxVfZ*l^A( z3L#?zCB_?dB{+2osg|(H{M0+%f~*dQHjxyyOhx+B5T)s^?@E-765{j1=yQvl`|DwqDTGcOpTqk#bNV8^GL@5+cZ@K6e}of089Q7 zbAP&8(ti>2g@1^7_+Mf^d5O*_eMK{ZWS-EVkTf3tZ(dG7N5EL{&C7vI?Z}5o*R!99 zLqDwefj_be5k{~}GKDzn*^LD2Y|1i)2|2CSCZd{Xvc7S*Fb-DmdfbE~1jOkvD3^MJ zI&sMiwAh1@M*$1W05!hLO@gN;J+~#hg|7%N2~$jtMk7AWPZYZu)8OkLp)Kx=AGiRH z98zp}T+{81{!}d&6w{La$SAWF_A(5>4OYXDcW4(;*-5_jV{wmGc3*}0o#}<%x zSSxmapElRK1M~sMwvcO3OW@TF`h;`qhjVnZUy~cPN<_0m{C9?@+X5OJ)Z(PiaD#U6 z>Hux{J`MLD$1%-*+55C3x3{WO3ZS&7;fMKffazk%eJHlAXdIz--%q`FSgQ&hr$n87 z7Ll70#L#MWK#NQwGAT20x1NL%&3tl?wwN(=>l?fW@T3~GrPpvWJ)L7Su78ieS4|Du>?0Y1l$AfyF1XbODW zUtmYyzf`*;2+Hv`84GjMT~4evul1kH0Xc`Y0I2Y72~SwIfGne%0UG(XgizZ586!OT z`&E)_C1WPETMj6`$NRKaV8Rf?pkf%&QcayE$hNIMV6W{l&6$}TU`&GXHtCs+!AM5G z-J~X>zHfp*eDVy%mh(f(`tMEbl1o2B9X)w>93uRfHOtzg4Y3W^DUWIH$nxsRay{`( z+pqjBLBfODj58ntPMtBGMeiY1;^c+RGko8t>j6b{;Ps0em~nIEiMt10n=@{(`jRvA zv~0NfLzMB*px#X#Zn}NPA1wwuMt9TiE#a!^xfA!)0oVE^0pxRHv=Z0Zm-zfFnK}n8 z^{3}`W?H(-&P!xick1m#{_#NlyAB#HJ9PEhlG(*Eq$How_7Ls?kuQ@aQa6-mMMuvA}o6X#gj!w+Z z#1voGxirDf^P*D~mu!)6(n~Y8cYEXa=B}Ts)eR%=-4AHCL?x&(yR#%(NZ`d!PEtEN zI5V4-X_t>V4T2%ugPd6qkKU_sdsn!QW?k2bGpTpT?54)3fM| zuiW$(oB7EpY|{cw?i}XX{jpc`@9#FF-JlK74wI8Z=q&qyWxN!a>AAY3)uixaj|xgV z=iQl((1nL8@2jRYUE)%&*R5Co7{*V;EAqcg-X6!bm_24V);FV%Rpf-AL$oJIa@Qq) zV36E|2U*-#JwBP#kNN~%Tt2ruuDN(NX&aH+MuFc3Zdbrx?!;H*fYa13ri!oEX5zx& z;Xxq46Je|y%2c_Vh3wice{4t4KK1~3_OxTHMyWlqYPkREVR4r`c8BD~dpqNKDSvCW zzVSiueQ9x;8x`bkcjj!Ba|Iw_x>4`2pV>b%ZW`%O$M2Lmh1_Y|$fDoc8-3$=roQ)$hk+yqg zfDcaA`XA?UGJTfHI%Pl6FkyCV$-&=$IYfYTLG81CpE<$=#dUIT~W5p zw(OI(r<~JuSVPAvPdlBRlI^bcHD_a3;Gb9AW3oJ4yUDrnaan?frp?ANb%wPSR>ck!-)_;!+ zdFsR}$O$OwLpq72vyJ-=Rc0f4%(-Cw&9Dut!E)kOmWk3?^XL-yL%7L5-p2sc;tnu@ zY)D3hK_|raTwzkjY2b0q+3R?M1aLvym{MAZ;|>`?zw_(N6B#7)VXl8N3-2_JIwQK& zzHry;N4TfoQr}p6;7~sm4?~Py(%c`zLN(}$421LVqC(Yp{Gefu)&}`tL|smH?1suU z9>tv2;q`8h1*}jyM>)ho8;emI0UPSSlRItDq)08aBw;ovrOIDtW}qFmo+zz%Y+{M( zm`XQ00E(=PS+P~t!4ot#e1OR%&u!tDXo>JPdWdKm{z=_E-SbE2xy`@9%spYg*j<3(^|OH6FOUiu`hUATUmUEP_7NBd$C`uN{vs z+h~*#tg@+0S&{xtv6b<%(!R>7i&83SpM|u-5cWpT8s)>wmOpb4OTdO8L@hA<6x89i zDWuFWwbdJL0M~y@9qgO4`QvLlaIE!tSu!^^ta~P%BpRhX&$`>y&uXilJiB2>oxu9s z8o!3TPdR_aN)taPBi{I^8FH*eAl?M>A+VYhA=P`7 zmiH3#ix`WODV3aZ($sP|Q)-E0&KoJq#$2pADOJ3x$mTLJ7|BykPRiCW(YOm!O>R)6 zPC@<9<{8|!=S|`wnp_ylVM2cfirTM3N?D8fL66t!qk6_F1?X$mI|>OW8=I;TOH7=T znR#o5p$?sj7nFcBgSd!?u5#(1Qs!$R1t>Iu;o+wuoZ>WiBc8?T70&?EO+wSpKI(Am z&xY;3z4KXK`(bI_jkS(E^b}J(%#3%6y~J2Y)uFw)13vKSMJ~3IGmGwR#_v4>lYYQQ z^+7kvp*%2}w>uv$&Hy}*c)|!xsEUTd9;oMCnyHjKkUDH!bQ`gC!y#}=J;klYM+x;{ z4mcfWTEsllxw8RfUQ>%YosTvJS&S-ICYCQpjUGe|tTOjKn;PIwnFVK!;H9J;akM4~3K-Jv(;701p{OfHp2pz)i^k5{VIl*7!sN2kE3TlP9T*B4ye zPxa-tm(7plmI@z6Od=ZY%0Qk9VComp5&{d$&;5O8e0_bjxk==U6y>$D^LhV zqZ2??Se-f4{+x8Q{e(b+XHo-quWFXe)ZDD74&NylofyT@ytx0@5<%-s>?tqIi`3FYi*O_>IbRJ*@+q!xP#(-m+zIc z%RSeUy^m<46zYCxFTaZZ7kB3vBul$!>DJzD+qP}n?%r+Nwr$(iZriqZ+qUiQ>F+!D z&fI&>%#9oKXCmfLRYg{2Rc2L1Wxnfu)>^Qpn7P4xSJu=?0aJ#dy~4 zxle1C-UvK-92Lh$(4Z(uEk&ddb9LF-FXUn~co97xBxwDf>!2qydM)IT+WQl#=f5mB z0+$j@eiED)%~75k2_zv>DK=&+U5BKRd#d(%1sNMhZliZJIy9wk6crf^MA8us!W6{k ziVFUQIZ*ulzwVw<(Qzv)X9)P$n0*RgE_aG$Q>_%uFg9%VOhG>}s+r`kffHJ6S(=_u zFq~NL7)#hiX?byP4$~qt7m;(@&zK&|rELX{Ip%kz@!jjhfmvdAVlyXjYqeBvS9!{$ z*5Ci8iiPb0m8Owt(xcMb+a1PR$-co4em3UNf1key+`mP!-;T9q%C&=@_Vz%2> znXR){VkNv37OzH-3Ls(z!SMRSa3B*Hefh0ke-GFb2lC)Z%+UM9Q;jh-mn|MH&*cU^W?XD>zZkKY-dbr${x06ybswt?$S~L&HX2S(LuHA&&7N zA5P`HY=o4s4rga`EME10UEH)9%@S&_5t>uL^3Vh;#_7AaBu{_#&P;#`O4qy4%iSI7 zmZm%mcYng!?m|_1r#SirpvDIep2j8TVQf+gq=Vk|!4eX?Q6bqwByXGMB7OSr1qmGa z3+z6L;RC0~9!dC3i8%-8?;z%E6ozd)WCSFT$m3lM*g$=?$=NW@ycyzCXKqL$Jq zFFk6sDflIr|LKZh_YWQM2Hm{8D0Gst+-M83JbImYs{Y?2@~mnrV)s-U$f7q2X@MKDHp-0b?nVEg zF%23MQ2}t@Mbud)6lR$Djky~r{-p<%w*Z(Ir-SP9nD4-*$~N&_h$F-1a#tE^QiVu- z@)0Ya%*2JoS1J-mT@i=2&Mr2fVOdFYLMx~#(`CdG@U1dL!m$SDs&n_1|C=C`SeOTg zVuwB?o^2N2RG$RvYG>hSqjkzv{uwBm8H|Y=-7NLK&b8}!)F!NTHf%F5P}Cu>VV97Q z;I&%%W7TGUagznJF?NsD-0u;yv2n?)plKISr{Si9bZw=7mNV^_sk!Fu})NDro zL;5cX@V0I2ISiAw5M>?I;T5A{jzneWe$t9f2oE(Jb$@mzjB^JrWWzC3bFD*u+~2-b zL_QpSM1&gbOOVBUupv};Pd{H4vyo30Q>*j)-j|?TetgJS!>rSa#eB!4$_lsYucLiz zTPZcNXsGPcHY!MtpXzcg9A%(*7z5^~R!59RENX4Cr79C|(9U&4pZ&9lT9x+9ln9S)!D8^pQF1g)UtsfPI*d{%Yy~XTyQ(CsN4u7HtAKUj z!@;Xa!Fu)NxFfFfk!airy`xV^Q;QKwEAnXb!=v-+`&I5nd#AI5%cWn2yGu&;{+esW z`DdN<5w6Zp2Jmd<(n{Uz;9)1|OP-CE$e06n zJF9+-HFMh%wRM-%zRjamGEvEvRl)&Ba{?#z1vWM4D;8J< zD}6ktX3q)+YD^qwYc5$y4#QO8(lLhP7%I;eY01CanIPv-K@HMEO5RM?X?EmJity}z_E!%* z{(XrWgSPf|$?My*^C<`xN5l87_x{wJ0#;uvj~C39h#+Iv>i`9)ofItbd4G%B?e=m; z_B_;tSarrPgjco|oO+iUoca0e^<_LX7s*YB+cr70V_7EJ`5I>p%4u7e4ohf0D*MJr z)(w@W*KeW(cq}{cnc3JHfv|1m#9>!8iFLl35|9JL$;RPvCj@Z&dhC_v>+;#}H-kd; zlUY~)%_>+qfX7P%1_l8a%W64i5=YuzXKRL+t5xObbK^ZL@NGl;BsNU(^wab8_=y(A z&^EI{hxy9_N##8BC;%Jf)v;~P6zj_n26BpGj#o5>#u%ecD^zjsp!Rsd+v|>+Ix}6_ zWp{4lLgTWsY(wlbU%Qq5@)G^wA>iS7-fZL3#Ynr<9h2t9UiA6LSX;I2bJkcJ2A%g~ zVm#H&`*6YAt~qgw?e6P%=WVXni(v4TQ13T}RZR)o}4?FoTT(ACYfHR=v*OX+| z!ENz2`JltEMeY|KR4y$e-eY#4OtzKM3u%TXQ-w3|+0$OkSOW%tt@2JQ#u!4$iuw*a zH@yJDtDl<#8Yz%p(aiyNHe1R4n1xs=51P%kFRxwMLay~mnfn?Zw?CI6$FW=;79RF{ zw7A-!w26vy#1|4>n*ZdSmo$?(enRW#qlDZ@iqN&Ht@EGn=MkgXKoKdR-F8Yg~lxzyJH76QF%6AX0=gy z%tmotIw!qB+qekFflXW+3R-lYGMqmw$*n|_UGlLscBm~fRPW0bdqD;~y$U<_nYLq`Q;&IJC5COnD10ohZDsoyRB=o<&4 zrHdwpbdUZ=mS_R?9&E{{jVEl)F)$1+*pxui&e9}tiD^Xh4-`<1@B^5xuJgE*b0VU9 zdLt^r-=V)2f8oSx!sRR|R}Cr55DL*Fj>^oEKPH)E6{r#kE7h2nxwVgJ47uK^8Q(7z#?_>N&y~BTCA^%F4{dbV{ zzlsuNqGS7K7E(H9y#>DWsruN#ci}bz2@WK+$>cGy|L4#6_WCot8pP$dFTYr%Q40A& z^}_i%?r1%zbp=Jk+EeA5TCwu(?2(>I*)a!d zvAuyT8;rDfES|W}_a9Q)92}W{722$ID`%7(ftOHxNFK&=teQUB`13fjwdIV0p`I=O~3=B$j{CG+i zn3H@vO>J~&M)t>w?VDnlmcwH3dkwmx$k};yw&C-9?^gO0x;F@qa=FhFH*Zosyk0t|oTk zd7WLOM^TcCAg>NP_tB%gReizi5WHOd>J`I5HSi3575s&YFbKAfII0>Oxn$r^;=Y|Y z`P<_MXwxNqG~fsh{PpSZP3Vsa zuSG}rGd(>nPyXq|At6oFaOqEnNaBd5v8Iyj1HB0CMs8BmciKV2l8n;kQbc(DI9J@y zqwR?3Cpkl%TclHO7?z|thp;cp9VgRFX*9%!zzQS> zn%ru&_puweH{mfhv5($&;eu2odej3(XX@q&*6S-ofyco?-A#6wAD zsWU4tNqV~1NU(>U8+uIH8tRW_3`b5()&d_wohbwMXlUY&#B;U?W{3s&oazZ&)A=JB z@9Hq@y@Pdg)r$(XsVnfb=~e=sxbDiRh{UR9(_U1Qs8nSkk;ItPq~jxWEa6Z_F$h%g z-O}E$a@l;a`r))8&Z%3(Mj(t-e+$o3Xh}yvD zTVTQa4`F%L;y#)O-H3_b9?))yVWC_&1Z43MT`{r=dh;~Q^l#H9Ob}1qUL0l&E%??A zsye$r8tc4*A(>56_~XJOY$rDwvuJNlUf*YtS>`!H+LIMu?B+={CD#u8>`=N*F2Om# zisl`My{cQ6Lg50~EsT)|+*%f^*f3krlv@fk!HXiHmYRUFdD{Azw7i^Efsbs5wJ5{P z^I2ey)if-1!wJon@dB9s=$IMVs-odiedg9brena2)hy+CA%{oIs8vgPL@{MmIg(*s z+@b3P9TmH;H~Jf|AE4o6@1v<%n#Rv*?Pa%EAiDEBI2yh}x!0&RmE@AUOp*%AmOHWz zpfg=mbr#Q=Xrz`vE+v_E|6*EYRY8W2T@8l=?<0D5l}GGSP(=U|G(i*yU_kIsXhRqZ z-~m@*c^(~}>z3)}45`CkbVFDe`xq91$Fg$UI)Y2H6Bn}kJcBKH+i~R0tXeqvG{spH zSk?9zS1&FJyvSGnXx{q$^=ba)#Z6E1(;5{4cmDDZ! z9mHzZW%*HbW@;nKwT|dC$Qz^f#5>Lj66mA>Bo5~U#U15DLl1OrWXGlJ7J6eqyiQT+e(qA#}WaQ8XY zHMYFfYQIS6YAH)w^ZS4U#(==MCFq??neTc~0S?Yq7=CZR>c;At2~ZBzK~ol2KC56_ zQY=%(NX9o&M&Hu!2de2EdJ~_k7qi>p7Z$chu~61(>F7rnbXYxqoMJp-k&|4JU zLvIu=?!Pqx%%gRb5w|o;o_tz)IszDB8mi*vezd(ASppU9uAj(1q?T5-r@}%gua`=tsiT1G!r0l$-XV;FE zL>X8$TR|zULg4)a2wOxLkepSS(}`{6VR~{Zw91*Q-3z_eWuU9I(X17mIo9VL9Poj!rtoxQ;$B03nrp$%tN=9ftqG| zbk(?l8w+^0X`Q4xkcMN7KeZKvbGB&7Wf9M@D1JDPQrV5D4dV!j>Q6DzgfYeCA))`} zu^6?tiob2qWk!Mp2&eD35pLpaE_66;J011(nVD>K$PNDq`(qX2RToSfR`T>>w>jvA zrZLf-O0~kdomU8RIAGcS1KLdHFrOVh^IS4=1%22;;39q+c#0NXasD`ra*JbwP6~f{ zsbkfj2#I~BGr4W1qTMwG;X!H5QtcO?_%#3MCX?dW_{*F$AiY&a#Zp2mhvhn93i*14 zHlUgzqxyvjaT8+*y#jW|AJb!!Ay5**@_?hZMoQc6UOG6D5OTM4#$d{ysV=%D6IOqC zu70ud5x9>4V7m&EVKf^n=%_H^ApZ#8Uz`lK*-d5Ez-p)BH_S zd#MSJc+4h-n8WHy*R<1*rxF=3hBW8d=1`BPjTsq zdk^t~bL&r}ELYD|vk;B&9Se2pO>e!{=Mqbrc$#3XU5<)V^j^y)i!%hVP5O(!F^+YH z2|)pIkrhCPY)o%`of)XcAorqy*&RdEwW8sCx0eRPx~0Ta)GE@xMO&$9m8Og87(r1L zY7>uZANYxRV5G<7LTYW}F}oD2%?Xw;7HrQdvS8;)BOZ+w9p=&UaYR?V<;E&7u?>b- zUfOU}*Y`U`bzNJ^DuAL8$3k%u7XAS?Ni)6T5Sk-6XVfk&;nr;>nbM2K&4^km0+U_P z{Imy-Qar2^T|h{->dg(fd?jj<6(an>N>p2d7L#~SSaHTGXuM2%wets3v7w*sb zzG4%%bQi11?l7C&4*u=B{Q)@!N;uGoteF8^%@9b^2`P;tIHN3&C%5b{2Em3pbS>yD^@u%&sL>N9W@{QIrfbIfvYh-onsgJc!WUH@v z_l!1Mc$PJ(!|GmolFRmIht7Z5VJEpEUC@>ev+ zi>j#~-P#tl$%%sTr0R0RF+xCV9!J6OVSrlsj;_ibJtz{l0%Hi4gQ=&6*7W9KWfD`T zT$SCNYtiKbpv6{4W0P4&JZ@QJw-xP*g~VusQJw`TH|2gUg4b%acSEOhtyyd1BnNW% zg0p?;&q)%PnLBMUq=|{e<~6?2{$$6zv1~V1suKb33)n9i7fB@1Q zfB>9ZWVMqkkAvTTk5RXXLdwm_{bUv-ZLlfXd*NMs`cC|wkUB?It< zasdOdx|?iLooAVpZ`;(&h_1&+y6|pQ@r1-@FdwG7NMZG~haGjU_{LYv*s-4?G8I~= z399?BSh@w1Vv+|#kS+;O8h_k>cH&sq%UbtDV|8p@IQ$0uAjz8WwJ{X-w`jZXS!z5R zL4jE?Qf&?jo&x<{VL56kohUfEH?*L1FlD#E)GZDKWjL}<0l(Ag?EI7^~<2Tm$yMBl{+cfb;T-wWcw&;}q%B zDAJQ=wLqG*e`2VjAGqm}8$+)HL_C@`btEMqi%$ z`RVk2^gXkFn65k8Bp`tUy7%Mc{t?3Iew>XKZa{o9aZFiSM%P@8*_-nc?1~jq&BcdT z^Ojv?E`D0{H34cH(Vzg^W!Gad9D|!0e*e8F?$zG!KRk|2-@~)7=PO zzQ3FaYEfi2W83w%Dn`K0lc>Dx*fz)Quk5`V1AD?Nbhc#8^bVQ<2#Q1D~QevAWnL?4Fk@GlIgBCD^g1 zF(Qjv0!;O1)^%0&ukN931*3D%?y2nSW~~!_HbFIQ&GClW?HM&~Qs&k#IDHi2^`cLV z=M!`7=+2iXWcv5rc6xUD@8BA&Ey%UyV6mpyhI}I{zvwF#Sg}<^OZ@ z?_b*0f42EDe@k2chvFQDe{0wIKihm6|JB+2ueGD%R)4E{s%D0crg$uj3=p(pMrJ0a zj(AM$-xZ{SHkLN_ine+N-vy;YM$TpiMhc<=-=(F}dJY!foj(8Y;L-}1IXcK0*$diO z+1gkeSv%sf{m(*DjsMt4`u!S$NStagDNG8FFs0IGUOZjB}WQ@$JfUTGl(IG#}kXm zK!ZV$;fcv5X4Z>M@iW91>}SS7K{IXmOix@!wrxeXZ(Y8)9C_Yl-(}7%*eGwfpQ>!Q zTRRaB!6)=k1E4}ef+Ii-ch#)d}w$ETih0Ao@@0y8p##uNe!L)T(X zO!&J54p@(lP>$5!RG4lgEhHu;q`Z_NB5`?o5(p5ij;ELzv8AyaeV%~Mg2CzKS?0GD z!J)9g(9{X65Cb6pfQClKh6V=4#(r4@ zeZk=)?Q4-5rw(!xoMX58JMuoO1dKH z_RWpGu3TfNv%iH1$4FOS<#=*@keZypRsW@~#_Q~C=j8C+%Zq?^f3IdMW;$PSoVwhy zWV5R{_lJ?8zRtm(H!(3eNmWTjnbpVA%*x{G_#6WZ0|y-&^NWkVyQZa~qpq!~tG3z4 z*45Dyh@1N@3>CsR_;%^YXJ0sQKPWspIvD2lds+FKEOO`!y=f~wtz?;BBzE=8&9ec# zq-Ze`tKQsQ`Bi)>8}xQ8!}TQN<%iIPiSZX&t?w6dy-wK2kOfeWpddd7Y!p~5z@wU) z!iVkWz!y3gsqc|01;h|~N<~KKLKXt z(sA0d?#N~!LzTMGL6QaxQqH+Pj_mBj&kb?e3Iz`YBhi50F?UTrJn5EULR9g5DedW0 z-Xvprh_7E(sH9dD+wrPZ@11(ZPUqu8g$+*#*z~)%#fUI|lVBsS4Jf32y6HKymZ(4g zhSmx?v*3Gp#vV>^!=2Zl0Wu-s`6kygSlzYg9-U~MhD{=lKcRyCk>F|`d^EnzaTK4h zXyNtq*c1e)F96f+y|qF6Rq`5k+9M9)Ppra7KtprBBLy!vnPvfoN3XKGUkZrflR56c z2=Q`tLgHu?Bs~zGutIa|Je2X|;>V~gx9oC9f4$+jbrm%hle_1bkkl}lmtKH>UpfAw zJ0r2a)q&kNU|VT6`n7-#Q=@ucS#)JQWlX@C7Q6ojSmMRF*tQ&o++;o8XW{G-P7Zu! zRFqswX5b?vRx@JFjDJv;oI&Du&*P$$RT9w#BD33V!oqlPjAZdgQpDxBST8;2KW%r;B?T56>-dHr2VB9Q}6d5>1yNTxo21p40$8Xs;Kk4Gl@K}Qc3yh z^qp3U>|fz^srPSdw*ldh-sDj(I_&K}#N|hlvEg$MomH@QE#h$pSN5gb`q>}3sJ!ZJ zTBPgt(MljQztTd~r6n^vydamxhsP-W)ggIqtif07C1hSzswDq_eOL$H{2>rgGkxZV zl20hqd$Tza&Ps8bg^xmyVkb?Dy$6+~MQtsO^7fJUk&*1cp+%&*qbuw{Kq6e0Y;n(M zUce_L{v*|>%uje*6acj?vr30*d{57ERqIhp)~`wZ#$6>v8aZsFV_YppHM&Fqpc4kk zmDR&<&y23W?c!UrETcl^;P34hZ7>a*b=r&Dz=bly1amHk3a#nDPq} zNL|&Es5Z_9NLi-lhR-&t5DTv7h^^64?%v4SGhC3Od`5ftb>h!L6%cLy??gQtrVQfq>-7@w5)0e_VM7E~(m}eI*?gj35tnX)y(AK|^YZeKw#pc> z91?GJLqF3nPXgmzBNRyCrbx%LDJWfavi${2J9Rii(TYeT6Ksg=0_o*#-)yOeI7Lx2 zSUSV}D9l=~4!z>sMBo2B`}faAGumVy`q9h*2V2{JOoYWNSQsgLSEPOGW=?i`})sp z9AKtCH?XJ+bP|2>h;546+{q(E^&`U`iQ^7c=KzPc0XqHu+B}B3tzr!&oS08rwmn}L zMnFalHoCAFa$a+7vJ@UlPvtN$|<%7m0 zT{y3ef&-|~U(6oLXX5wJ?8%KZC!mZF-EP)XD%em>TootUin6CpMjWq-1hzVEYq-02 zNUY>lo>AL~=J19eup$6n|uBAxEi`wE}}A!9dR|29%3uY5RwmT?eQKU!;fL- zf&QfmsvN$Cpw+lP>_I;45YYA%F@QCy0V|(>3pK^c<0-cFBMnzd43+3{GfCaXftLmg z>PPbU`F?+)c}{CJ2vzL&H1EJQ>lKjzxY$uKT!<(wK0wg;8Sc*0cunWqRPrBjJvl#o&7xj6cR!nt;j`Z{@0$(VNXB3HU@} z6~QWV@ak97e^9%ZUJDBq*P$k$SYh|#HG37NsgrWoe_e~gPO7yZf*qu!C5dy;ohd&N zJ3V`mYIQ$sViE+#d|(;^=r`Kv75}m`PM+qmnd>!Fm#Tf+z6lQZnIeHX$mVd zh28S*%bm#_^j!yr?~}ebH=KtRfw=BXJ%AqtT}~;~VbizD>Wc$>olT(F(Nl)<+C7yk zp1F{JFj;10If-5o?)gcRaS?7b0=8^|jY*2-5Zf~>8d{%ZnjgAhJpi;4;32oHUuJt~7i9L><=?8~?SeYr49@l2X4uZ$gltb$m48WmX#6M(@|J&_^Q+%}%2R1mR z+N0)>)#e8x;KK?j62?MNM}*miR?GICG{&q>Ebatdkedo z+RU-d!FwV(=jbCTyBp8Ku3n*nffaO>*LZIB4#-D;5jMLPJ6m38H<*>o@{d8!WEfEq zahEBnzj6eUXS|e+>-bJI^#rP9w;7>WzVZ~AL1tVKlRr{aI5O?54M@9~8kOH6TWrX# zsDno}SbjL=if-6nXDaFtR-nz1H%Hd=i;=6yRV6!bo83&=7oZ3N{2-VzRol{7OrErN zx|GL#&wm?oRwLz8_EBrMT3JMu^%uk0I>xM%v|@h;cV>Zutpj{GIFa_+g|uPWg#_%K<1Z$C3TBcw-#B=b*5Y~u_`kUqe8 z?3V;566f%v+uBYQM`Vbhj^FF5h*v#*eUyI0)pCFKH{)$qRNN_BH{SC<-Hh!sAcc#W zqM23gLXPrTsVT=9BOOYPA*CkzN2`J&L#kV{ZV!48*Hf0EWRIdT63ntcoXE_&9Zh4o znlv}3YZb7qrmHT1qcr=~bV;aOZBl#0pb$x!h^)8n1yZ zr2qX!b}(X1O)l@nw>w<3{6#cdk;D4pQJpT;bZq3gYaQ(*7HdMQUvdjf#7U<-<5Ku~ zYPmS{c-34-)HeMq+F(qn}#h3D@j2-ziMFiO%ox@ zGT$)pS(Tw#YrOL#skY9r4%NKcoo z1UA%8KF4Ewydk_w;@83%)1NIynp!1WpD)PYk5jSQmyxToSqqk)xcc#}x} zdt3P_;$Gn9Eh)byW{*;M1jh*@xM^Hyf9%vhY37heGug=&;Ze_uSftg)VSz+Q3txHI z9&d8nR^Kzc-3OVO_AX7_GOWvLLet+=xJ3ahX#+pVY|y%*D4pmg*3<5JY=BGD;G7H< z(d_6XDUTqG4!E!nM!C&I`@zvWv?NaRvHrL~`d5`$*7by0`ND{JguiBs<*&@t5Dq}S zVC!<+tJM3M-8uARxAEDNX~=ag%=Ezx84#El&c%n&1)?yeb1{wp-cGOHQCrnd!c9n5 z<7~~-XRF`WM_l`9Q*0yrI+VG|xB}BYzh8_4^JU;GnMO6{cCMyk zadIe%yWR|l$N55o=-JYfi-cmg!|-s%%$)QWin9+KBvg_Q&qdOA6qK2Y;SO_yQZ?)y z=@0d#9r9MDSWKN!V$OHlcv9OF=xJ*oa4RoAn0~JGT8$Nv^W+^@#fvI-$@T9S^anM+ z!ym%n3YZ4zFSxpyFY^J61D92~`07^R$9rVX&m7;cbK3`(#PcjM z{&DKs+bvbgNgo@DAxQDqq)y^2%RNBauF36c+--J%$BgLm5g>RXdvH^hZ^|uQbNGDgJK|zcCQ?hXoA4REmj67`FNY`1 zHL>11AmB%)9JI$HOz^com}~5-X=m;9oA>jNw_8SfK#dr~MAxx}H9ZpK;p*KN41W$EZrO?O?y2UnUi} zw@OcsHU@|x7S>=x(I({4Hd(W1i6;1EXgSw%u*;~<`qbd~4Esf^I}O_7=jI-2HY&R! z{&<1#6@^!E_qPt$4D%e*G;xbg7wUd3`_xY)?n!wNGuW6r5Akiu>3lVr^(^$1h84-m zpYumamPMepiDtMPWyuk?Pyw}Au6?$4n2joIXw;PvJ_2oj0RCZQxH#iqQS za)xKuP(}E38Zigg1eZZz(qRtuIdP;@W{569PC-@K+sKR}P>BLs=$Mw%!54EZ ztO!d2H(>l4*wHLjnRra6jI(Fs|eAn4GYf-rgn40aGW`akKeN z8!!Hbydb#?x~f=@X$;nb4p;*O%`i|-_Js>Tuu|{4Wo*H=Mijtnq*3{~1S8WL1cU{W z>ttZw`T7u2ihizSf_b;(Lby4csiM#b&TLiQ9g#;&~U{iV*?1*Y9+}2~^m; zwW;LVL**U8AvnQ&^H4irL9vh#51p}=d1q4D*rl@It;wP97Du$)gelWk)`HU2m&pq3E&x6%0 zqe->)qz#~WHgN8=F7f4^t}fA@WKz81l6nf-1UWfN#jVgc1b#IjTli{c0$syP5viq? zSRI;kM6*-`DQSx(z-zkTqC?NvtwbY>yHHb_@X`PAa0LXo##-gbZfGsd(Ww*)z;YKg zH4=fa(dY|^X9s01+fwz<}M`8 zHRo}k8zc-wZH@GV|A7Zr(@N~AeLKUv!=5VVA}vzGe(UymcAK2knAsHwv8>fyq3S>@ zQ^%2!lM{MQI<2g!EMk~>2SZHn9KSadz}B~PCX{C61m;emzeAG=h%HtAB#`NizECBM z+nTo@YQ_kswR@Z4X*OM{iB`AjHpPR=@JeV~-mcxr92bKhffmo80?o_WpuoUN;>&b~CV_Vnci0Ji%V2yzRb4=?!T zg4@^+W#O2``;VwFQxt}k^7%@yHvmxz6+Zxxld#^3@^;R z2!(-_xGpGrL4aTqu-xv2Hz5RI@+EIrU87^wjHlkEpd71MIdm%qd;psf3@!IZAfOp! zHXR`V1+nA-j_pAn46joCFKVg{!aTOiHHu#d4~&emrvQ}SfN!8M9H-^o{KeF6*rU4( z>3ouLQIk!3HflPaLhNye^ur~CTh|-@u-Mkypj{=lrA_TA_d7irFm!WBtMaqn%lON^ zV07cFTo~I-sdy<~mS?yW8*cbw5h&HX_b7;}4L@>xrGG>Rp*<8>;$@5RYe!(|T4J&{ znFlVFfnJD?1w>JTXPqp;qomMWF?ni+$lNgR=HY;67(m-qR2qS=S`h%)fl_(SF(q}W zcNMXX+vgHuOkEptq8TX~T`l}3T;kECI#QbSnbSJ(QBG z3atZ+3HbM;;8zC;cg)pb)UH{w^AkWCQE%qLg)fTK9oHrepB4E7$HrA5U)*CMz_)r7;SGvjKC`X;tpV>2$AWgn=d^zw3Pkd2*J-m*+?WE+ z+h3tV=>T&_UAu_@o1vjA(rdrb{@V1x@Ql6VEVfW49&4(D69M%UOI6bZpo-A?9tUnD zxMac2@FgYdNv|aYV~6iUko08}qg|qA&0X7HX{s2jYCcHSK8OTCu?nP3lNp#71H+on zL$G@m+6hn;3BcND9@>QX+5x17M1%OIA$#SsuAO~onAQpRm`p%utJ$T|MyzyoUlk9) zYJ_SZsNyRI-Gn0#j87H~>o`C5Q1QAM$9oj9IRC$xyVCV+^1rxZ$u1YX&!qwQc4^|jyh_#>_|2se* z##fZ4aYojHPRv0kZ-JQVPPJ0PvSv~sueI(TI-miPbsTcOiY70O06=EDI3&UvGTd9Q z1PGkFt}pK+{btkRop-em*HXO1Y(bdLYrjA@5oM!ajFOgKvLzURWYxo+o}HszCpYLw z)iK|tQtq4M`A7BJO7VD#NgWLf^@0dyv5;M7F>gq29;wZ;o0nsOwCQn#LZ&=~Ag{=~ zkDK?k3qwvP_H8~mTeVR)h-9i4CsaktNXzjm&LEGb?Z#rllZp^z9MR+w2HGT5JPj4M zeIVGujvzl)Y+GG{t(zBtNhO3|``oM-{$yJOaqD)Xc4j6m_f-eg~-^T5_RphQx2;=*L6cwRamOAH&PUDslKjv~>BWEU2^M*R! z9~&ur0*@FjB=5P=Fgi%yAa*iA57^N@;;r>Vb7aTCkoMIb4Vf`qIj@{pt`$fKUu_Sd zxt&K|N%bXE(D^g^pXsrp+yK+}h$x={?q)0lyPCRwBt)#_B9xU59y+lvGq0%+J;y;c z>XVnQol;MoX77)H=F-=x?Av9+x0Y4IJtQ|{a&c>dE4smjS@~5f=Uu`d$K4*Kzr{4E zEpLciEgqutucyukGaW}31*GA-HV5xwvT4}&Sur9AyLIclZkw_;qJqs}aK@VXFObmx zP{<_1@wEqlOwE$)kL>P(psV)*1bv;(k7#FHXK)VWRGQjjSG6vSmv&VHsjBMT;>wFT zWy)#jjKpO*u}t_+*TjRX<+im-jAkIh`-w{JLDnV5gmAfFdNIilBF3<2sq_$ScEHFh zK!Pv1Lh%k?i`e|k^0_V|p+YsFTx|rS_B|C0!-v{ApIz$Jg15-0C zYH=G?NHt*U7jN48;}HEYr}O5oMX%sycX&ZR zmdt%JaqywTarVAWIdf$1MTa|sG6VWXf3d!L<{6;18f+jmagH=$fIqDCdkmyYQxj+Y zyH>!(@@mmC11XPQ;{)E@Rj~q}PY!WDD5iN^5s0|wHXARjK9tWmCXZ2Ix;c7QkEVoW z6$G&NPULSUoI0bL2t!+$Kg*3_FPC#$p726|HWZJ7-Wb#LbReGaQp_ATouIvgw~I8D zVrtqr1l|^`5Kb4>0hheUMJ0$k^)7wvaiXh( z=;GwX1Dye`=PTD9S5wP-Gm8=%>1mIBV2xR^ThA}RQOyB|!3tx@WgSanT+-{TrUh2u zii48!LTXkac$yX(tZUwTJDAMGK(@_k>vR9ygmzfE;c4M4P`iac%=oZ0EnIbE@UBO3 zsZvPfG3ct`e4~*tYPhRiq;DA!yOl_wb-%IxRU06sG1iz2;b?N*5I3);0Lq_-JEa=0 ztTl%WXnCJS$gBfF%&_&=Z`5DPK3~_#2zgn-3^)P8CG5z4WH!jE#fxM`9UIj}w(HTt zfJ#s)5VDew75(S1;>Wm%Vn?>hivS>PV6QdaAKV5}PnE#0-QacmGYFBAf#Tjztst43 z`yC=kWUa6)VK9asbUuOYM2iO~l%(``pdVRbJyDNwEs2nQ94R`Kem<2KJWD!0&}G?$ zOs6ygX2$`tcLY-^#RR#56|2qS=dI|4`p5E)u>p-(^;qn>ja`>{ac(MB=tVxdeAvXGmR+G*qS20)7b;R?-EeTcKb zQiwsT&rZs!UnTK`qJAAe^xMXzR+CMBJtqC07PV|(+y*6xAjib*P4u#XhX>t@wz)={ z)yAC2`z>k{n^c_H=VLfFQx#RP#&SLaw-DlsM()HD6Ov^~sVhnKgLfW6unVt{GtCH| zFOEdB;xhZ0bx?;2UBe<~&7NF#2+qZLJ}CU^GTZR>dt> zG*b`bMZNb0Z*naF!2*e=L~X`fu6Wf862w;nKL#LvQdT7%<>1ru)ntx0b8Zy#C@@{#W2V6CNx3-)^jbb7}npxA|8hMa0J5>aXqWt^Qu)n?e!zXS*3A z-8UH`t>R29<}!4uK=AnT0_*v|e(L^lM*V}6?#)hmfjLr(cVcdi3|5WU(TgTYd(6Ij z1e5Zk1B!DRL%QZ#UttKxOXM21c$8AtXAf)SoyBK^? zhze6m_E;0nDDcEM(ccz>t@a2E^P5nF6M91z2g092 zY#j(E^!!{CGz{7;inchT*O9=g)Z+PizrMmRL=Y&uz48KsJKUoGN;%q^U`WQF^0E5t zcg8*9rTDtJed)&K@fKmui!A#e)O}-gChfLuoOEp4wvCRRbZpyB$7aX2ZQFLoww-jW z`+ncv``mNKK6n4TW85D#YE{)Jy|tb-*0bij<|G^3ILcA|iT04QB+pYEQLG~UlD@an z2)+974vTM0tz9fz;#!PY@Fx}WT*kG}7AJX*oN^=Nz=EO^V_oP1PFvo^B6(XecEFca$@L!7$9-wiVri^}Q|-UIk-^3D=y zQ_g1_7o#3q4sTA*v6rOL&Z(1CFixy}G_JxW0-X!RgVU6BQ#hG`Ra@`j-1wm;LxUGw zRYazQTvf&_Dsi@PbxYrCIGO`_u_ikMD^c1i(jcT4IQJf-Z=7L=z~6 zLtZ1|Oc_&|Xx2@+K$Xe6tS0Qj{+Vd|dkPS^3=$U8n)7%2ff-DGks0!515>TAdtM+B z&tVoSo$}#W)90fK$4R-mR6aBcTr=d1bl9!FX?_d{U+&L1VzW_BuvwfrslLA{ku~Jc zsXEd{rv8*`e+IJMI}FE*rAr*HaXOZ_eY8-jll8HQb?_1vGO#Du>K_l zAkqxP@OUJk(COQ!`8otjH##WtE&8xGmQBoxomR(K!YC`40imZmsz+gsf7`~PztiN( zd_&@NZ+qcT+*5hFmVxSV_3B>l1RP(!!mi2osgWMg?>Vm{;=^gTsT1KStb3HPpDw*h znEQQiUW%47Eh3)P+dlle2y^Sl?%|ciM`o0yn8T4_sZ%ftkqq=>YY_J_WN>=qDApnO z^C7F+44|9H6M$BO+6qAQSQf*w$cuc<&&)}i%9b@b!uil|t>4i7Ms9aQ$6C(RNSG*9 zQmz|{LO}FzjjalcE|83&oNCo#qg1o!6OGowp|LQIWS88>SILU6gs~hat*Ljcty4}; z3hqm-kJ2k@tCWs18OOIsNN-$x@%R(ZJMxjMz061n?~(ctmNy1kNin{KoY8xxUtsTHF9!rcdGMB1KYjvTu}pp0mQ0yOexfiZ(UMP}UfmpfGsWk#;JXPU-~-Km=HZ*6yLFGs&s{+d6O(o3RPH ziLt6UnGS}IgT)jM#f`~%T;>8ijEd!fqtq164jwACiZ-`svK%!nbwq_cY3UyH+bXs} z0ImtxTwW=BK8ajl3kZeKq$!I7Ha&cBza^F&Cmn1Z5El)mnh;itJ*MyK$(WMqFgc5= zJC4{;`oy8KRN3O?nre;#1j_jh-x5Hi(OF(d&*9H zOeM0rr2rwSISYw>{NP}%&H$KJ%5^^Wz>Otxb%1oB;D{!F{~9d<_1sT&4Va#10C@FG zSx~2~zWi~xFS11kZ-YTov#l*?iWfp(P~QghWDT^j=H&i_CMCeK{^Oke#_3q*lNWdf zYuEkAnb((-%c;>vZU)~rN2Ak|hiJ;4%@xH;#)P#f9!<9sqjw~gcR@H_!(sXXv5Kl!XQ&3i;(mz_K zGN6xftxug!wO^gu%%D(~`q$>pJFlmO5eFrYYl8W$wkD}2Z%Q)dPusw|X&ZZQbxIkF zeRfK_4G0?E79ou`xRl`a+MTv&_Qlo3YUfWIS{Fpc;m*(>Y}d@nlV5}C_wv94?`plw zU+A=fke)-M8P;T82+h}hk9;e-$ksLMVqtW%>>vwv+hVi)u5^=9k6@Ak|ajzN_)<>VjD|=#?KSMu$1^udX49YoC#rX`SR4^dI z5C`=Kc1&A1kN3N-C>nb+r4C71^m)D?{4?<7DE}4FVF%ScJwOqf)G?rP@C)-Ki*u|1 zXzNdR#{5CmRmTGsjN|qt+0!_@Tim-hyRYx)8o@PL(xR@Dy6>^*HQi|!_Jc(SC}hiZ zts;PU<>;vYT*Rbn=J?&MW4_QWmS2*-$}Q$>O|HQ~djst@bo8m*@T+!B6Bqwua5F2Y z&bqeqbGWN|?;3>~gYa$ox;M!xm(6kNaruhRWj2|cASgI_^FwUlaOcfOu90td`{}2> zyglcd7qXKp#}&MnbG3ssJ4H6Zy4aM}rDuQIucwuCt;j{Yg%*MKht-z*C*eii9v}B@ zw9K+=`q$+^+wRVnsh9T=tK6rD^u?O#FYWN)o5!1jkJ@+HPp)lx{N;rGV~Xe3pHVZL zZ7xh@@AJcm0*!8ZZm*obth(FN*{GDAX!k z7guJLT4t+dG^5(IRJ2w(X$eiES8YsPf=E0)cINCs2BiE+Hr zuT~ZA2}gB*N8+>?7O{&1XY~O{e09);0EF)fM-^n z3UYt^@YnTaJ98&Pxs|h(l7FX!4mx4nwhz!w03(f4HreXPK+}y#b3-lpm8p~lTd0(* z8~{mA^`;XW735K>%^~{>rXh@>QdjO8u|lA9jd=!)bb-%)WiO{>k-T;9(gS3=MdJ`6Q6ONpP z&nJWbg&_;x#*=>Y{ ziVsp9i2BwfUTV!k`YBQAaDfJrQ*3?LVh0CGQe7n264vLfDqyNx3(ontlF0zvm~q&# z+tLhya*cT!A>(@nBQ6BV&XtU>!rc#=sv}Ar=hc_R@>6!K49xehk)iXM+-b&tEZd^T-UeXC}PnjqoPsdd=6$39eM!Qh*++00D zxISK==8nx-KCI1SVFb3b{Uoy7TV9^Pi@tYgY*1DmNW6IKFCbte7=#yIz0R2`VBD@!n!e|D;wHFZYd*gkWSl4c#)q1t|@7Ks$quC5Mfiz4@)pSlrb!vuF zNqS{mq%#;hv1@@vkLm9${}>I2Fo>?*3d36#SmJ=yG{*RiREp05Op%>e-k&Un z#J|jIF9TEI2=`MSz22CmAGd*4%uQAqHuyieKr5OzM3eNcf`;kLjOJ5#s5vJLu)6DF z@!)UOZovJ9FpB4fF{IXCge`dVC?7^Kq&8pr6FIsSc6u>PhlVkVJ8y$Q#Jd@-*t->I zqw{K>3K5Im!%U`(OQPZ@!Cd14bj9a|Y9VB*gz01|(kQ{YZi-FyqYw6sDaYe0P!K7l z*#Y``(Fbo}rqDxvOUx}a%uF#AGSsX0%2z&MrI{ZLf6qGd#!(ExSv`cOg2+{2pnCxc z%k!9 z{EgXAH0%)k+qGI@E!i@u*(q4bt(s8CtPS^NZx~JLK|8N^8Vwq^H2|#WFde*_ezaOE zRflf&Uw%C1Z$j%#Jr)o1R+lYWP)#ZMi>^6$Sqj}Yj!c6)&!3s%w#Y(1qAu}1^deR_ zKBRDZwjkwz>lD)Y+m3;L6;M9p4-dh=^A$lgpa#^npnILx#s%OD{wpYdLWeL?Oke`Wh{A-68C2C3Y+hd+5$g&Th_}Fu ziBlCW;1KYvNnq6lEHH!QHEdoI;LiDD(lk~X4M`v0^U&P#1$A1p9I*y3ixRM{DzX}# zf8H8~tXENpY})bz?>@ePQ@arh>W^Ch16Lh3%b|K|P(XKG{A0oUMFFh?h_gI@ZR5+K znhv?<&z}1Lmfi1p%YdtMZ0=mxkkNKs!sc4QKTXuTm8g)1)V~zE<|eP;k5= z<|bxPcSY+-f>H{aK9YKCO@#L)-|oQmS|()KtWdOxM_k8DXj@{o#(mOfn|0jlhA!u| zj3rIw%qwktKqj(45R+ZS1SJ^CUgp8Ru_rvv2kAD?2f@Et2#0>K3K`B^oM3;Mn$>)= z0$u~K3|IsV7VpY1(7`pIy#Pz%2%Na=Lm~^Ze=#TD$LhNI%vLE9n1C!&g89430 z^YEMuHGm4Qjf`c~2kQFxUhMG84)ck8;dWD`UAyqtd(!3n_33uS^13#zfR?^zJplsl%=Y|w0yf#_Ewk0jl^9{w z+m^iT%o{z44N6JX1P?|rPLGCj_rlgX`820<+$3=xRD|H#hIi+pnMcZHL6)Aax5@fwPv-W+f5Lw1rE!#aqbK43Rqq6TpuH(O!un)Tp)xm>^bUe#Vd zZc98hCti?hn?l_5rz}~%m@-r?9%^+rUPYCV>b>fXcdo!Op-=pp`r59znReSUcFwzk zzxi~rWAcpYzxr`b=Nf7Y`W%@i-C#EM%|%zEW#@C2lH$RPVLK2q2q(@v&@ZdPZ2--d z4j}u3xPy}nd9uvEhlj|oc(gx3O!z>!&Gu>|{8IFC+=h1OCE3XaJagu~3}y@^Pn@?U zf#<8e*+VMZUKb($)))U)kE6xy6CZUIDj>3dz5Yoc&@bit@5NQtzlg^E#W?lvmH$ntkHD1Zq~os9#q@mDSXf0B;zDce6(9I7fZ~7S19Izs;RD_?Y6lwX zvh&UvgaHxj4N5nlov>iw$6tYxS_Gtgqmt5gwYJkdKwp zaauRccD#7p^3oCtHlnS!E%6=V-yN8RZ> zM~>VVs15xs?bpY8j@dztufWI6vGeDfUCF{5YNi-qyi%2*GB7G;Omo2*v?n%@thF^w zBwB)V!>0f_;}pl8dVPAHu{8}1v#k`sG7(2#8sVKT+eHj`ckJPmssLW6d7k>h0>>_ie>QV6>C=1B{LWy zD~7#zjU|ME_LMM+q44STvy#?idSO|P7k68yPnA2Ek9_CtpwF9vykuotviJ%2h*&Iq zFB4j=X~|&tknYG{#*@~m$&DvTm*1+3GA&nS@FO}jj+H(V$^O>3th9ix7`CcH)+vJt z(aMy*zcWo)a39%-WNr#ql*_cXuzQS^hb#JP`P6Pxu^738|%GJ0=5QQeM>p_4=DbnJP-Td7{eI%yO~rvyP+fDU4_ zLbWAD2l(L5pkMl=Q(*32T5YJne@0zp%LCG>OjS%_Wzpykk=EICQ_W~dq}O`pr)ChP zF(OR$@$&&nh{OGS>JjQ~p<$~u5|&HCq|HC%v&f0Q$8{NU^U#glPQJ#FRBP_t-H%nN zmu!0OVcHIPAe*7o)kg!Q5Z6&7cPrt+T~x7#s8?+@RHo|{)6U>n`5F8?mlS4QgsyNq0=Oe2 zFX$rBxpe2QNg$<=IdwxOyPdFBXOtX%tzuL~#GpE{Msc25W*M4ED_Z$gv!li;V{K~d ztJjeqLcqm{m(9xZ-nD8Tuqp{nnDrXx?S_xuM z$Y5t#=kkH>=inl_8FMcDsU;IBbK}Jv8J9!~Q*+ZJ&=MNU;`x5C;n7%VP8>O-sSQ;T zF0Ftx;FN*iXitj~2mfr!RqqNGh557&JTtW}D1~F$rL5Dl;WeFRD7Lw#(Ub4l3<1mO z&h&ZSxYq)jyg#%n5!^}mJvholnA79M^Ks9ZxT`m<_xZN4OetcF2e42o_B~y+YN{(1 zJ-S?U33y`8jZz+#Ji1;-7SDDqye}TkcJDo1Gzkt$9+rN5++%3Q*g{)0V|LlJ6arSe zD3ia7C_ef)Jfgkn z&OQ#79cZgb9fO?H>gKAMs+~p#N|!`YjpL5qlg~0WcJZ^%3KrDqNp{?$|3>yOq)$`X z%NA1$4eTJ!sIEVV*N{;KGfw=fPmo0I*HgfE=3NqS>a_d@;WTY72db4Zw73%CJlGGE z6we9rLo-U4$^g|Y>eeXcLk3WebxY={t2^Aar1cw+9US*0I~R+wJ# z%vx-sPHAG*os2W8V#$rZz_G`slq5om`*~0ZlSWu=kkX3SPl!xE!6m0ODF>6!%2?5b zQCDe-8|EE_BBX0Am3;Wy&;nJPvspu`T4fB`g{(`*5K~N*i9sNljvo|Qzs9sTOEGJaIP{&VzSY#~ zDQ2V;Y0-fSKhQ!%6-LY5zwepCa!RJu<`|@_N@c36o~$Zw#EeiOgP5lqBKf^glDO&f zufF|=Cq@z^qa)=w&r{%4kWCWnRZ$t+Dodx2X00-DY8{S2X%ARX#YokWpc6b|#v!tu z4DeHHs5SJ@u~E>8vPo>rBd0xM#-Z>|ce8iW2!HdZks>hZ^hMoi?;GP5rrSkpT{#1P zAFBY`P4tWKL~xf7a$Mk`GEz@q{(h;O?GKrIyaQ~>>khOQ_?Jo4H<0fSNyz68kizxj9_!f^gLCK;was>i&N{5G1~RAFjIs#QSNMz0@kw&n=mlr|97+xQCK$6Pt}V?11V(tgxcLsgIIOexXdLWNvuqrhIg#uj7#DZdNOhw;4Z4xS(e8leEO) zl(Q>Z#W%#lV_@m!Oc7cu;3Y}X%g}p-+J8vbz5Mp+&i8f08uVyU4VtO; zobWMn_%6wJWBFlVL^iGZu=tQuy!aphT}pxVCj-?8VNm;`_kx$q57++`%J~3N(9eMH z>LGn$)PhJwFcRL1d48oJx{(Na48+q|Oe~gqI_s>JiY3e6Huz3BgE37GyjE>D-Tun? z(CwBlLxvZ%voQDjJW%DI`rJ-A(4iVs`>@!2zwg;#mVYTwicXB1NJ#2aN&~aO{!o<5 z#Tw1W_cJY>NDsh<7$}{Htv}NkACx*$@n~kQH~!c?37G=A)&rRlayNpX>qogbG>E zl34plWeGRilsRP*pf8dQQyD&IL<0INfR3j^km=D_u~!=_t6Ul!j-TW=RcZC?nxy&y z*=(^zfw8$pj+wlJ0G7CyKzLQyIb;*XnV?t1dN`?Z46Y9HL+*))XD>&CoU$OrV?8x} z{7kV$ZsaSVbtSDF`M|2t=ZDex#8v@1p;K8nB8#a&Z~1CUm?3)U^boq#_zn8x?bhn^ zcdntt%l88xSiT3ygGQOe^HH{%9(cNQ26+zM$?nIyM)7NDS{7H`{)PY(aB+7pe{~A= zZ8BXgLv)V>3U}7GN54aEIoPQE>Mg|2liCLm9ML`ti#`k^1}qdGF|H*>4ab!~M4ZL5 zOVAKnR3ep0%*JuL$(JZHJ%aZTFcjvclIU9g2YA@95`y>m@J4>{x_pVi%p8Htg7@@D z1yLYoW@sBhEVG>x3yM+}O0S;fWK_wgCZQ&N*ctGO(z=3JrMC(Y=8z_qR4|mFZ203q zmwB+WPJf#VN-8r-%|f$+~D7K}!!H8SfFAY4t-%< zRJGRu_2mpBkmh$_wnMZtpS870Zs>sLymqH&+3~DnGdgkiWZ?IhF%W3b zpB9;daxM6A0b(np8Lc};3?Fp~tNV)&L_CYG-#LY#lN{{3Hb-}s&C$7Y= z6=^;BIAR$F0TGQmrxJg_*GEb)b^B-d2zFHADSP%G^1~Lxq@!AEWDzq^5rWIZ zR5F!OL8CL_JrF#UP_oC;`2FebFfxVs4VLrojC^mChypy5$GA>%QddZ+0iC$6$n%W# z8&Sjs+B|^mt(fIpV2`D2i9cr}!eyQL zS>=!xC#h^paQ_};12Qm{=GrJFEk$Q=M(hq-D$E`X;#8^`HBCc~5%b#r2y9SJjZ8F; zt{#Hssdt;J4;X#qR80uG$?*fkp_ zDx$%ckVn-Tag+^L-n7jN;onIat5lK z3H?oa)_%OV{9)MM7qwZGSxKrvAw;H(SIYa*0W`CKy za0S$w6G;8hCwZ4daxmTr+#q_1}56k&MA3NYLHxLgDeZ{s8L=y@?_J~G#zqSZY=fZ`@kRJ-{| zo%Dn3czAW10@gKR3uW84T>jsgUEJ{{8R&|4INgd6>GygiWsqj0s4wi|d#LHedRn`% z8N}ONJGijdQ8QlAWTS}AB~ec9{pb4HXAb2zt%$Q|!EW2pvpq7|(xw(QYdqSc>Q>kGp;A~Op3Tb6B<>pjIN(GMORIO387QW9i z(K$pE{R+b(==iB4nXQo0aV&tzij!%X229$D65rvZa2PR*c7m(sG^5@jvhLdM-;?v= zbMDS;&JZn!?7`LV)7B*8Dv#_#hMW~5LRl)NbpWj<)uaaNAH|-a(K9gi6lWmSoiRvc zy2C$)CzKTHmHIp0v#PD}CTWjZSK9k?xQ^@Q$;KkgBP;vH`A(F`4;N5hh%wD{I9vMo zlOvqQX*GBZme46k7RYSHN?~LO!K;AV*AxVq(|6i>OEK+8>-QCBCBA%fF{}QL24;Y0 za1DqCM=uSW-DOCDkIe(_LE8< zTUAF$+w-@iHtW|ZmwJ?2be_g=;`kgFrID(eSS)61?!6GU1O^0zxXhP$TrGv^t^Rs& zpJpK!re?*3kTm<`)*AL~l4JDw=BFe`LWa&5tz(V1fgVB6i!sO6q5&d?*YyV)J*rp? zcC`}y?4uGpQ;NL9@9t!bq=zlM-=g<9Z=CqHU(5DOS4p>^A1z(=?Jg5No)7$%p>kX@ zK15D;+q-eDB`_FAvQvA$A!(k=Re))yVnK3=KsbY>%cu2?pmz%!aRo0?H>D_BKIhdk zop3dawHy!U9&cy{Z?A6eRu~;Kol$YMUcpZlWETXUU(E_nukLtFU|!}X(u^nCa8qryah^NfjI#^0 zA%uSH+WT^D5Wu(0@A|A~En_CmS><2(H|-Dqe))W;Iq6{7ZF?Z)CI85k&jtknXXL=$ zrgJnrx(A7s(DL=Ry*#d479f8)l>rIYzXGem9P#g$}iYN@3|Nhf}*5QC%~HT zn>RntIvDrL|_Suotg!$|F$dVx_i595fZ+tL&bdApHm=& zCTCjpW8Ti^sorG`tAWg_9QfKrvCr>OM&~6>6bcxU8yvT)T5>n;1g3Pp8_zqtRrt_^ zz`!AJZS&;IE?r141D>;Q{E#~EL(p0YZ&Br-dLd0cda?w!C@`SX=X&r2%b-_sH9jbZ z*T`IOvi13IDg$mE25hw?v@mKqti_)6(zpYZh?L-W4;utCXVcvS@&unvXTHwCq zYtx}UfhyAC`GHiGP2u&~F5hnJ*7`7jLu=DlhkYtdsk;y=un-XXEQgo8)u&cG;VQZu z(}oS$Y+krk*YTL~eC93Kl@>$l>;`Maxmms!;j$;Xiu|y&S#sM4Hl?Aq;oJ~2=K(?2 z+Tn*nbrCZKbRY|plB3783?XJ>7>6?(k&qakw#)?HqDowJAkHB8(1X&VbqGRny@ zuXV2ygwQiMWNAmcAZEB$dl-GuoL30ve0NGF_n0@zd?WstWwUWJ7M^sH@fx^bGqHTQBVWJ2U$CP0cueCA*mh6v zjHk}(@fBYXfHBWxh%YF3y^EmpnX%%sUYe@K6vM_t#I-C{ivAn&x2oxUOP-DsR;@J; zrWIb&(~b70Is~gK`8G6yrID>yWx}-{b~O&f<=26a;o`w*6HbtITiAK6emnKW z5JQe+cZ?s~FXFlE!(00HB&jymh*!*0-Vswcu6Ks!9um1;INo-tN7Y>mSw3y&Z5GFb zI3bRH=4<5cWBcQ?H~+rwzWJleV3!FhbE*nCn{3z7kvH$Pvl)$6wAtB_=iLL^%+=cB zMYiquyv%{CAHgEdm!^7BaT)4P^(-}bYKoz|`4ZIw4E-4WVHmRYRZKl~*z;nuiuq!v z&AG{Ei!lC}j%S6il7xAj{n_iyzhPerL$akH!E0DWCFjMzt5fAdb-AUZZ*{lJ_G3oD89B2_()Dy>-J+WO9Ng@cP1@bssxta z87w=>?Y9p^S-=FJ)s3CLkozV!C%R)JixBuDy#u;6mivbz;RAVnawk}jc^ij(4~GI5 z$DQI@-8R2}Tm0I>=gfy_t@6ykt~?yDwOft7b|^Us z&kR1&+NM#T;BfhoakSs9rVbbq*Jzd3p&dJ=ZNJB!Qd!QoB~L&z%9-F&kQiok=*|N7 zL3Ep`?$fqz?O%Jh{n$)x`7^5-aIUnMK1y&>U>^1)Z!2UT?k)Wq6j~hxY)McpCtBcw zT~Dv*@Eey8x*mkqUwv9BixJk;?&v~m&Swv=#D5L@HjPuAy1ACUjpjMEGK7`fs9oB& zWbCZ31ZQ-1Znp^t;ya_j#goey4yeu!GIQ;k*4^ zuT*_IOO0;n(s18=cqvrI)w}NC(2448)>FodbvkXY&g$UdDAMO)IMQc(GkHSm;*Frm zq@%cXJ6Sf?8*={BKHTksdJFtFm1^!Go{fzT39|kL?*0q8{eOsQ16q=p82=$%^?#t+{{hJ61VGXM zC3XdXApr!%w$1>?VJE=;fAA##2ZZ{6kTm=E?z8`2_>kF|xc*NZ7Ql!6L!ce~b%_s8F9v8b`=Q5|2bGPIjE>MC(Xdj{hhl-_q@I+4*#o zn=?mPkAfrI!x~0S5;I2L=HHG6jer2I#vB+V}5Z`6aD# zG7l&uG%zeAm|l_6iBC&5yX*Rl+n_$XKjWF}nJeAU7VxFYBBUlHeDJ`)bNqk+Cv|ux z$;IPM(!XqX$36f-;h2CfqQM2@3xen6`YXgv0nq{F>gT?D0sD3-D9p_=G1k>O*x%CQ zBwaP7&&E2K8~P7W^i z&W=7O1qg3mB6D|2)oKci4EOi83yX`)j7?3B4}2)8=xAz6E6Z)IEp7k7h)jU_4@%^m z3_W#iO4?k=*^k zPU_;Ihrugsz7z)bI`@N)JqTO~+d~~>&^LZ_rbhYxQPscC998;YI{@h%x9Sx{~W`KqK&H4@pTOnz@gDsMyhfWturk@qNK*NRZE>=N~ ziLlVGmLbTeSla}a;Q>Y6BZ+b2s^2BY*87j5ZpO}!}cIYKg1Fvt>DIu zjDFoRnFK7t62hLXe)$Ctt0eV(DAR-=#vkNd?=1{y4B~9)Ij*_@SEFrPBdyuJe@!Qs z6RR>JKhKrpNQz?F=D+JSi@&w-0P335A3 zr-b{u7Q;kfGfaGGCm2K|Q^a2SqA8$sYM@=o^PlVGqWWGaVBfVNU9$A%U4kzy{dyX0 z+*&B9;6bL!s>d-G0p=EIGu$CTGK8*?G@8;J??+>?X`QO8ER!8*Rfo854VOVKUd$IF zvidm5HkvO3hkO&Fy<_$Klt3ei4BA6N$+I6&q(EHZuHigI8xkS6WK6oVed^-o%QAR_ zEsuLIcGqZ8mB3MljcO%Zojs^j3|!%unFJG2LSY&SHf)&myG~c{kTjPwHy`?{`7KeS z{kO&r@N4EeY?Ic(_C1?7$yjf3uJek6*{oMg|LsOJvwVcP>{~5;>_8*6bC+;3T!~2k zj!!)YdB{8*tf-;4u%G&&hI@CykbDg0tfnBhXS6jhp7d@>S53tBn?sDC_-NTv!my*j z?&T5`l(;OF!p+r-qRLFO%f48zD?GGQAmn+Pa-jcpFdIn7R(A){`Ck7~z?21C=bzK{ zA0BBE-&}npM!AHT%Sol0ScAcIS4~|Y?LqQB;fr1aZP;Is8t_B+O;m=aN~Z%hlGf4H2p(?XO7LzkA6 z$IC&wqkcBTWtH$0*!?5>3B$1KQVuU{oRl{AFbhEwh1y(p%Y{al_|mY;k4TqIJfdM0Ir5pVHN$ zNWwOdD_G$?z?;T^Ci%kk7{>+;pQo+cBZ-^QzBRTem#^YZ-D)6;zI@xJt=x0RR9iQx zsty@EfBO;18Kf=AUJ6)JEm@}Nl@csF8s#Q7Mx$NwGl5dFeHcX!0 zb=S4~BbceP$~K+pNuzD7&yGj!*1W;x?AIGKSc`kh^qcDn94OfcCRc$2#+mK767C$v z5d`JY7Q|V&BEK}ZhA`cB6R&}DD*83uuE7DUaBxnK`jD-idWxBpv%S#_NsI=?w%GQ7 z0T{uQ&KShq}CI&qe-?W>c zw@@0O%ikI&V2GmOb94oLO~7hVG2hLfp?!*W#7V1-x2EEcLU`DpN~vW=G7e)jSW}lY ztTS13Ctju{5Hz+`Gzh6BqIJvWSYz5N=YV881RnO53zv!GJi30DR-B|gN{z~x)(^^R z7lKMk4O|MvBpcmbO5u+@^OHiNK`dI;c~AMR-BQ-kLexO|%~m+~4))QVA$y_;hH;Ak zgF)iVhq8I;%=5jA8KH6AoG0~@77-~panGvvBqo`t#Xw1vb3V0QgN1r3;VkIq)aT4WSfd6@q>VTD- z!(V}n`D1XFxEkIRdJ9|C=a;dW{^kq!9nQn*A#a*h`YArSfjg* zr%WOSv&E!+yYk^tlqoA_H7;y--POWEtVy;o=~F`e}|CNoy??27d4` z*+Kg{WOmMnfNg`fsPN>w~FBWM1lYk@bvws9*D4bLI3=EcDTHprhz71}Y*23>)in=GN zV^o*G7Dw%orF@A_b6>U~BI73PF~V_iow<=iUBfcBVRj8g<2{y)y!8#C2uT9F@_Jjk zV^So!M9Nnsr^tb(;J|6xc{xj7W3umOgg&$Htu`?6FNQ`l%*t-i5-Ew?V|d=Tnl9EA zBOS3{T^5$*SJV4Lddu2S2~1W{=HfB!X6O7Bol>ey`HHsa2GO_G>Z;wE8_5-`EEB<+ znBP#LxbscCYczDICsymE+kD>?I~U_aa`KnrJft=fTZxi3zIu-k2X8u4GG?s+~ z)sjzkYOeX*t!uU@9$b;2yk^acFsNFdWQ{Ec(~e>JC@zSG_Gb~@Z%Pka^j);+Q&OQ_ zP>Hs>5i;e%QO5qs+9+klX7v<1A0*7H-cYi>|4p-<)B-FYqQ@f-+`qcFE?MNy06u6y6FAjin&v>u!NA0oQ1pH6fE*PaLGaqegb7?|j4 zV!O1eR7atfesnd6(9hw`$MOr<>JwQLgU%WAYNPzSrn`kQomKmqpz)Rg-^WzRAt8Yp+agwWmczmb6~JPIQ~OGdN&^ znjxGkn`eI+O0DTZEXZMLP+xa7X?wQR1h!M2mJY;Eh0Z3^SRujC6if!;iqfx?XeR z7uwI#P zDkGCh6Gi=G7tGinbmSt;pE5OuU zxgNXQQ(DgflbCyC80^azD6f;6j+hcbmu*qp8fc$*Cm+mBWZiv~W6Q7#Oh5OpVj5*o z4yX=_9fF268&T(8hdnH4R{y#$u%Nn|%Vv z?=LIM?ki0`qy0f7(_txoyFCtgM?KEZ8=`6g$HpkjhuiwCtsmUc!u@zvW9?=WOro$O zCJh^CN6aSA%pM1Slblk0U?(s#9$2dw;q~v_rv08zdIR~{_bVCoyK0R=WkfUWDh!>O z4wgU%`!=X=9xxy7QLFJZ->;sLbYIhHNS1C1eZ}S)TO%lBnOg_u+MlsPAFRIx%gYntQQtJZ9;+h0@9>;!(uNo zMc5(4vH0F9;Xo&cG(KqP2bUo~C=;~fw9kBg#R%Pob2*bKYC3auU?Sw_;4^JQb@UpL z+Ft%lXdw^Z+KY-)VV6u0FG#S44q%4iX62nWBNBYEyjv-pl#)^i6vTb{vz^%ZG<&~#G ze`S~y4HWeo25%;Q3uneJdbN)UL!bqdW0^^VlaHQqa;>gF_id(VbTQZaDN{)btyD{X z>V8W`l$dp!CxhZcNz5Y8?eYVJ$16T9Whr3hMtbwlaGKGUiCoXBZ)9GG8kIoU?p2)S zJECY6uBJtON%^HOmq?5UDpQj--c`nnh-}Vmcd-%uE{WH0XpEy~){my!71{%C7$+lF zzA61OVr*qZPJRB@Y*z2aI{N`@`{n|&^rlng^Ob3Y;cDX@(WR{cv=ud+!q=8+2D!VN zo-0}p?o;pl1V?wq9D9!bl}8aoJl`l}j%9Jx|3%$B1$Pz&YNC&A+qP|^W7}rOcJhyH z+qRRAZFFqgPHvwwcc$jtnVP5jGLQRZRjt~ry}tGP=mNA1svqe4R|}mZ_|PxDC!oyyC+Q5*5f@g{FyLiQZo7zVoqYXdhasL5$@+FB?Hhs`{ zh4ido`a{*2t-xsnCQ0lrL+CB32JoR^NT}IffMmugV(N9^%2UV=&DD2p=H^w^^a?SQ z07-C_Bd906_~#+F)Nf7aMlJA@36+G`3QQxIgfu*L!8lB_FpaNsz1k;ZZ}X@a#7<>p zXRNF&%r7J|Jr+I2;TU|P3}YzvrFS~sojM-;)*6i<5P^Z#ZL!9sbUSS z6w%b{*3(#TiHPUA>x;>usgR4Ou)TeBk&Ggn5AE8c3NIkBwx^2!7H=J|J}9Q@hHcMK zDS}p2+cx&6Y8w{%(`MX?zMalJ3@jMrCWKqn-7RL`xVo(np?9~X?X|V5J6l~hAc(A0 zqA9*j+N^A2FJbNilG1c}E6t)pw(ql}px466WwRfr)eE6VExaj-#5l}&D;Z|$`7UwY z%!NnT0|~$*6N8k#WOjSTl_&_?H}^<4HU-zRo7J9xW2BGR$#nQu#9Zt);U7fzvfI^S z$|$dhA!{I+=o6}!GAxCHUg>OtXAvX1ka_xHNRs)tFO>wiWh2RE`8Q!<>2GCx`j`U( ziS9UonquoChrfz$CE`+K$|Tlm^2><8T^Dme?a9ks72wqqPLeKXI?TFfu}OqXt8Ok# zq>C+*t}QKP&6J1HpH%pRqmsC!4>21Sf|>e!+?p!>{jxL(j*{wxbWU+RqJO!muc1&R zOFSf-?Mb8(FEfzb49EmnffBszRTt#*~c$hC$E71?5L=cZI({&fKE>KsFBi5#8RlD|$VIIZGGyK*x zO9bjY!^3`GDOl>bikPSvF!Qa4iVI~enrIO6>olEbA6Jqh3XnKTl`)#40srO3sb323<-flYGNkGQHE_ft9t!ZYK3E#J^_jk3o$6wm=v_HXBqTB?;P8 zIX+Apny)BZPG->oB)d4`E(q3@&A*h<$_DXLc| zsD5=8YENbHBW-GrX^7+~^=JgiyN%k7LBgitMR42N9%rB=DdWb^_wmOKj7-!?(PVyf zS8%!go7d9s&ad&G;zK8HX>*2bk@$Z8#IK4Um-L4okGpT2!mr4SQgeW=JoY^z@N6N1RO>y%u42Vw9_SDcQ&7%kEP#38}t5 z=K!y1oL@kGkSTm~IyPL8#`ZrwWV5A*TT_bhK?W^uF0`Zf`72jEteHW+_Y@^i=Zk$ADWZfQa9 z<3U%;lvp?r2NoP2V3QHe1Uo&@Ci@pES~Zj9=~Ih=;J$fT9EwZhR>AB@q;3`;gMc4_uj~SKcP(%pmsn<%#FdDL+BA5$?eYt|YV_z7 z)t1!IzgG-Ino*PpF684in|b8>a?CCzz7omC$7#%Ly67bGXuk(w4e#E73HhA1phnHo zgS<$V!A6t@KZ#GFKorOx-Sc+7E9E)BnRQr$%0un8lhLbJh`WKkj~J+U_I{Mj5uex|dJ)(o4ejH!Xu zq(o20>w%_nCEmg|F3wleezHzrZ!JcEt&+0UFDj6nOs(`cONX&q;Kr)Ve1fwOfHpWH8kjZCT@85L+qu{cx0O%F`7JEuO{fyh^=M z74%X%aYWq;QqcqIdu@&hlZ$J8gW)=50?yj=s2J#4#p`iD;d}XZ z3766v9<#!%EtUhW_^C6B3Hn*T5jxBeWvdAc;ezmSSR@6f0q3x)JfV&~00+&KBLW^v zRRAc(98IewI4+&5Ji0fUQ`$DB7`vsY{kyfmH)HF7CzcGw)~;%$KnnqM)GuM_J_z0QJPfuc8Gj- zS(#D&H`AcTct2g@Om9i>p4x_}d2`_9j*s7F9`x2Qa-nz}uUri>CCLa0J1(=boR6m$s-A(L- zzI{d3Ev1!|3XYjX799D(GaxCMi183T?ZCWWWKMu}a9i(UTMu-G}c z$-TVN$uGCrpp}cCg-A0fGovP6qklg*BL^UV1KQ8#rr+Yk!QvQ2GBkMt_0()_#0A9epPYli-Fj+B5e-F^j%>IJ;!klSK^gW%BOH%L?n_<20W12HBWLZ#k5+kMeUL4VO|ko#)4!A zc{YEkcB#PtW}*;Wky)K^+0h<66_uNaM!}BE3bLj-8P*YIEf?a20;!&M$BDJjkOgDI32RFr=JeGqI7(Jl9^2_9LL6wsVBV!@$3UX>w< zuxPeOZ&JIcC|sZ=yPrJ{-#@q+KQ3o|SHKKXLZiD2AsDkJ{C78=H;AakQUeTN1Z4f* zd$}zd_1m`_fV`B?u-q}479xSacx}X==}N7lryXD*%i~(bLzab@F4*rA;UGO{E_`Bl zqiS72rx?yL&jTF%mgZg~PT-=tdG_@0)2t(kNGBzs5XR`JMME>_dOD(?Z27%gnbGQws%$xh2x||m!t3*iL`{VuUrYQutyLKqYdyvqP`k*>4Qf9c={$OT!pV+{6YqWR?NfG64Vz8h;(#MoTB70(Jeq0{r5Dc zCGg-nZGZJjG=0riE7)o@SUG5NJ=6y zUlX67&)@gz&7GM{w_+GS0D&otGKH%;?(_u}&a39ozzc`3tFEX6G0>zKce@RS-05D| z-2gJ^w=<;vr@t{tB{69=Ei+Sq4zb)dQwPPzY1<9z8RH4A9g0nG2s@FY$1G2LT{yq|E&aDq&CEhKv__x5|QJwgyP$fy^+6KKu}{Gr1qI94<|r!2eJM^Te8UhtT2D8%+ibW{Z3q( zMa>K7W@XURp6^L-JUJi9eN6frqDtf{#bm#)+w-y4A_|kF-pxXA#6U`6;)r-*=a|+F z>=}|m9}^DtXu*PBif_`gws+K(kjb^)#z*TrSBf!*Lq%;i5DGo~yFUxh7I+s^rs<~} z_+JuF!hY$WnGZsgoFUY`7%dkeLlSE@Q3-RpS<8VQ@Aj8z-cO4ecqtK5HoxwYzdkWC zU_3kb!nh+4ZkaY*OM>v1-fD8$T#ogxXnBDAA%e;>f1d|spg<%Es{v)k~|zRRJ1{kP$d}h;_vjX=AwP^&dz3hAq3>A@V2rK+VvusXfF)f%?4~ zBQ?*qv$&MPeQwtDt{Zs0F>N5^U8q9u8#tmg`oJED@6zZe4B|Xv(+v5Vw+nh(_oJ96 z1$cJKxuNY>4ksvHc_bRkl^_A0pXJqyUkMlF{aJgPo%vDVjq@>pYVQh(2$(MW)0Jeg z(lQ^cdv%rbwSp>Vxdmo#BuIzyoh*2y@TQhO*6;&F6-bWwzvgdP|4R$`|D|-of5I65 zNlN@rbb>4l2s7N)37QtH+X7n-Vt9UGlR6AR|7-wLke5G`)rH7{WYWvOg=;4|DecL1 z@PSDd?!U^v+;5M} z;`r*5<_a7D1dDLAB&qDBkS+}2H_IutBg%86VhxmuIfZJMu(Ldpb*E@be=1#_Fw0^s4Br%yw{Z=cV(J`EdS_^||32WKzqxmoEnMzdKL=9sl^B=>)d_(5L@< zdg}i~CvY(R*Thb!+K$a86P(|R!QP3m${WBIa%8vGef1} z84PtaRZu!lfR+<9I1c07d9(@TOEL26&e|TrHmo27sXA^Lp1|(518!!c&EnxI>21sQ z^zD5tsSVTl2kUau;9w*gwQ&#$pjbVsI9uon?Ra~*|IHiw{5Z;otf-eL?0DW3EDsby z)5MGEJ=)b%l`j{_yI>(|b-WUjHur*U21)SHZ| zAs#KNrgKeQwv2J)w?Un*8qV=l6JoIY0f{pd%p3j;ZcdA?5nxh`7rvpCf&E9Jp6Amp7^SQbMDZ8)!B$&3+tZnk!O1L5z!qAR^`1$ z_4_ad@Aw5vE-;$3SHCQ_KwH1nu#bOI4*SY*-4kg9T29n|Mxaak?gaNbGygY)JKKMl zE&u&W{r@}X_a9-r|2IuX#K-p^&I~sZ>whNh{sW!iVET9PKk)Vcg2Ml=uFb!p{%f@F zKX0*r!~74H=06jQ%Kt}>hV6gmX#U$||E~@EF|%;7{(nsNPH@$fjTO%CIch2Bf3@Ya)7v}GE8JeQ9orv0?%g*ZKmIS+Cb12x ze(GPxnKmpkYTpk~* zvyFYKFG(&RA3qhq#mLCaOwH0g(U;MSmxhYX$ogD^0(>tp2p9<11q52iaQU+i`#$>x zfIUv3Ho|MApxA&&2tZH>K&s*M!GOTfLInBy4G6%*$V|~x*<9d$(RqYUYygpfprDYj zpuoVeuzc2Fe)0!I1A-K$iDPB*KVflVK#5PP!d+a}B}?eVXa*r&bR}YYvC`ecrKN7R z{e@=x$A+c{Cr25HsO~hCWwa%pBPugH!%9gAiF(r zvCy#5@lkPK1O$jlA4JvNSl)LiB4^e#?XpJQiguX7U^i%bkgDJjY@(o!|l zS64VW+7RMm7361U7#Zq%_e6l=k-pzQ85sDu7{p9X$xNFa+L4e9{Hg)~(IV4(muUfvb=ja{z(Msf;!UP&A+yAlYnHnk3b!3^` zau-K95qN(Jz);is%D>iTGW@26(`mF}T@aqUgr9Is>Xwv24r zD2bUlzmoa3i^=$ee%fEo0^MP5R8y8gmiMU+db$iDubqC2fQMw<-^`o0vP~zwPhm24 zKHYbAzFHxc2L%k)=k-rvdLX&fjlbI&6RFqC0)gdUItKk{%c-XyK__i>WCS zaH|gaLealkly3O?CyOfJR9Gd-AAqwA7yYY)EFj{pvg`QvTwDjLBkRSY$uj3BZ=TD0 zVx@p?$M{)wecxG?b5xj))_f_uriU$lKK|+4snL@4_1qSTbp5 z`qvnxsHDS8Jc?Q*MBSUe%%?e>mtmqbwCf-43TeZ7ma<(d>AJB?{w+G^g9R5)qz7aB2WYT)p|Zq>pmQpn;M86G)%+ybkESaax3kLmNXcT`p-e42 zk8Omxa{zxXYlly`0Gg8#t4&f(0x2uySx_*aOu2US&&Wi_YUZ|2QJ!hv^C-2d6CZm- ziT2{2=xe{g&S&JIY+=82FQGPWd$o6()vR|ELzq{}AanBlUZ(ZM24hDi+M+>^!CM?=B-JY?2vjI<7*&4evU19gXPN$cP>&|MfCVm!1LtbFJZ`XLJ>|#N zTkX)0`a1#34r-e>EL?G4N|hSi-J;M%x_?}gA!M{$d4*4PO!l^yIBA3wTh>jB?OnFa zZ+Z@vA36&XT%XUZu;MQ{dh8AH*69nRw7Ec?ey3gB(i0QW@BmPUSCh@+v%t(H*MOf> z3e4*1*R=vkZI;2v8+6}@zFa|;YH>UInz~CC^VL~GrF29U>;Xr6qGEImd{lx(N$~?4 zQdMN1m{pHYB4FDP-4X9^=k=+MEPzTGFkVE>$aU}?Yu(l zW{GIf4DKD_6>UImBhL3wV;|LZ$?#vSNU7Z&pCI76q*dSFEY z2O%pv&bbjSXmO1~X0dUwM?WLpWHSsA*_5FD8am5YRLb*sa?)T%$2X6c1n-KB|5Nw^$a*#zf|37giaaN76vD> zmi2imA-=u=Q>KdVU+~DaY?4N~T;0|JKA)@d7XH}**r~~)fh~MxF&LWNRI8#Ykt$P3 ze#&@t)c%Z~xATnF1Cs^|&%er%(^??;38SvhOhmP}3B;JqsmLW-$ykwvj3VK49q8gO zGd-EJ4URS(MT_=Vt&V%8jKVzQol(1LOg=lGm@7~a3#vU-51;&(8p5oBL z{gn?cXtF`luA1;s=6*Xet_s+o)H&mUhGKosm>ay4c8QZM%kUE`=M*VqEXq-m%a1M= z7nqS^qJzd%Arm{$)PBTlx!6$#Cr}4pvB{LsZ)#{EEZ_PW`F>WRfRztn2G2db6Ge>$ z)FbHZSq+mnxcbpsbg&#b-1cXk@naH5L%oa|5xmHUacY zYahTOx8LlSV=>b8cXnxGBSa(L>X8F+%gSP3+@mYjO+g42K{X&3<75nF#HriY{D@9} z+m6TV7cQK@6`2*3Qi4fKL&dnqOrK55U zYColS#Om`>{~q3uwibzUVy86&owx=BGy8 zZH78PDKSow@12`pxxo!H&f{_txJ5b6Ydhf-+2@JGd5>088RvsTZTxu;n@Z2_@O4qWklFgl9GYTD@FyU&#iCL?B4h__d%uT^13F z;kseRsQuEvF;QV|@Y+0W-d08R2XM*Q!t%q{nMxHyE-$ZcGo))!tfMaB3Ge;JYWtZs zEVU77FeRzA(s#+1%q&}q7}vBm`J<_zc@_Rh_w<(2jJi!2k3rU}f=gf9JDINJGyTrd7hL(vjGd|T- zmr}mK=G4b0TXEBb{epNIj}!>7xIy~ZE=N$U8!qZ~5QoK~D7qZqI8@NGI`kT1Y{ z8onNLOB2jDWPiG?|LxRd$8i$1C>^6kin6Rl!jkDGkrc^eiGVmu`$sL(~X2wrS z;o6?-T3_^o7493g@+leh5`K?x<;-_^FNcrP_M@823!Uy*pN(dhgHl8_YA$}UcLp7i zto9Mw7sddDQ6yw~GlyyYmpOuBddL7}6d_xcHqx1y|cU*Ehh$dcJQpe#na5Is0#)dV%nN*`$DoZf%F5FZz3%9np zDMA$O0C+1{k^BGR#hxvRoS8S>D`ra3#~mpeEug$ZX4(Vn*=6Y|3rY5zXvJ`vT5kwwCh zcqIi`#O1iTiF+cyL(G7v?SPrx}@#I`{rWOwDfUzk*v&L09E> zk4Yw-dv5Uad<3>SIRmd0mn-O~#{~skQoo7$4r5k%kl0B?yJVKWlnnpXs}tE$bC+-B zckJk7v#3xyHocM2+Higz-{!la1Y7bSpZ7euBUr1iO|>hwe0!aFx*RqvaSKBnG%Rf; zkp3Jqi7MBh26~96!P>lI z{AD(7%*nSJUBh3I8)f|DTfBezS3x;{2NmzQM0iX`?)GdI!1*^bm{I<8Lxs@+^H0E4 zT-dD`tr_STl<})%Q1eQlbX{)B zufVaa4Fkf`K2}8}9gMM%<~LKvew(Z8OEh9T*{*u3{GJL>O(vw4%^{Moh@^%fvfVX5 z!>DNO`y#Qh*N`AIUDlM^cC)(3m{x?l@>36-)3xyE00kv63J}!7;H!kw7wDcNLeNax zOV#v82`^uj9b@rm_Kwa7^JxuiEx*KByA!7t9y1p9no^CRxGQAJ9x%N%?2us+Upm>& zk-PQcRz;9$$LXU(x?>o9P#f~=GTD+t*>;A{A@j^b=W*p11wes9Z7KiSftH zV6y4LR$~GxJw{xXM|9f#-z)c2Nb?MXI;&tgtsVCxUNhiVX6U5GI)O&nToe+mZzHc{ zRbF}HZ;562!OpVL7c1)R`^j#ETD=DEws0PXAoJtLr`+5-D}j2F&WlIn6Y4apjII~+ z8Zp}wl{B{=8~ZA9iOvT6#m@AwrG>ysz0w(t(Z1I?$K^$F@DCV`BZGG2E^efRQ?~x9Ry!1~mLtbbj3%d13FnzM+zh41%d{6&Ma%_(!q!(ogh^1(E&p&)bb%jzymJI0uEK_5zi21zHgi#&3`!y)Mfi>;`z< zV4dz!l#(JuC^-6=5pDxDC`8xGe6z`oerkTp#J06CF4u)`idF6wPPlB=HhM+{R`E`4 zm9J19OF8L%E3wQqLjuo%p`T%XEa&_5`cY%S2B%AlBc<6PT>u4Aj4A-j?iJD^vwC81 zj*4-ko!5Mhyg5+1h_Us()6#Nmp}ByZV?@1SmW{2+^4sT+Nv#i?p9 z$jkkPf9Ba26+)PMKW*H(k&qI#$6)z*5tm*v`1R4J!2pmiDHhYxwdc1x0ACQMjP25wL&00PGJ%m$!M3- zk@j*!<_S+AG>CGKy)M_wGDT4!DCvbt!UgdXGf4_^^#sjPTI^RhjDnk$^xG=Eo2ZU+ zta1Utmg7lD2wu%`4NMuNef|d%kO~*%^-^s2o;>uPfYOT_jAb}(pAOqkc0N|huZrkZ z*dkCn>4gL!V^tN*FYd*}^s2S=70hnJBA7Ly_fDl>(trGr@9s6-2bIp{TA#dc!?fjb z(+xdaNKVqGS(zQ-cKt+~ySs~DuMd+%tkzNaUe0fW2URNb>qr$5qJD35>#l4GArGGD z`2nQz>H76@q(lljjBVR`NV(%$W*r%r3SCBB_m1Cu*xzTqM5jDpTA*rd9fUH%)aw0Pf;;05 zYog2G4Eju@Z?oD~*i=u?qc4Hau+%E8JvEqgCbj0m?BSi52xgdc$uFZ7m6~f>P$N7L zjf`G=rt1U462J<1t^E_QfANMp@^|72kSF`-!bx}$<;#EW=CmKRJsycc@Hh4osr&Uf zA!VYkJNPwfCos1B$*8|w{Q(+KF!ri={*wB+7!AaUd!GYJd-u7W_hnT)2Pjk8rI>@x zjm!jnHQApgh6}hE7$Z8q9ekS8gQ~%vwn?ojzIwratfM};y0le5YE11PN~I1t8Xc}` z(lu)8bFu_>uZ^QAa#>3Cam4zFyIC! zIFQ&wc1*j61&GptPkp9$^eCBdc_-U=vwa+ZE1EtQBf2Sk4BIJb@~Uj|l$e5}aG4>{ zb@?E|1C{ecLBY-VE`H9Imw2h1YG$Y5>@+^(*#a&^F`JbgpD)TxVy#8&X_?mW&|oeK zIMPhruCh^s@%E`}EW?as`^T9#Nv1}bg%g28lv|q0F`0?An-(J-O8L}+@`RMGaP_9}WS1$X8oUji1mZIE8u2C{@B)yT{%yP^OgV{~ zV`N(sK+@~eY%ozksN@-!JqjRVj9wXBWEKKzt8P^0z#?6EO!+tv9txsZwRu7AM*V!* zABL?VEfoQBkLDK5^Q)lhrQ7=(%~Kmy2B}aIFx*sw0qP~5tjDZ1rDsj`_p+iqO&Mjo1Ln_F}l^A|V~PkPD&CnQa+vdx#d$fWKv*tBEa(3&U#SeWUo~FHB%o#g~UBc>7#GIRcK%jhoaM=X#;KO7w2BOcL^i?x&i1*^q>v+V4 zpo&)0VGEOMVJ7XMZx|*v_LDjZb?3r(=k^)q^({)3rryZALo(Z@A%mjLn8Orehca|2 z1^zC~gaK=ekj6m6W%Py!hgcWzrFUdN8N)&ubM4Ho@FdE2kR-AON0!u~3Sq^d3})rn zy$vV2+Li)+xaD@h3Q|NiRMqMq5OXl^%pdaNCZs$IT}(<<)(8-bxjPo~7ickjKtT3X2sYRxAaS#EqZT! z4YWm`=w@uFGO%sbvr`EEGD*?L!9{%Aa@pKHzP;?Wyi?_s!aXUS&MED5lOFFRx+z^^ z`pkyCYZS7c3dP;jJb&YZ^B7u$-{VGeig};vmv}Sg+;_{nv<@hTkb0X?*lB*N#Pfm& zQpa8^D8tmN-BibH_ttH*=_KP<)7xNDc(dP7ypGE~%*gQT#|kgh;E-=jj69!K47#M#+k3hUos#(d+E!3gA1AVYYMiddv&dBJOR&Eo?6)U4>N1* zdCY4YXH;@GeZnaDxjv4~i(%pCj=|~?uXYhq$>h+1{zOn$x$BNA5gmv%HUQu=;WY1` z<=_$Kz8wO(Z!0{x<0HRC7^HV~_FT&s7W?OCliL_HDXKNEGU@5s?x+NO>CJmP-Y=!M8MDFa`as`nk-Vn0808BK?>< z37>@RVcuTi+C)4K-^PVtmK*7vg!sH#@ZeTJIU2BGllI*) z2toH}{$^{%4g=cBJdyhNv`JZKqjz&9MdEmG)7MSetf;Yfy_zy|1E8^rOGL`c3`aDE?Mm`QnX_O8N&o>(}u)Ap9ng!7)lJe4v4N;2~-EtHBBZ?D= z{Wqr9yHYUXd#2#DWfQB~pFwqHRdMpf_A_%b#ms#u(%ARo=Jg4Ts6Qp8`O}yl<=}dZ z{Q*dgcvN6M+aRFVwdkHQ4*=@0*s*GfTIe~g9tK%ONg+yZoGsBJ$s)wk^6J^#GuO%a z93`=Zs}f;Xxy~9Fc@j8R2`0C&S!OsdVC~fP5P<(g7O0~nwT_u@OnrNfbkO%Nk6_a8 z=W|9#neyW2XP-mbW8|yWK^rMXf63{g#7qa5-u1_}Hh7EHC%$m$7QM4;$58=N8Hf{{ zTZusDGPAwtjq*yF=|zfaM7@nO)Tqs#4lzcEg@&E^yI20)We&{aOE_Pv@8b;xSiZRS zc&WjJ16hGCpsqjADv(8^PTXIIyxtt%6yH3`tcxhmnv7OW{Hgj0d#;O=dru)%B}iet zf`YS?l7YZRgoXj4&I6~=&o?C%Mnt%gB)h0s zBzVAMR6Rkoay2vjn1rzQBnTYczCp`&+0@$KJ2PM9b-~iINLgu^A%L6MS?0eQG%h+$ zJn1+n!6PsbnOcfZ2~bgoiriJw#{ad0)S#D^?@7M|0ViL(g<+;9*9@(^{BD45_U<`#}( zZ=3i4KlN}ohBUS40$;(c2^$V)A*JHb1FO27_)<<4K=_%>nMb1MJV4A{Yl%QA4^D?E zE-KZyMCTlFTUw=#P*AR7_!UKpH~U&%$Px75EMLZ$GRFdF>24V1vBne!o7MY8=VMl& z5kF96NTqN^C?7cRT5m7OW7kB}OKw!c`-|EDho@iHok^WI=!Lg`ZfR*IC~q$5A4cTdl) zm4qx`4&*&QkX}0mxXAMegO0I8x0YHB^K4pY>jJy<)yF5D$aAbd$eC2Nvkr9Yc=i=T zu9@)*F37JGG^D9`rjAxJt#e})rPk71LxD5W!*YlwG59q(jYa=GX+2~6g2~DA7H8h1 z81H!wHuBN_Y_E4Z(g;I}VTa@R!bV$z4wB?w*9*^D(;J_sSXsG1hfWhX-tyFK3?ej5 zaXeQEVSMN-08pQ{$OM*7(Zv=Y0k6LA&U2&_BiMxcJ*%nC)WJmRC_*K~-Hg}EcJ~PJ z-QbSvi{d;VMCunx>TQ4T&a&7RS}%o@CS_@QtA3F2$MOoctEs4<#T_Qry=?I`x^0bN zox<0m2=&0?v*5VY7vy|NfjrI^cpCUxN8~kUk&wsWa>@#s=_2^bj$DJskmB)M zi6U#tZr^SzoRVXQU7nDxIaFV|DaukY|;MTBbbYb*Fa_7!hg_URzG&aW*0*83f3zNb&=4zX|VdK2p9r(XfJx4$PKy5D`m z`eA$#>t&OEVsMh~mE37QBw;Q1R+kY_IvmJO!6edf@b7U^?Sz%b1&NI^NGRY!Lfqe+-K~P(+83(^ zQaR<{0Lz{0MW&<|_hf|el8>kUgKpYg1;am1S%cA4z~Wvx1uG2m4}bNPCxUq`(+)!Q z$4Mw0wUI!Mgt5a}-TjAK^Z8*$z7?HJ0v}u7jU9h0N3hkb^=%^x?z0dv{>J7EnDgT^ z1;9Wcou+o6_#a2J`RH!LZ`}cnO0ge^XgXPvR}t;!*9m}3JrJv`%x-TPZ#ZS1ZcudW zEh-9J!r3XJG7Kdi;6n)0fLiv0Bv&PCT{BjGb!2cms10ix?JH3>P`3LCyA8a=b_B4moR0);^lU4wLw9?UU)QN2IoC{25 zx%Gj}W{dc~!bHMGYi;U~^9OCV7}sW{h9M~ zT7f?a{kKUG+vNsn@a|K2HpF}Gu0#5^I)IZQHr+kT6Nf*3X5=!1HpdfAJJE9}8!@YK z!HnA@9#`H2f>Cu-0%R#}pojvDNJD1KeMhL9{!f|Yg9c(QTjd&l?vo%GKA~K{k#nWP z*W>!5f9&C|Zi1eAp?3B5lw)D<2$7StAEU9YZ&RzF#x$O<XPx+utvr|$GIZJ=}93BA@FPC zfpz_cwQ@7M2E|v9z-2C!wdL%pJin=(E?rSI(_es*vw4bU;R)}&Y_QjDEl(4@jJ{-` zm%vqFj{UU6gxCGF4fT@ZhevhBPGg_0_)2~*=(tSjF14lJnB3(x`2V5q9fNH7+AZI` zcUA4OZQHhO+qP}nwr$(CZQFKL*Z;idbo7b0<95f5xF7DPH8W$bSeY>+a*Z+bd4A*E z*f$trA^!MzZG0wROdjQ7PvKN=gjq~y%6Z!sV& z-RX0kA`LFjR>a>?eW~D=u zgT<1T2ipqup0!8(-jkB98^7DMWVz~pRRjA^x8Knt?q`lEoD*TF^J;m;&Z9MRNJ-kf)s!?Y$NY$C20;Dny^v`qvDqYZx@nZ44tOP0|2~)f_b57 zcu9{ic6WQNY{`6ZZKJ-GVtU*P`CGfVk-FFw{#CSIfcva^Iga&O-FyE7K*4rbp+^R% z8F>Yc86USE@S?$we$JpId3@CQXGtaanU7QNLtZmrTtQio`jwRbm!LRv>{nY>y%L%# z-Q_a^Ny`~Jx=`OIp~h7J&3$h$FgM7p(>zYdaEbdwfJ9r0_(3{Lq;sv;`Qp!n1g)jMOc* zZOzc_+0`@vTLXE=s#zR`HFi5GuwW*uO8%29f{d1Q1eKxmo=_`JDuBj})4O6)hlVxH zTD){^&8jlrbUM?T3hvXroxq{WJsd>M*7LV!Q(l9OqbmIIDb9gDKLG=jOjp*VErz?H z_9r2Dy90(WVkKC=_NCsJ9%BpP*ePJ#%tHKcuxQi`yR-B&Ymf#}%F{HOHtM&Dy}P!C z0FFf+isNU;l)(SgM@fQ6)j4SPqi00M0D| z@&_^zJIWqo<~C32f6%UuQDn(+8G=ldOcrx(PEx3zM( zeL#f5T>*-J`#L-e6PzPS#jYyemUsuK>V2Umg6zPEt7}))qUkz@QXI+uI z>%c)(5X20ooU=wKHAua7>gY?Q6WI+U$Ico+pJfw%Su|2FCb=vd;j2*XW%ePQN zy6?`*ZzV&6%4@`jiA|BEoqyd3kVoVH=1i z2!`+DNVNy+bh*+I-fxJ>{ll#w&GEu}<7G_Y*2-4 zUu+HW=v=*Rgk-^slC*(vaMyJ(R5PRTpa3;xhC2eA4<3|`su6fvbCigEOyc04h|Jl) zpmI4%oT1wJ7$2Gf?87EaCS6cw+SvcB;XJlYw4!`TuYWguO0Ro6uea0e1oNW=_GdI{ z<}#6}mU%d;YWgsdmPUDWp3^rc=|z3t9Y1}?evf>M`+=u_aP#v;j{NU>*ZwQ^_n+pR z|DX04GXB$Q_wPN1e6$c7|MVCxF^FEm3&_YWi}eD$0Pym5a;G#n;-1bJ(9vIllhoj; zM!FLR6a#nkurBe^+VwpHMd7=!VWN1mTzm~ZLlUv~t^*UajKX_uvWQAyb&%1lx{)N2 z4?NikWZBA$qSQmEV9^lkY3j7{L*?1hD6+DP>j{U>@f4W%FVvWFtY_rmqR07KCbv7S zxjeI6vpp+NK5Lk|Y2P-zH(X|vJ6n}_J`2td8h&0D^>i&E9|{UU{co1(KW_1#9xd9R zoaO(D*8XpeTmMfjhCg}TH2;kXKBzu!WzY<}`K-L*_^bKV>ld$2Eax2=I4}UgyXXZ@ z4BX0>H%>*F{9s$KWw8_WY{oy+H-R-?~GK+g+s{Z6*+HkCy z*7Op7lT3AJ(#w-ICD!)$@g2ToL)$}gk^Nql0#S}?nZiH*$DHfMTm#4=4@qWK_ za>!sbQ?+MBmz=sx>MX zebh^1SH|%TbK7tKhx3%2eG#t&+cJI3l;RP4j-rfXaAk$mL@d^fV_l6w9mVxepbV~*Oq zl^I^~19Ma$J6+cWK-OCT^Sl!I0sjLe8a+|O%IIV{nrS-y#%fon5rRiu`2@M@T8L(l zM+N!v8<2T3$K<9QGpq$;}+BV#qDkq?lb;c;$iZrQ(q zW2NxR@aNKLK&g*)+0B)W3v10|x5l#*$EhM|rZH!Y;ztb-to0j!(uiQuC831<#|sJ- z7x@W@)}oy&H-O$-_P~C?!n&6vG3<8~%E>9@CX)6AR|4%y*=FK=b%!RL1kId?q4iG9 zNWaM&E!Jpm=;}fXw}R>eW6=5N%uz@2)0stv-W22Mo$m=p*XPyEP|9K5?%=ZeIYgU% zAyjr{O=@)r`*R8JrZ03<^wMG3<2|6L307ezq(c{y9N>lVxF@H@tCDOU)ilQxqe8>6 zpD%9kLMgsf#&HQojjUfpi9LFef_cR0a1uIee@{%=y-1-p8oI9?j}DJpXA48LJXEhC z?T3|Be;I5H{LNeJma0ndRL$H|+2{JmY~$}**SvO44u0P}{35vgI>}{x=WhC-T{R7@PFY+WU>!!V-=Rk%E17##O(jr{Y*9AxPvqO*0P$7GyATv+`4U$On)=W zZUGuKw&LY%5fm3AUJ~()swf$i1&_mM zG#PM~Uhs1>t5A<5WH*~NYt2Pk*e?Yd%~Ff;DEen8Snl}VdesSaNuXr%l-SQXy*N|p z<96yGQs!TbGzGSBU`ce%JOwVgFvh%~#~x?udvBMwD~3&CCPtq{MWx4JHY|U%0=q28 zL?i&|A7Ro;TWDml5SsgUtRRPj9z59mw(!VL;#)BVi2RU#qBe|Dwo-qz7Ay|4T*n== z9A~v2%x*eWu?8SgG3G!ODAm;nv7-}Nk`^?!7%|B}qmN>;C4d$XqY`Iz77T8>!H?(A z6v%(d1W43ajkn~n!B6(W1ZXr$iRJ|JXG-f@K~OE%Y8bhbRaSwzPd=g)I8}j^_<>ee zF5=V_LAJZv?ni)JH)iOD1hLvIg<+XEb1ov47oF2EGHQagOJILUNj+?W6o|Y&(_hL# zj_MT{Bx}onaC&Deotx!-#0s8;d0z!1g?r@2Z!US4K;?xuQ?VK*^Yx|(ID^)#9l7sK zs#_gQy5x2k)r|$IB)0y~SSLrhGPKZgm_ks8O50~P0+ur0^Mta6f*9o~hd@)2#ByY- z^9<+~H_$teh&v6g%4hdeQ8)+6^Q^|srUzp4XQ2GWB}pMG0aMi2(~ql<(03(PNyg$OMn&l>l1pk_B5h z6&dYNvB+j zunDeOtELbE%0#$jE8Wn`ZpF-?CxS=@!X|y$w+UZqlRX2#&{S(kMm4pi9B5R9?-j&;AgD>jHYug&m*7no&MsL;v z$6>ge*lyGSpY^t8E#j=!1}nx}uK+x{Jn_^SLlb1L{xh7Bqv1AJhl1*5Vlb~4yC1;X z03!*N3eID5dD^MqS=}_cE86SmFBk#Vq%YALH1s(`o^$%Z()8uf4Lbj#Y zqv}ai;=b()yRW(AV-ZHS3id93S1&X5{4_zYAkTmax8Eh zrz_5L#wY;$%m{#J7KhBQsRLg(n>RtZA$a#1g7&Pr3$xH9=JuZp2Zo!z@Z~vN1@NC* z0T4BQ;wgE&@Rhyzx#K8KniG3^;&McOhZ6=S+JTf%`Otb34V%QDfYyq*04zD?w8Ty4}PonFH5tLL1rEh5ck;TQ5 zP{+;`vP&Io=TtHd4e{;v;5#YJhP{>XfxR6F!z4sXts3ZEJZq~<(?hgmynEaDO!!>I z!M2H1WLrOmo{UdEa3ekZ%#+sMW3x?&`_!L|YS~@wYHNFky8T#lozS3s^=R z7^DmJoR(o}Ohx;C(Rg5%rgWltTj!bHqhLZUwZ?cbi2eIB?}v3VmcXc8raunt9@&14 zBHgv+R(I*D4YzifefADop=x10^zyp+eMUW0s3r0A{@U4Or>l)L+N`(bKls5k#L}Ch zN!ihX(s|!WGw4Xh{It2(Y{`E4Y4Mc@K0T{DTi=MUIhccaBE!a(g8B30vf*wk%+tR( z>s_2HNaLp)!Ox6U{o7dpPsdH$!+k2^5d-4ZcF;!$La`}#3m{K=bruRdiqjKsRrW{C zq3FtFJ~A%W6su4|y(mR!&=Ho+CS9#Xfn0su)IfVO#R&t3zZesF0CpY<;jFAw7|Ql2 zEbB)I$x>y*q!e!sDb{dtzeGtXpXlx(Njv6X&GI@BxU!JDK{#Cx8_5N$P-@|{vU0~l zAcy0Z>SL{sbH=H&t1-~zd^)Vc?#m)cPw2un3qrul@Z$ndLdqKjF!0^@eB)DL@}1Mh(Bw>4*Pd zT{%I}FTPtObUsMg2*xEXhSTZ_sUy(0voIYxNWqPXM=$3|6-5`kJohNbM9CA$wUp=%E+YoLh{5t*Z1gh zY3fa@1Szng*xOrkHmXF&_`oIvrC!j(j*BKTwF{T}XX=h7i>=YoN=*j$vvDz%G16xi z=RN)B$E@JflSID9hTz7RbIw-AEe6`yipH|N`O!`E?iaZAFm`17vS*gO_1lO$*2m~I zuvfDs%|Kb_uF=-BZg+`yK=-4E-1WUV+4()fD6=g6ocYHak|0;qTj$`ehiAH>+mj!) ziN=Rk<7=$9SFSg|=$$pmH;{Ms*ROx~S`7aLM*V+cUj)lQU14b=kXliWYfWz?PM1OL&EUfM1ZFKbwai|3holNx&g@4Qs z7&V`%gT0KQ9ly1ujkVQ3KhFY2{htn1om$93*TGQ0P~Y0%pKtLi{A>7w?T|3EGIlV* zp=DwCnf|Y{KUZ&QkE3qoXkqam{1913T?+MY8WgW1UL#7*9u7rkIUdq-6RCvTB4olV%4G_h>$t}(^v=$j2vaVD@;y!d$ zLJis=^n|`y9i(Jwf4dp*DzMb=D=IX8T>xtRQdw0^#iDsuQC(kITV-dV>SaOoo_Rp4 zX{xKOZECEouWw{jyN`6zIoE5xi0qkss;a<*BL5BnXLEa-j@p9t?)H;bh^SO+x8D{P zr?DDWZgGcEdVhfvP1uQA%SE zZ^g#mM?%2*4p5dGqbBE;mnDS>8;CPA{lQ-J2M!fcQ)#trY;4W0J}xerYdb%axLa?X zy+1j1yWMPk0z+d%LPm37W~XGl@#be{`F{4mT0$d6#CrsGe3vKWXY;gKFN48a9g8lJ z6R9#_g!9sSO3bB{>;Mf>VQps+pfT3g7<56xg@QPX&K+)NFSV#Qtaoz@+zP^`-A#1x zYf}hD6uCKtw=2Cn!Gf@SY22exi&nx_ydKchc{`(Z4?Z(>vIi{640ua7jN8K^-dYOr z+kT>31Vrw*g$U^H&j!`6s)uS5H9q6^b@+7cEa7lh?kxGZ_sS>_Z__o6M~iS9341Zm zfc<84uGUfp>$MF{?*F~`P!UJ()-5KyuG8~5T%C59Y_K zEe~~UNZ&Cb(|^cHGF)?)z+`$9E5%(g#}UXgo?n(4T~5Rx7j;%vSW|dY-C}bpexiqu z^FjRkQ4b2%{m`mu_ol$iX$|;KvP&8N%}ITTWTGjmzZCk?Wv};lb)=*-w#AcH*S`Bi zY=7c$@)Gck(+-%Jggzc@ZlG=$ZLz!|qCT=?$A*mO6e37~rfS%+&`~nXM@vXYp=N`e z4@25eJ0PePnDm}v+vtnFvSWu)*_RFhpm*N`mCf9(yG@X1LVIE7pHe1PjVb9pA#lQU zdCe`%A*#R~wa%3J;o>Quw-g{Lqq>H9RZ0%3`2LBncstQNrwIp$&)XD_TEz*K6_f{V}Ji z?vQC`+3ggkb!|p^S&&|$4g=k9@C~Ndy7Y4qWVcaU1VfHBbQZ>VP0=%snqY?gOl>t9^2Ma@d{bqGk2o-J>lp zB`#yKy1I;S%2N|b>ywtv(wc+Xlomkc$nXs`Bj9%fKLR-aKJgO5f}nBZ!%#h7JLnKZ zU3G#po4L2m(3(TrlO_P=_Io$cKG+%6a>YsEwDoC#v1r2%PP9E%<*I{a;>l#Ly4Cwt zL3@1m#(TkgIT&BvWT|xFOGk$SkkT^8UZE@BBGa)6VPDxP^g50SKhB99lGB+o&y8ff z5cfDk%oNJTQ-8J<;9;s`pQ^d9Q!~YV!9Sf@2N4sma+77HYiwn1%P@fO`N23N_rAZd3)Sb( z3`ejJBe48+YX1JYLWKonRug{IS8PM5t_>2+SFYrK8k4In-21j2R5UvGh6p*I1`;?8 zuT@}ic_Db@?Os)?&?n7vpga{yMvs(&K!(cVwqoGZnGwfT!TMo5k`NVtQ1H^lvicsB+A)946=b8zks$+< zCNsIxsU*;)FNF}R1DKN~OeJIqIGBV>_IL(I7|hm* zyQP`UBtbobvNvyS98QQZQb zg)K*^+anT#7liQ*NxZ#ZRxsEw4Bfzf#Zih`T9>m==7JkDqdMEfXWMCQ5wkSW6Cy2? zqtK3=*p$g#4!>xu{iAS_YUd0~xL=?r8wWzxV2o^gLNHFZ_KDmWC-HhFfoq)`Jkw2a z>)-qhX|qUs_wNFTp7Gy>nC($C*l-qzjEZjrRZD(07EYLANEZDy0RYH@NvO%wY0v=xw&}feK}AtjQH`(& zAq7btWld2>u_JMGw_E*#!=GWWzjF`tgNEb2?|`iT-ps^0Sq0+b%K|jt#Khdj>|FjL z{DqT?_j&r~>zuDGFv8Cb9TF1&9$Yr(j>-lc6!jGejE;;93~W!Cd*J#P7#7(VzfZ#8FKzaW>A<*Jh(hqQDXV0LKMl?GrZ2{; zWmTn>=9cE)YqP71oAh*SOkA|AjGXlyb!|;uwXc@u?>jdqF9#17AA5JeR0O|JPp6l! z_xkvE+5-LjBK)2Jkmo3)v4L)6WU%YDhmhrY>7DR$jz9#65u#remi&18OWULk_BbM3 zqm#^2uXcbNxN+Z)eSkijV?Kdav~4GUt&E6(9OCZ(#@UGprN#es&wckT4l9zYu~kBq zm8V{9j;r7(F4?FWDhM&5#~US#vD0vK2;ne5Vd?XrECnxN|s_5_Je>B0hx zNC(bUy|hhgz6ykEQle@(9EQ2HFG+OjhLkJA9H_ry|L;Gi=0wBoJG`!A<>Q0qK-QCc zeZO;`2lr9!&Ha*SV-&|u`uE^_UBnP?R|b%V(kf092R}dl(z4)8{MlOnjcwzrZVxq6 z6+OPgBTtKAl3lUD;Qc)2sKv+F=xDU514LZkhfd~EBZII3pr&*W5#(y#?>h*}Qlt0C z3}Qj|C!j$`pre{6eRY<_Six79tfz5%(3iUjzwv0-$PF8qZFZo;p5rke*ar;% z!XLDzI_0Ivu8jN!4*FI}rhlDXkQ?&@y1oF%s$g^MfKlROml*cEQRhkRMjIOvczw=} zLy;ddDK1_?(6;e8)KCl$GQF42;|dJR&6UKY!*l+~4VuVj!crxITXWpM5t6a7@i{0s z`*SJk^u`E~*gmmfb`krEeGwve^Tj{C)1Mc(yi7&7u6B|UD0yp}(k`7Ep1PU^pYRfk zQyX~AMuVAr0G;D;F?{_F;VSsdC;WP!anf|sSTNE(FY&p(D1k(YGaj5V9rz$z1qT-p z#fQX!Q1u>MM2~6PQ|FIx-$26tTc6T~qD?w=*Rcvwtflp@6EYRzpm>UcPt3xiokDym zqb7RNqqsbqneiohfjZ-Q@>V&`t_91@A1E5lfG$f&V~OrZXuxG}7q0t_;R@lPH*)S* z)zlBq|@UX{N2pH&xk(zm<%GB67oQ*4cZEL=PLJ5#J}g|;RSGF z(XNJ!DP0Xkr*N))ndEu8?1+WcqV|ZNHZ)k`CI_&!q0SDW7NSLS>suSERj!&$H5*2^ zjP21j*@Z%x6|s33kYD%Zo=is`KBPGCF24;t2<+)86=Ki5czRK~Ap7a3Wc6-QTvFj) z;iwz2l;%60ZyU7rw`mMqU)=YajGg5_HXldV@u(MiXLl@^9VameMEMT4;Td-OjC;*W zCpsISQlH%}{0$Nem&%-GkxXl#xU(!C%N4z96NSA2NQXA&Eb@MEVFtQf*-a3U>3xl> zwPM4t#!%tbH8OiT9KCdeL_QR_!W7b}f<3=Ci}?Cit!iXTpT8zP3BI5klrYa&268WY z!*hJuCU7`YBj3){;*$t1_zsd-nUcW`8MN+Hshs2I`OEi12ap$=7elmju$As*DFvl& zt?`i6-MdP-4#5hUoC7$B_i%(yX5GVZ!|q#HLT{Iboom~c5Z{9044z&P19tbsee+3N z&6y_zs^FiEv$lqlNv(GVv1x3fL_xcS(S!`0$T0TUiXw(QjMvIYqzZ9kQ_bRR7s~zh zagfN^e4y+KTcTvk_Byq@9`&wXH_9nqTl%YXMYKf!3b)S|F{Xi7 z$J!EC&9bUiEIT;7?bR)wtDDklVQ!&k3$=tQW4F4xY#Lf`-S^E^pLmUfj*s_)M1fu) zbY(Ck0BW$L6@`T*oxO8hrC-mrwn$mTQxbAmg|Ppbp{rVO-8xih#X_WbVAnexN}8#? z9=yMqhmlYHD@_-0O`|wv+zJ0sdF`q149;Aow{NF>IY;1g`Qo^=au#A5_t0KNQ-XFJ z3e^3EBLUJOkQuF5k{qOo;Y&Rk-`R^UY&5j`o8AkBu#UW@39ai#g{jJ-cKIj_B2Ob6 z%tfdu@0**UUs!S&H;Hz_Ez8!Z7@v0cLdZO5X=p4!vAm}kXoemexapj}BUZzrII=lE z{Q^uR2iVWdySMQ%I9F$bLR1bcZZ=S!G9A?98PY$259rxlXagFC6{i#wpS7r?-r z>Si_Nqr!MHLUJH-y}n&JF-gDMV{l5_2nK)~OoSOF$~Nlcniepdf+A4!hH?L5K4?A^ z9f*plDUm?eI{%SM6Q{4Y$?r}sof zBZE5tUq|YW^bsT1meChj#AaQeZB^;8BUq+me)#7t5=RuIx|ag$*E}1~e~Vkd8bmIv zRbp2zw)8Sc5+3xiOs7VYv&KE9EnhUy8+VbWtzczk*3f&FQ0thH%Sk9?ZknOM+>g`! zWzl|We#S#G8z+3F4vnn7eczp}!=BtN?EQ0A<)BNQ;EnQIi(8fD#SPu%s}45%LGU(D&E+^SP%27XiWT~oC~_x-oS7F<7^G!EGB?o>p^XKM zX5!1{o0_#59j_l0!66(XvtU#nc7YuT@fze|FWy zg|~q!r%x3I(AB@uF# z9kcoI;W$>f9?-zoLal0*d@LW^H>%W=yWJzdwRRuS1!0rXZ+Mex;rP54MBl+Bvf4cG z0YO37X&-+oQ&tXNa}Z5`kfNEnD%Ehsm{bdmsWb*S5Qn6%78z`?Ts;d8u z;Z2J0IbIw&rELsa(AA&tv>UT20)ee!b_uN$uW8al`IoeSRJnlE)5;^|AdRd_TT@x) zOVhFITq;I8%j#z4!dfSZrKYUZ3w2+OXd@XX+*9l2^w3yej>M4N`*kexdQGeBx<>sD;^vzT*rU}whV`nA1H zqGMbKCe)ByI4^pe!(4_G?9*|T!Pnf*{ln;E8SWA!$g~Z!tLd3(Go|>iDe$NbMuvs~ zFJ|J^$R!o|Ia(}Ok$M>{j1>vLQuj|i=D?0ijJv4S4g2Wk%SnT6?mSzgu6YksRrNh< z>)P;J1875M6ZG&U&91*>l!02;!{OBp6#nz?<_M;XZ)^9Fq(FK31+Gt`OK=$;7DkT- z!C4@ChWiQ)l3?b^6y^t(bi_6EMKET24%gXOJLfBwA3@6x=rD<(GA4%KZkvbYOnEtN_<6t97ISwLvT>&#w#^m| znlzc)qdOUI1;Zf3Nx@Zr;jB5TgBnU()XYAuALRBb4=GFom6xu^EoQax$-)X=((JPP ziDY|i5)Q(x!e^6;bjKf!6q2ek&gpl^vg2bsIj>x73&N=s|CA|de;aXdFGyXhzBk&k}8{+ z=P}ilKAuCB*dtDLxqc3G9k9u>ko)iN#14TwGI6b?BvrC#R>^E>li~@&y?oDsPY&5Q z%_Hwc;JIBD7uvG3Pq-hyGuq?`?6S=!xa!~#Y`!G){qlPos>t%TdTJc zb6@7nmR?r&r^;0a_2>BKe(fq2%rYB`o@o&c!uSSk#-z9G`4 z$BH>=D6bGVJO^Yr-6i(D35z$D060 zf1S|2iB%)XabrxrwoCdE(mL+M54h+2)-^5%75+AzZhY7?vk|GmmUx3`H-cxVo2t3S zE6Xs5Eof&dW(wVSm~p)k)rS`U1ADAcpB{sy;Iql4E^|p|erC{ANC zCfa-IkolJJ@at?fW#22YlA6LYV=SnlV3JOgz?hp7{S-@9jz~|UO!#8micH-5iYwB7 z=wONg0Q5s3bwOsSz5SCVWYc$+x5uk%=K7{`)xMSrG*f}O(Xu(5L>drcvN-_o=*MF0 zkOD)?*>ldpAC=UETl^Mm7fho8wGidNzWUSiHszQ)ZN%sxkfS9GDvt1#owQpJjfmJK zezJH5Gu2&YmHY7%Cf}8%wSDw^iyDGuI{t_e`*et-W_Y`NRVKsJ?J%wm=97%FnR)TT z*}0@(3%BKXl^4GoRw>aJwuiMi3l-QvV*@H?-Ol-?dcUBQ1)_(+OIQs64Lhk-?w$Y! zrjL%@@%@D2g@cX1dzc@z?HtHZ4r|%ALgp9|8f>KS1er=dOeK6A4t0e^VRYH1L|ETi zj!ar%MYKpis!tzu0eH`fIBgMH+wbyCz$!>g)2aUHHRqxt;_@RUWG+GH8;mtS2`kE{ zySZptB`#4@n)-`V8*TbS>Nol~b}y_1s| zTTNgyrzY2p@g!MU#-8pP?tvF`s*XGZz->dn8{%$5&L}$xO68DilH)tmJ2|xw+5oyb zEHQ#5UOf+1m}iNT;s=@HA;x#W=ge1sQW#YmQc9k~IhJ=+38Q}bUV5yl>{Y1Cjj8_P zfwd`>ZKf)~992B@61+^6=ceB%PH0)xhl2v{BGwCy(=xlZxRPkvhf{sh?R&r1s#wGnT@76V|)H?7isDECnnG5*Vl1m1@$;0Afu}dsk=lIe9 zGdS^>t#~~9^R4jH1oTM|on$D+q4OX@_spP0Ez;$w!n6@DqZ|(oac;3M!J3HsEs2Edn<}aL(0Ahq+OoUQbJdepe^}K6e!wx-n9nI$T_oq7bAtXx-#t>;wuUIO`BZ=gs(f;d`F?*I~!|t^*k#0h!3_6-=F%I~U0H@S|yDrIQu{z8aDTG(ZZF15uzc`SiCQ+7-2O_TD|OI zWJm{dgghvaQ^Mm0>uJNz8LhCKo2(bH5Q4*DD=wo2l5bts&?lQF=OfcE_2)9jU8%&K zPGjA<=c%y3E9LSAEV%Qiao1Gg^2ZA}aLQX7yq&x?I_{S$Q;8n$g#E+|fg#bSSzzAa zFWoAnPtkd^bFzx0=a~1It?3PDD4C67j#H~J(#ZNZ{O#zD#RqvM+_!Qn*ovMOr-jJP zj4I!q)8mJ9t_aLmoVLhsPMRO-( zhukZuNQukiptQBNwXzp0ge=Otu{s#E%dHfo=ic$A%GkVTD2i%V3%ztiPkx}oj@-VB z?OqFyQzqY?QPj_-c;>9-d@CQ`(CDHMbKv^20$4ATP}IMnFn{Hr$61rvL|3BN6{3&n z2;7rsO#GKkF;<%`)p0l;*7icCdz(S8ShdA)`sy>i$dMQGr1}n*_!-30n{IOS zo8FWu7z4#hWw9j3p*gJMiZrq~no|W)m80u~JhTc@#=bW0d8fb`p9t?kt zPo-@v7NkbLR~e)q3V|cSDw^?LTIdRIrjX0R{WiK$<*i-KaBnNNE2f z;VmNaRh%5XcbTM(x)I&PuPjtkXB=oT)%}{V1QM=kmS#C(b8atTqPBgBP5==OP5?r7 zM{az-nqgQ&VsAjYSxK;C7bU^bfD=Dnts|gjmc8}FD&8&MlaT4Sy+oz&%sG0c-xq-p zJl}Ie;Tkf>cJfAXHDkk#=}&vjhP?X*{duSxpe1I*;{v(cgK9lWJ1hz2J70OC_sQUd z3Q^rT`9Q7 zm2Tt@!2c>%tpkzSxfEuZzYVbS3*N?VbYpcj%gLJ@XHbD5>uun6_wK9-Mb`GIanxqC zBdu$L~S@Ebz z_t5qczCF&?P$T=HR8zy$@;PX8MyKad;8T~tt-HpFxeh~~F%oPuxFt1pRNYIm=?kKFF&{fFetVp(qn7MOmY9nQitnn)qbSZ&U)JJ8ej z}3KyXMEN>^#?OFkbR2El0<Wpqx!S!9aM?&xZ2a88 zpfVyU3LO>bi}vTD-nZAK`ht!!@5{Q7S=9CehGYSkYBTRN*C~R+XckYmb-&mI$UtB_ z<||h}vu*MM@HwlV~j)6cr;wc@^lk=1y?cDGIU3jK>+>-4Ohs zvU4!Ny1%l!%?`Y%g%Kmh3?Q|i^-QqLo}yRpeZ5Fq514LqI@NX3Ote{~c%ksT=HvdL z4PIb>f4xt`QMG2M&%&F9jQm7Y*(|ztX0~0*P-|1;widK(UKwv=o9?fQ;j~DpxDo^ zQKgmW6|~U^{f*ag`nQ-`Td+ny=F*le9YoW^(~}N zkih_nRL=(BL~eh~0iP>tH{i*$W`l!x7cCanQuqZeP@^-#c^CzX7(hne?iZ5_j|+CJ z<$x*%MgR8Ev!UL5(C4dk`L*oHZw6k?2WycWT_@vlw5aHlKI(k~xkU!JIbFVDaEL<3 zzvaoODZIgBzN3e~R=(U)`BL9#Vp2;dEIkhSd%K~$%io_#?c^P#1F*zkVWqzw4OzhI zrfkDn3@*DILZa-eSMXY^j3K*D7fnjAz|>fx+g#O4cu=MeqkB>2pYx@65QICe@~+}~ z5>b+EgbXQ?F}$Eb?SwxF_>QZxu>2U2#J7TTZam)nLn&=sqBgSpFtTkFc_BbDyI*8D zH{@vdB^pFRW&%aWiabEXs6ItyzeLFB)|M zGX^*F%U5DRsSMtuYJuV{m0ahpo+V%?+Z_8=n|ofT9D6`9TzFj*(&{v0dId1^Zh!Us zMTs?C(FXuk_L{5ceRO&vVU7v?USm$O|Nhx z>z#^u+2MN^a(jV5D>A zt7r-*d&@rh$mMZ)z0kFV2ZB;6t2D6k1P&PZOU!#6)G;G0gP4|7j^8VlIV>p%yck(4 z{r$DzCrsLqDL#~aDy$y`6w4O29EvJml;?4KY55i>m3mH+)a!I(XpQU6i*hc*;n1%| zqujx}QH^;}Qv2nt$Sv=C;nv^`U@oU@H1pR+J3y*&wn{GV>^9`?OE}W{4&Z_+ye$s$|lZDR9WTqNP?vkAa{^D74?iHG`XLQU&?|pWUAPKi* zxO!V4jIn_XwXS2NLxi39uB0Pg=3uJd9?hRJQcv8D-vrP|?9CCUzMf0k=T*-?kuRv09*$l@83u)gh1IUTN$_^`US~y!CAtuDdm2Xd*Qy1Oo-MwYiZoG;#hJ2B&v&J% z;FdTaUwque0(+WMd$c2@wXuJYibek74!6GXjh)u4hT=;5AH3aDlPFP?CE%)CHg4Ir zZQHhO+qP}nwr$(C?V8&Y^DrIJ5z`YfF)#TO@|?`Q*S8EFtHVDl{x}vLqkowk=zj;4 zhDYEqD0l@*IQ(%GKtQYM?sj#1wzRAuI(B_qw6fqk@hZ6_wLDrx&3SxQmLk+lOjQ1J zZ$84s{&MxQM0-iL9++V^2e4~$RXoY}T^jzaC1J!49Z#L1V2cB4Q~3HQP6v`V1PqRc zFbIeUXzkx#22pS^A;&S#$3;!)zyb)P5?JdAt95LQ_6D_!d}d4|RP0}&KY~yM|CKv>Q~w>Z-P*-PARIZ@TS=e9ZRVfY++TPJ zjY++&`LPVqwK^)HDrtw8AmDv(hSr1%eP|%O;d1}tdnm-yo94yqf2BubT7K;{IDmIW zk@~49^Y0^%&hry}y#UdxW0hP8he>uW?tpM?OCyEE!MB!qbr$Z+JP;Py4}E)`9Wy{f z-kOHpS2_u@u}k`aE^sAcLga(-cnMi{Eajzu1`1hKb|y+K(7h3R^J=jABW+%!mDbn% zqIQrY=w;5>os>})P!Sc8@hoWjvK~P$#eSdhCnk6JRS~I%Uj$oq5ur78o7)4y*~H{s ziRiEV-~vwYX)kAl{|4H0)0%3UWq5W)bS^2*hy9wy;_BrxxV1blSF~^0nz^W4J#$&- zVdidAI-rhFXUj)tT z_MjA`HA~6vOIPPMoSLbkPqF8JKe;xKOO}i+2#HU*s{%cFEbf!EKdX|KqVQ((! zW|zNWG4}ak52vNNJ#%}D{azbL^n<~hg8w#9J6qMPO07DBio7xlfSvs)KbGT#O2(aMiEOG^`CIsv0g==+&_m$QVxEU0f6P}*!Ppex`J$?;(jDlCWzF7F#mK% z(a8BAvG1NypQ;RyAP)F@WFP6xxPH6|?3mCxI@l_uJI*rfb13L)aYHhQx`{~K`>S~T zwT#wyT1?qC(L(+?_x^l;kRx2H#3&O6!_Bd6<+tR6Q8-7=m5=#fLZBF-uvK7 zF?-Oys$-w%<@f2NRbHy+cKs9(wU@9NI#$^fm}UR7H52F2J%;b}tf>TeBjfHzr|7oX zBMkA1H?m^n4Kl6hRopo4JW4+qc#zYZiNswHmBoZ0qUZ;$C%eG=2rCbg&2cUpg7WFB zZG(gs>84k-?HnT2gg4ea~awQRS!I?{BLB*wowF zn3ecjPyw0BC?+VnSJP+epx$S_`r<9zL}10BMK~YBrtBHs_{^7aGQX8np`+ozgWON` z+5}2@J>o|o5ZS=Y34UD!N~eO7&MV)FA6E0!7i-3;#r^1vf!sqT_Joq#vV*4Ayv8_C zWS<4)Ef`-FmF0n~mVgA?6pez68%w)>FJEqZn=e^;C*chft z+yMGty4PC^3Oo!dcgs+ z$2wgJ50B*BYZpyKRi&NYnHGyC`K;aM-h5h^GlaXzQKj{I`z@Y4d=7sJVHNoP^L`(( z4vs3}Y{3)RrE7}(zl+OVk)-7;+JVeNzMUS|wH3lXe_Py{kL^u)l%EP%5)Cc9mY17c zB_2h|@1f`-=7%yH9yK)D*Jn=fn5I7vN0(}tPXxmJH*sV}jLPUkg=MDNCRr}puqNdI zqm;u`?i%BeHBPXjWOV4uvPM63?bwKj)~GZY!uu+y&Z{6jDWdz8UGzRI#8J6jo~!S} zGd&jG7R3{TNnU$#b?a)+9imjD-0;>pWs8yRM#1L@%d<^^O7li1pYNntE}k5b*zs1u z48o$S_0dsfSGSaSM6c98ZyTN_t<6M zS&3-ggF>@o^&2+ii}-IS6nT;LtB6Ud`@Q8m6?AiyrX=s}RWvXc`|f2`U3$@0?9qEJP+EB7*6F%>fsvDv*S`DQGYC;s|< zcttnHaI(XW+!aGLR4EYvqs6@l*#7>0AAR)2tor<}bnMo|W&zh)5ty~j*Eo}tr9}Y= zxY~wp!5+z2;_x4U7{uxl!3JFXPE^r(epc;IRio~jr@ZZ!wG4j{N~7&NR=F3+x#{FX zpOakM1^TLoo+t%^fg9nW4S#UsUk50nklu_`0fRfC8Pi%GRasrZo%dEvIVBJRMT|{2 zP;NP-@hKRh<(VRBtGttt#cSD!aG0u(Pt7~s5}xiyigal9gN{3acbBe=ro})t1F!UT zsSM3F%2*j_F@ zKz+(lYpvSUgdP!?p!RDt4T^KW7nS~a1Df?ksPhNr*DbP5oO(Yee`FQ3)Ar5}>q^o| zSjlVkpAit0Q|n25qpeDwv%Ht^+w!tcZ}r;{b=dxAq{vH(Vrx5qOZnA0??vt6L?^8F zM&;KduqEpUXIxo!5Dq@b!}}hY%3`6msRP1qcw)9bi!Tamz7GM9NxWenb-+g2H6G2@ z=4-AL7*|EquTvR79Z>pDdC>`HRUBIi+<8(VZpHHj*`9S^=l4$QWp$!7lMAF%qRm9X zx*Bwl1*Pso7wbOcc42c)17hd+t z=jAU&)A#7U92d7Ajpb8CNJoXS0o3eO%rFY{wfNYd|_(asB_ zjTaY-7CEf2rSj)5w_mTDWihx~9cIaBW`d`Ys^CX+9t1T+WRiAi=sEl&DWvW736E;G z)LxUSgcg6Jri4l)NIBQft(ugZ=14N9sAx)Iix_-ptIP{2%uG z?w76}Q3@M9vtFA&KVXpvBO)S>ZkXuy+4CZK6C3y5C?1qZOQ^|KF@~m^ zFpio2;@OEFB`MpR7-ded`W}ck~oSA5r`&K3i~947=chvem> zDT}-jUiqeKo0()uE<{djs$8-Fg6a{2MORfPN7aoAw~I=9n>PGDp5vJ;tkg;yb7x*<%V5b4 zca)e#FOUnrlW9~|`Mr~_mhRcuU5-NHOTxOWcDG^;oU#`_+3`j1Q@jeGKR?8lAu)TOgo>11d!$%h%l>IBQ@KYyfE4KNaI?{d+&vh(LP% ztNOscAcFZ$D}|ZDT7xL~M+6Ul9B@n`rz97M!cK?{ZB8R$1pqr{ocJ3`(l1&0t8Ftq z3pj9fQaO@j&}Eb%i408uaAe2}>_wLdL`5@)!R|jgb_+3xbE+{K--5DsS>$ts4fr&= z<{OYFh%Y{`DVczuKYp5Q6e=Z&oejfZ?CDlQfD8ieSK$^??j;sHrm1+UKO*a>6J&d1 zJ_L>ETzK`HV@$@&>~kesF=HaPR6=0X+x68TBQD8omgV9!0c)rX0x3s2+MM5VY!K=&GFi)u@XCpGn0X4$nur0KEoIwPq85xzAkE^L%r4T8I?=D!2? z)DfXOCZ}w`Ph=Oiw|ICWDBvF?91I+AGgjJn7%JQD&FN~PA-;?pYg>&zsB->3)O*9d z_7SdC(+m>#3D5pV4?5u+;SdhS+c3R0;Z>x$4M0WOF^jF){=zpq| zo!Oe%W=C4pD1GLBuR@o%@?}+b>XA;`!>hDD@=T=!ioCWsZqzEJy~N03qg$iroxM-U zPS}rDiD0j$)6M6V**Yndl+V`Hx8&`u9>+?;;S?r3a*=vE-^r|U37rkiy;MG=%Sr21 zi@<|&MsJ&DkI!6tp|ai+OFSi0B#90b5KM8W2M_cofe1@M^VG^vciau1rm!seA`u5I z=1ao;<_MsoVBIu9(EjmDjmY!Rc4*)2wlc%>TJ-_T*dN{);6tpuscA~3laZ-B zkERmT-1Ng=_N4iaJM(gcX(NzG#g}=BoXvVwPy82y)ls2NA4U@O6SX5Gc0S5NH1Jb@jxNP*Lp zM5}?tcoGfAcsqS`az)1?f|e$$l4lnLVr5m}!Tg^adDS+cjzgf6 z?P#m3e{D|7Iza_%1z3}lu)ubE3`UctmwwdMe@PoE+l}HXXA_{vH&^wx`hzUaTc%hv<6=gFbYb=@{8pimoXtXQ>(ZZ7P zZ|c99utvj zJ5!k%b-8wTB&knCGPikCE~So2{7o$o6$7!A8woEaV5+Hzs1K8jdfeh|JOv5*U z3b3K|bHt%%%`C)tBNs5dhc1a4tif;_Hkh)lxcx!a7Bq;1wJ5>iR3|PVHDEG37|kCD zNgpbK-I;9__|!H(1xc=_`S%~LkcK9Hicj{n zR?JYhlh^5lY;USd%w8^2m?LQ6ug*WjYbrevW^yo#!FJ9MMcdHbD;kM>I3{Sm~i~&ILAC9mDb`d_&UTn;bE)0`d4Wm^?mH| z^fB5?oId>r&Rz?f9J}a{XVMHUXxlZ+AE=<)^E)r*>{sbW_W0kUS6%%X)PEkE)- zJw3#Jh=4UEU{qne9XX{mjEP7zHN_DDDQHa()t8!BMQ&^8%%n z^DLDdneYDYS=`s0U2h-S)6aMASx1^K=vsd~J#!lwx?CIaIy^OQLvv%s)s>NrjS=@2 zAbXnS;!Q{6RD7ub%TxHkPp5d9OX1uHOCSB7ATN0W~?8jUU@GxW^AScntR z2cn}@9`4Ro3zy^MwndOZ1+0v_9-NoiSJdyCt=6<;NT{hvDc97yuRg-bO&ThSl(m(- zU+?iDg`+XKZ0;vkj+5;xkEk0R9m=Ua^13|^%8QPbub-Q)A3kTe7&!AWJHC0Ci-VPY zUIjQPXeII$L%z06RC!HtMMFc`T=apDOtHmWEb*f{d@yC&q@68acQp&m3rFlplvyme zJBmF)$tsZG+Tp{)Y6Hdcw>TN612zhah8zPi5IzLcT^2G7)sEff-Zw;scUDjZ#C&%7 zeC3t0tHjS_PbTnBETm`!=b&&L2mz5!;9J@FXXS!Sm5mnjTt-p!P=7x6c+-yIt)y?_ zzc{wd?+z8^;ep9uK3(|mQVL#<4T|70)eQon@8cOmLkUKt@z7+73Y!SDrMQp-fFRBw zS%9gzz`=D}>Y7p#-Rn#K$b$S}`V;rI;?U9Mj1?OE6@Nv@NWEj5yGX3gOn1%Y{LkN-qZdU*h~k5Zl-F{jT}BgZPv;s#uo_FPU+<8CEC0A0kY6ugz3$7u+b+N(+kr#-GkR?^UJ zY#sx{TSpbQQ}h>}%!|&c1A`S^xmz^Y1`2p)UjckYAWvG!HfGX@=J;ee`Js*JNA$cf zLT=juTx??w^M!F@f`&qTTVKh3~ z;^VKve(WpM5jnD`1y+q+stL-itcs~w9ixZacQxvl%Nfh>KW}a9%))ZwR^EYyf6O98P>?XRE+y0-;fa z=PriwALDlW3rR>8llHHI#q*6+3L_gy5Vf2oe>Bt+=fK(zciY}p2bW;NnMMo+T5NB8 zcd%!y`TM4hma;xy7mZ+G7_!j3x|T8d)EZ^{LAP-HC>y-d*+EziVKY4llSKYF-_tAC z4Ro}7sCazaqbM;)S=*SW8IyAgwT$6FxRLv+ebc&dnZQqH_A`^xdUJ#_&v+WILR?_~ zl@Mwp@T&kABVW;}^OsSX;jP*I8Nj%A8byVVwvHrh<8)^ z!`v|S>)!)Bm!fUfar5XQ@m3baVy~gPGf>Ae6H9NEqMqt&{m<}+q?7#%w&)8%n;qfM ze5hn8olk~-gepmy%A-^T6h?!h``UJ}xBg^1xK4FQhC6`{x-P3zRfY+u36ASR9< z-VoQ%ZsdS1pI5|^>{z^B&Z+1z&6(x`@WtTs^;(P7NfEN&3F+r+4P9xtM`%air&m5H zWP4x&nTyseAKjgC?FuII6Rh{eZnx4Tw^Ag`=H#!(d_Pqm&{6`JmH+CX{@-ou|CVp{ z-#DoMlVkC}tginbjs-mv9s7Siw>?ailr|e~EF8@E^7!M(w!xYB8;(HZtBA(&*a_KB zL5JoNkb#99X4nbw1QH$P8iWAH@en`jU%g+qx?kCCw_I;APkVSxW8{53RbSzsCl04gXtIyf*oGBVJS8`F&& zZZGaoVe2HZzi^3e(9}NoE_BEQp6^z*Nzpv!svmf2TL2=w%ywaJ$Dn&~WCjow39*Ni zfP&f!-lKHVPTehB+qqoTmVvcUe>`uNv%`6}X#_IFQ*isBdg+nz{_58w&_wBu&V z&&z-#&utYlxMJcLgh2QhZvRd-~fry4*8&z(zp%O-KO6yW84lqh|6Y>edK8ONNYxmLd zSsCB0>)#RMpW21brJ9m<4N?9HkcO~&BYm+zG=B+2+e7~>ldUct$;^GF>$B5>npELL ze~oorGSs4C$S3|cUVUdPFaMhq>w~t<;N@!cS~nm4vF%rWuswXob{f}`CAO85fDJGG`E zzx{3D-P|+oGt*4xNj_SerVGF1dJCMNe`m{U*uPJb43sK(h{5};i8&(&0Qr0)s$BO; zPej-6PD=K7JR$wjRx-V6C%5#t^zTvvn?_OKU%jA(V}a# zSzB+GxA~dm{SauAyKWX*mt?O~Sl}_o?+pJ+J<5x->^g$|riKc3qMUgz#;qew3fCeI z#kO*B#!x**&SFO*-bn&k+mag^V{+kfAg&4n3dWcyHK&%x8iuv(+YE3fd|I!^yc|ty z*(|XIv-lmTM#tTgdGjvS5guamk%54MhTU)!KkK>=ZP@Tl>@m8BbBe(5No3&0(H!9e zL@Dj89y|*Oif@++Sf``mn#=u2^l;)W!dgN`P8mCt+Z$t|5TC4X*g_ z^Q^Aky!EZmQ!vwmo?jtCXbTLTCkf9)P11a?{O5er|t%Kh4<4@dQrF*G2&BV7!<<~W|Ie0<6;u;glt)r7I zL)~n$_w&~W-gB*tS(O(d$-S!*`Iwwqxa|fm91$%hle=SGSkQ!d>Y^{9G3eJpw@zC| zN{es5_PB_nXt6~yG^Ph_lL$}TqU{wQ(NlwbbFv5RU#^Q2pB$_4#0>jXQI%sDhWn~n zn0xbcZHIy{Eg0@4`}Sz>)=E~rW<5%}g@0}jXbLgcngkQZ$Ye{pHDQu$6f+l!rE)Lg z99@}nDJ?6A14q6ST1RW+yXjHh7qSZ5J=2@~U)os>*d$T#r&D25!#r?^^E9UsA~m@S z`${a_Z~wrXwAu#t2!k+jCmR^c#1K(Dq$ekCWjvz~h)f@E#|xtBbg?agURF~xB$R(+ zum{xG?S9Xz^F8*%>FIKti-3>*(5cPFBSA+LUbpR7sBvs3IM1;{lPgo?aa^Q{R(a(L z5Y}F{A`G1PlHJ^nN`)^BN~{|h35$8sSZ#kFGP~IQ;fZp&`HIm%2?a@#nXqddm1;?Y zJL2%h5T@i&cO6Bs3a1evTPdiX3n&)xUdp40mW7*{hfyW9F|JBD6>b(hJr(A%5wwtu zF`)>Lo5NyUw2Hnk>~jHhy=!2K+RN&9hrz+rE6dR@;W+dNQu9lxR>;OY;4ek#~ufVNb5?txY$vn*yMx027 zb<;&LWO*>k&a|m~2j$`q!ecEaw9&w)6yc#)Joj( z<*Kl5md5_X4{U8U<>Ohv+qpK*ST<9%fY$OsEeGfHNfqa#LmEsvemIb*h*YQLeRDjh z>58cxAAxy&{T4Nu=pHlRI#xD~z^Y>!RDi11{Zp9i?j*JYj!>Z8`12m%%>-=}Il ztqzCwbw)PG{u`Cy+;x;m8>~O>*b{Uk9J_s%OS`fcF@x08Dx_ja0mz+U!&KLHur71k zu0n(*z0O(DL_bv$PMFmbuWe672L& z4Hx>2*DTFu*!mRqxDsCy{)I;<(3o|xn9|F`aiM+dT$YWxZJBdu*oEfh)fTN#;iD-l zzQ!f|o)kG#wS6|ytWSW+JvqK0Yq0|};o0G(8ss_`8c5EZ1CXXbh7Fjr z{zK7&2;>QOl6_MhfKreU!>JBNae6eKXb^GdWF*+wjgMD?ezY%MF2w(5wd0J6$cm~X zz3@gwM!K3cAdTH&EW$e9S*?+lmUA(QS;s(om7deCIWh_z$PG9hO-*KU*-Ih+HX(K) z-S-Nn0`2v&vuXI@_VOn_f3`xlk{3`2aZwe3Mq&AQB&3m>4)u5e!2=-Dq#iP5>N3q5PK^!U_yIojac zyUT1}!8G_I554FjD{Fg%0Kw+q)?EN0=5C%Jy%!l1Sir=b!Ea3HBn%(Z(U0W8hQxA5 zLd$p)Whh`n8Sh7uv6emPzXdLY$KF7Tz8)qTp+ngLv>sFYV!VxxWk;C$I)+<@09`LM zfQ$yat^mLpGN;Utdj0*XHJ$=!V7doFGl!JjI2hpo)q!jxzoJ;f6x1fd8=f)~It4cZ zEJoGw=J^7sK?Oz=uy#+apt;GFAG0>Qcv0{%A@A6`ZPG`ta6qSrxf%FqgHJk7qZA>? z^iQKNqR+8V*}E?sM*z7|{1%<+1T0+Q&G0s#ax-(G@E@RVd$vv%AihB5S-r*}AAB}r zO@Vtc9g`eLBD-ea;H-kjZP~@}MXw8b!K+0fvE*y6A*?5qCc-jIn#SK9F$g7H`jpBJ zvRzE7cDju=80`_L$4!H&hC^}T-;0ts(KtA3F-DQeaW;okD^*X$RKAep%mbXJKw?5= zm30{#oT5WZGd9G|V6nvsI0@sEB17b7kN{?NE3a!iq^UbwY3W*q43?7gu=Y=$=+37cqA=$0n;wMOzt@5`-8)k_(wN-g*k> z&-GseTiQL}C)D?fMdmo{yoS$yOe`n_9J7W9(*yN^ zNp9_TG^NZG{xDlW!Ff7eQa9G&q&Y~5If~`i6pa5C_ZM!LY|`diPMQ8_ye6odWF9Cs zKR1f2sZ1S_-dlIRb#Et1TU+utHhDw|@eE!PdS+%gCGpy+vjZQVoL&ViT>!pX)wRw| zc=reC2Kkn?F?U^`8fF?kCfxkoXou38hXTG3luRa&Uxgq)qu>)XrqJ1`*U24v!05g9 z%vPP_xbx)*_BpJf=^#4Cz~~ZK_8N0)eqjr849-(D*wu9GQ0MFPOK4;i#N~+2aPbm&h3^m9*Ccpr^jOkcDr=XITB&(_Q4P z9bn#FQ-h)zXwNVLh`?N;le*y`?Ysb|7Fchxk~Hp^D+NQ2qLYj$jw`Tq#sQ|@rSz}P z#k1hcv|500*z|^SY>a8;#W7g=zbo&agaMeE3Dpa-e zv74N(1P@#+j-~ZU*7LLcsEGmmy3tu!!gBf1uDI`9$MKfv4FQ~3^D(`7oSqYY5>E2G zTf&6C(;jzI#ZZL@N=nNr!#?I#;mmB4nMdP8ck^*(d8{LN-z$B2bgx*?X3v9e(tT0K z0+PdkVdJzTmb!E^7932A4UC@QN|V3>ih7N{_+kjbuI6x@a8|ha7fjmE@-HCTW{t}6 z5|gG}IP94JSYCX|GR%Tv0fUH4T{5F!%jYn=mjGg| z%-QdqsFHLmYwe3%Fo9}iqu)vdCz2wSWbI0r7|=4^KDu}7(0g*bo9Pw|WFtB);foc# z$(sKjn3p*anPC%y#;?;dOkP};K;)TArg-Zapp%SM zhYR{mkNqv*)KgqD!!c=YUt)DzFpEqy8;%jRv-WL8MeU%u(KU+v$Fqh&IPZPHzxGnI z3wY5cjyy2WGa;B~X>cK!OoYmVj`M+eM@vWziF75v;rgs$TcZLvDvm|{$hhj|8=NZ( z4n}12Y!q}+<-3C;d)Gj9sdviOLb<7Ww9c@)BRA_fMIJR~itH%=v4iC>Dk>v~7uHnp zA)4znRke^B#`-Ofz35kjR7OkI?vmO1byG$)e60fWs6q!_lxcGn1dy}ky>yzm6Kjbe zmgW6zQU@~Q0ofw{F$A}VQi%FvJeH?q6z0xo)JS>2N?qZ@Ang2*37%RW7lV}dOA#Nf zh+0Th-{kmWxt~FH%mXGW`A_N{d!z1mePn8iG08DdY0SCNI2Y%?Uq=b7z0WXVr1V0b z_5C9t%thxD*MDa++@G-}dX4AlV-Fp7+ddFfl6?GqJe0bs3l`WkA_^+=&nRR!)B+W4X}!6%vb*UgC6q8#Z=(41$Sv93Ko@EjVcv##N5Yrvl+ zMa^SRy)U}p5;OLa0-4^aX4|uCIA!&Mu8ZJk_vMhPACUGH#;F zB#mXM&^-qeqLU;k}>hOd-8pO zJfjgrR29vs-naP?k;>9e-zJA%U~U{#G1buVG>)UjhaI5RSDx*Kb=MEdUK(77cngN4 zBg{^R?r=A6^wkL5GEI{l*c?oG#vXtirAylgsgz0A95wnQWq*cuSH6N=|&HkQ5G z73_9>F!Zf#_MN{J(pIeo+Hj%aO+6{hX9mlzFhs8XXtRF{q@}O7Tw*HuGLmXAy=YTP z6y3x(c`nznR%~TXIZM}w$7nbN(ylAgeDz`PI^!a4&ac56e52yyECchJyvy4AUP62rmA#wxG#c zqu{>{I1+zmQ+q~R)b?VzM?cK{(kqLhJx#rhNiLO`3$LO?bNUM+MU9uo1?75UUlW)v z6j0j6(vf%+!GZc4$HUmy}AidqocvdtJwS%sY zIy`C;X6VMjuITOy!~RD&S6d|^P07$&1gCHNwoH(c6AeW(kUELnBq!2 z6)nj00+(Hj`C7cXixb?-tFs`c+&$hz6c4@>)O zkb_ifmLq^XhI~xA1Ob_#56t1}Pk{}u23}J(*WMgAs@zpF>7My6R9C|;8PW*Ad^nok zihFek@}8^v5>|n#5U~ME;6+9D9>b!Pqa77=SxF#Zy`jvFbOJIxP0e89HzNX)Y%a7i z?Z#XL5~o;$low&U6m##dIMn3UYp5kf|H}w8@DSH9$jh&m@(d6$#qF|haHHz3U?A?` zYEMjs!>en{&Lodn6;9cHarhc;EM(;MI4zF^6^`%}^D{|~&$W6#V!t>bR9g)3=ye5# zkM>ivuyaW_0wCr7+TLh^F=u_+B}wFJZsg9Ttwwu&nzQ^xgc5Ro?1SUq=}4wCUy|ph zomYG<^&&XVgR?F`Zo30XUaygllcnCEJG~q6I8U&(Co~{6P;(H?v)cp?igpL0hxT$D zks_a~FbVll_N>fw`G7V!0q@<-LlC)0BN}Q9mcdUp2(6 z^y&-Ec%StBszbDwIEt-|5_(sMv;CiO_=bh<`QeZ%$q*Tv&Q`*-w<7%*L5`-%u@>hO zZ|TmF*4Bo0eYb_UxKoox7UVEvE~Gj6>^YC zmYGNi-mjcAD5r%5wT#>b5uuh)Q6?ViB`|&TEI@#pb(xhR^D5PMcUc9>UPjn$byPF1 zK-A)(Fc6Z_th);3*6uZ`7jGET=T{pNlnjr@QD^3bMlQD}v;L@&lCR@0-S>r=s5}52 z=DFWFN@@15q~zjC3SkV@)uDLXvPh|nc3hD!pp_nb=qFSq?9NdV7f{<}0&pBxoS`j@ z&f;O>9$ac!Pw?KzimLYFK}@xG?pzfDrP(L|Uas-rY;pTKEQWlj1ZO(%75qD+Je5~b zf9XbFEx83gnFCJ(JSt>Cd;dOcQm*2sp>D2;BAgvj@(U7A8U@Qu*KhnKcV(@8tNiQX zp;)cjo}F~i@Pz#5cqPk9eaVcaD1q$d&CU_k!zD${_NX#>l8h>C(Xd5ZL@7acro(pJ zf1BbR=UB$gTBG2+A$5Zbly3WRo3F#Z!X}1omuD=xc)k!1slyBTKi8Fke#kwzQQ&`d9{Sflsrc~oW}%i zAZgr+Lz5P0bOUd7Qn#a6>%t^taKL6a0gXEX>t53`><6VwRX(H+qAf7jN};BV7lNzu z_mVA?P6fl*@fnEJ9d%^yY$(3>n#6b%+96|>($PWE(BJLYU?uUOaOql{huwDwm*cm5 z;I`IhvA75cGgrX|@2LTdg4Lu2>O-&%ZEOeWC>cyb*orBY0qQFL@OLSkC+94)Ld+Uj zwQ1;{CMeT($BpdW`FWW+z06jEGr?GPNpEq|nC4ac(B5iP`pEgpEx1%J$8*l?w*rbw z96?rM^qO~#VwNZRDX43V{5jL}u{Za2ukJi+F_BdE1O7G^6wW_5`j8}wpokP)#KkGF z%@+o3|2S$}Uqr&gVmE)s!BCkkCx<_OJaSv>@0@E-Ri5#C$~i{`iGr{(?O;r~R@x;& z6$xLs?RAtj2+#is(WjWfhd@`m$KR_LYm5EFQWL7&%V5e{g}9@7@*Q<{1U=xWR7FY? z6ZtOTK}WKH17*|NJ?i-`B_eWgHIZLbWK3qFSJC@z94+pyz$z^48g`Glb7rSwolTf?c*EA#sTUkSz?$9SS zSJbmmjd^SMaK)vuo+F$Kds;_%R((1JdLT%7NPP;{Ey;ee2X<9+?s2Gb6eO4%i8tO* zOBoxp!M2Uw)+KZBDxok~hhRd-LUcPMy>)U~K7?vwa83!B!~s_Aw@Ke}=>VE9QY(9a zp2S@kXb-|HC3wFBC`xF|!`<5Au0jC6GYuW%q2|`b}P4?t&i%YIjic5QF_~a_Z^YBxAzR9f9 z#Snt(E%X6ALjk=^#8*#dhW+hWL@d7a*m~ExE8LImLxn{-s30Kd^jH)KZG@zI+y->e zBEUl5NjV!;gig(Rq0xS1VDi2{U>MC#!PIdB_D+Y9IMP|NZuPd6e5KmJD*dagUV;s) zJFe4*OkF)4x!t+NEW;eAT{HDBGb`QZ_AbZwfXiE{1ZmyvkW?9yO-%M1lh>TdxAoQ9%#oxeVMvIh&MdB})<-v$8^h%{tuSYb=|6 zop=T5=;va%(wWGdA7E6Yiw&dPd`gf>YZP736U~ozP$2f9^8Cve_{!>HJ~>E5*uNV2NRc7C5&+dy z+$g@~F%=G&qo(J#FT=MK?|I}y&rZYQCkSNT4BPp@Z|Dc0gasM)LyyHJ6bR^ISS&a$ zsxRfBR0W?0bUIH2oev}aIhp~fyGYM>(Tog5wf?Wz7>&ug)=NK+NhJddc&>nDUDss< zKt!=rW3+7^l_vyEFXH)vC*hjb9u`TaJs&?2ml`tgg(kHS^}6y2-Ig_rk!beAg6RyN z6!3sSg-vWYpPpZCUL!SkEjiS-|M-3wWwY@9E_^b40>=Pt_w+keJ5dN5F`pk-2h9lS zE$Ab%_s52Yi%sg0(MljCvB5k#KYIUgXN78cuM@C&yTN&xnw$5MV6~4=HcOv|(}8f| zn3-%`&QJOyc=w3nZh!Ha{D;$^z?agFWxC#YW};f`uCSX8i~PH9s15KmVX+PWHd`m} zi=tK9=pHX`)i|u1(1mSz2JZWZOcWnfDt+z0bq5 z5@%4(7Zf?Cbw4kY+5V+htX+wDv?kVcDx33$gZ3K~YCMa40vWT11a{rcUEoceQs?Gu zeLC@-?4^f~e!MsEf_On?x=iZ&ibiVkx}KQhYz~dGkm}&4? zwzRRI;^uePRygAD->nuVl3&NJB17fnuGxl0(`({1@V`3EC?Jo2L~KEYIjl*mFSD{F zoNgSLRs0P-{s(h!6&}ZuWsO=ETg*%rGcz+YGcz+Y*+PpgCX1PwStUk`nVDI-b=-aW zPT&4#zIpf`?n5O+W>!XIMy}YgW9?X;9X(kbQGrhy@bGXp4HR&g{GGRBOr606a{n&5Fb%jhGynbKhk<#^KGfWg5$QC5~AuF{NBQcC7BJq zXQ+$))fdbrvP37YB=b;U|71>(o>65Sz|`=K3Z4$!Sg(2awcAyK4DzRk$dB-6(PCqJ zWahW!vc69RR2W-U$6lD9@buh|%xZgM_8u1bjP(c&Yja`Xa?}GZNX>`^{aP3_OO17f ziOAlBRkBwvilSYr%Wuay*l2D2c+6nby2_4Y!+Q97V7^IrO+c*dSJCu}DsY-5P6@GI z{?^_(Bysmz==M{V?z(n94ToZvMD){Le>3=MkQ^IJx%r^#SllK2xKZE{+5Ni8b<+Nv z2w7IHE@iB`E?PUYCLkermR1SJ)A?K+34)(faOJexJodHD>aGsO#4d?(WfNDTu0R@{ z>oA8+{HRyI*IO}?{qYH$Wj;gld5=?n@CeRwVASZNHEHY6ehcr=YDj_q!zfxcMTK`4 z;H9CkU9A1Raj#fj!iE(i9*2yNw%S3>Az)qYW^mX|j%WweT*)p`U2e^j zh2)Prb7B3#gd^S9fk}*L7?bexB?`t()~7{inNaZdO?bp9Wado$hiEzdZyQgcD>a@f z>8Px3m${_ywvKc@UX-C@X&? z89TdYZ83hl#>>bd1nJz^Z)qspFw;*q(q7qkxjc`9)p_@gG6se1y|AVNyd_F06cw)# z_mR+cvgQjWsoarRAfCK7dOjA1r3s%qxa^4A3-)TwUUNWkv);Tgs8?{lgbof0=jIO_ zKf1hxsY|J2sf&}D`@o+RGZ*qFIsfQtV|!fNoxEGtyVbuqSJ^dKl*bg1=uULhind;_u^izOXULikhTF zU$JQ(kB`Q7cYhDerj(tX*-h|-9t*>MRw0Q5GqS#2QHi?A>JNvWU&k7873=8FtLB<1 z)TK&pa0o+W>RTkg4LGtP8BHCc9by>;S`i7QGe^J1lymP6phNfBvO1JxoL^{CZf7pA z+lMba&A(-Ly(o>i>kx&^O~}d8QDQ~Ggr?rh!>loOuUUgl)=QAboc!95*NLo8%w(uF zc~((*-a5khzCJS}J@ES=kJmQXBck47XZ97t{}K-oU1&{uFe~$>ADz%X>9nkIQ@Xpq#3*wiIO zI~x=e>1iT}{rJhBZkulq8NXw4q;{GtB}4vgg^1(%{MJDxs4SAqv@{JA3%+{NVWDksRP4Adup=DQucQ`N&s z4s5{aEh0Pp+v9JWej`iC!nE)zy0f#aVkF`N-ypw&*6V0|Xyq9ll2e2d=onU(!CvtbnS4V@6#C&rQf7NIqC{2ovF2#!1Xmh)rw3z55QLu>2yp62 zcq1v@yhQOoN&+}-hxXe+K{f1)!?4&%${(N)G%_|W@({jLOLlY-kFf7@ksoBt{zh{m z*2~2BBw(IaM7H9JqmHPcl>9cXP2X{19ipzeb(G}D*Ops34I*O(A$~T;0{d2}UEKY_ zF-Q=RW^cmpXY?y*=b0=@O$qH$PR*f)RKNL>ls)(qZjy->r7AwKTgEtwmcmYL0_1cU z4dVu@lY&sdKA}@D|A_)>4W-C_ukQ7-4}(3gdbn|Kj+60Z+moBr-@Me!q*08s4)^wc z8!muZ<<$Ir`EvHof!SX^$b}@d66u};ePgcVgd+a(k+;TF$qux=T?fPwf&8lp25l~i z;HbdZ(XS)1V|<)Ea2!V+w44|o&tg^4*DoRm2gB{hDP9SJ6*(b@dcQl`hwNaE{`xoMF`^x+;|BJn;$LK2O!y7!=iP~GGbgi$kIn_ubTm? zIy3r8J6ht#8FSw1zlx+!8J8lFh1k(2pH$wevMvV#(DewwUIkQ0GJlwEA1x0#d+BB@ z`BaB`7x~apy z=(vt7>9RC+ngxz*R5_Xk2MQo}Ex_2B_ik=ke{LEoc5^+*mnTy?PHPEE@oDoG`_|ms zSvkNLYw*daPo7L1wFl#Iv0=IF#Qax+sX>4}JRg;M?qY5f57asa>^n=#!#VN+*PP(u ztJx73f3>kc!n-Mhykn+eRSK=tFI^s^OE$ev?JMB^;WK%;-NLaH(jYX3*GrGxrvW=*$_Q9|-~MS>G#R zuIQh#QOL#?KfqZ6f}{Qq{A)Ib{}L#rWa@11>SS!{{71%D)Wbzw*##&A{AW*`nGmRU z{GUq4EQIX;5-*Cs0b60jMu5 zYv|%+2~1}MrZW)!Sprl4sZ0D{Wr_bKMa&G8Wd3KqoL!tu4Q;=8WT?umeGwvp?c7j4 z)tthiEr}_rbly_ENY%btTdP%+$O>nu`#p! z8!bIlb;W9x0nv9+{jdeG;uqFh4p{rr8jroE#fCHv1qtcVhp=mE&5$?D;O}_z37rY7 zCtb}Q#T75!DQ(~jT;SKAZ>#0fOaKw^9-DZ~=_#_wSS0A0d!RqASgAi*Veas0FCJ$; zOz|JpKBU821s4F-d}-avgBxsuN+&?NJ+I~#Yjw^r(nqv znd_%!xZCJhh?uAS-)R)iq zrud?~<7vj;VuBcN(v+uDhss4Ekeo}yd-5umD2&wN%%@P2=+|?&(#76eYZ(!FvgFJlfN!IuKbCpGqx0fCONX9kO8~Ye2Ke)>P zFdwAh@9S0j6L}NDedAf`as<^ILop8cd580S?js`v@IeQU=+Qc0w$Soo%vN=ro9enK zUT3-P*i4y7)aJq15z?u7pqxbfd7ypc)a;m*ebsNyf0AnMU77hJR<~wWJ`~qD^AN+! zmFCLXx1GVc*i)WK!9rHOr}NcX@iu3E(`|KR=WT-{Nb(iO-FQpa4xt)a2KttI=!%-( zt-TfA_>I7@rS$PXEA}5H^?#4kR4_C*1;T)-iKXHH7a%xTnCLh-fN=1?2daNYeg1(k z4K`+=uIXRGsX$#*4K^0w&Ob%kHP~1Qng2lHe=FqvAKLA#|3IDpLAxDzyZ<)`^?#pb zF?*mE`=3wx{}0&um;U^phw@*rb>&Mh1FY|)`mUx%O5qV5VbJJmozf*}dtgrW(}zLr z0;D8@{!0Jj`CH!Cf~l zb>jS23%&80Ec4rA{51`p%eoE@t{#}*>8@#-I5*`d&ArZ<9q4Anu9Uo*Z3REj-f*Ay z&DC>duZ(oMG9QLme8HowF?Ue1E&>-6id+)!{B`}FVvDM}e!K?FUAtq&Qx+l>OcgeHCO}! zgET79yN}$Qadd@NK*Sm+jh@8x9f_At{+w6>HyA8)7@F%VRi6e#=4ULylb=&LNtzAF zUNCCl<7Q@QtP&rH-Bt4bKF^?{8Nvn@ z0pTA;oU9;nudG`@`HD=wU>JsDI3Jxwc-X5NUyR8{Cbx%e9_u3g2H+2V9ay$vveCFgF8`j}(I^098r9l}(ONr655fg8 z`YG+m%zH>yJ1^%(HB#lKKy7i}Cb(itC{Xi!p@A5j!PV$}kBTXG4wz1z1wI2nlz~rP zpn;w08KeH^Y%F=!=6)u{1ZkQCLjK&5ei&k=C*$%QB26;ySputr=Oo|baEP=xLE%)K z%5F__zuC+7-ZqY^{DRl#+r_5P2wYhBi^h1Z0S|{uBZZX%kKEcS+_3DXhG@60S8CM* zH!a=!n}romSH6p18BOml>(977dr$4p&QOVRLPqxpKf%;tDutRAc~$BdE)XO7r%b;j zC_^RC;BvyO-kbgg;~9KjK(wd$UO$E{<%$rDnPMzaFZGRg>jqb-gelxTt`cqQbleGK zD58p}CPhe^DMX&1Gf@;iP>H?r!ihTUT=;YI$Mu#HlkG2IaWEbMDSc;YU7l9rE-B zy`1p!E|!&$6LlLkA ziJe%9u|IdF%R;W0XRMO1>x`tVJC2=&V(SW?mI`}kUgkM*=!l-@hXucotKgGcth_nA z=#ybg*<>rH?5?|s*jp{i%!u^eds)41b-1bGWvi3!E4GdxyJ-=o1(+JoF-B|elY#PhPdp)Sf z@YeZVEtd&dW6Vm0-QJ)8$GIcB!(!E{>)7iGD|zd9|ju)04+kJw3hBPMh{&=6%qC(ARDgV@LQh%YKeZ>hHC z@Mg(eCeo(v!B)`&ngd*xU(5z&NHti=qN+{@W&xLYgL{P}j$Zkf`?uHAahuCxg!XBT zH2U^dM#`?zR8rMwo*>Z!wjFfdvCn>3bn~7ZwjdBs>r-7E@+p&ibs4s-gIID;Hf6j? z_P1FNX2IOIc=_(L3ADEaO+NM6Zvom-%X88Yyy-3+hdJZ7qujcJ;<#O+JQuc^qhE$d zpG!{xm9?>TT!SipJW*^2+KGzqj+M>xcSB_{6>}$WF*fP3>ZsbZi_7;%Ewd69&N_K? z8oIva39+|hY7wnpIJbo1Z+aa``8+QVa+rryJ>5IF@8(QXzus7y_d0Mc{=lnJA;!?3 zE?C=D>E*#XSVHxP>-CYf?WDP}6S8RwJm2PGTY7bbG(>1DM>@gZ&qLq!K}Yj-dx=`Y zi`u!_=GLbiW~QB8^#dFX_xR&~;3?(IxW3A+tczQWP%6m#3k6qH6mcr$2dY`~ZwP18 z=VvI{Ey`Uyln19{+kXrdHPEay+yYt)oX&3Hy~cgP+QzN)gy1?Rcd@;X8^yApjfaoC z7RfHsYum3ociwb!Q^cRR$ofg9j>@^73T?6{d95F3=c<#T7$E9n*KPOx7Xznt(y zfN_Z3y>FnJ)1C+GMUtE#KMcs5m&i9wkKKM2rM*7H!`HZtJ(ca`Quc$x=l0+`J82$r zOtyBvb*d6$*)Zcd+(>^w6K1LK^lbFw_ADVq8dyusa(|FXtD3lVolWMfEbFteR20$l z(HAv8^FFCOjI+KRlajt1MIc6=51y+;bhW%Q)ZQ944|HcPN6!60$Fdl!28jLm9;G zC*WLCY}SEDld6^oDTcG7^n6F@tc8)JUmR6VJAsZfwO$_CuD0uQ1T-^XE5>MH%M?4# zhpCjAip8!cLKK2X>18nmt4%5?%ZkOERzgxeZ3iuAVW{AOJg=DYcPHIP?XHn#zC!EA z2rJp*n5@`=7_KO?@?TT||bA*1^gcWm&G1z3<8;ANpk(S+!7b%c2vTOtM zbRrPk#w0lu(aI$bQ;p#QX9`+i%oU_gup+%hFONuD+k-Z)*B%^l-odQ1Fb^=W44|kB z&rSP89%dS`f@(Oz^VK(gKR)$WSW$~~UhJmP0Lp8d311updvegO7!uH&P=XFCX;B5k zU}qWWQ&LXgp-~F1*MjSrZ~Lm?)agQ_L^JXQ@(1yu_P;ZjTZdcJUH;TMIi~aD6;Ft-lX{Mgh9uLb8^Sv)D6tk<}TnjwliYf zuCK-%v4c+2`8?M&13 z>&KX%Gz3KDc#K(6>AbC8mK?r#MBv(yXB!VX$qeLcS6)<@N-xP1l z&JWb^kpynEy-VBqv}4wu_9z#o`6z1(YR z2Z!@iJBQ$OWCEBOy&P*#WLXBfP4({f>=GD?!Z|H%f+5Z?vMjAdb_@F816Lvk=)7E9X_|)a^~@r z7T4Po=<#>SZDreMk^uTcPH;#zI{r}Vi&eX`ez)6#!l5{Y z-M!^G8+d-C4qU%Sw_ZX!)D=a7;72%P%?EuDe4_2$JByNyY@zxuIAlzRq)by=rQR#>J^ zw|theDFrB_+F4Ap|OuwNIo#(q5{%ol?P`5X;`qXr6CU~N}o5`+89 zK;+U5H5GycDh5?lj?D^n9g^znD3&i{UZ+4O6Pk=g>fNcpfF?%a)JeaofC{;(!NvnZ zCDn@}WhR+}twRx&d{aV#m>Wgo62<7yGPT1kMbZ#-4N(4p+2G_UML_3>*Y7Gc#gK$V zqg#{+yU0Z}*HBxmCS;$aTDjCK(*SWq@cB{W2So&;4X~5JB;djkOXQg6Llpq!uxqRbtqQCC*Ao4X4b=SQYM9bCRQok=q~= z^of90$60{&RVBo?LvctPtVwRFA-Qm3`LC&SaM|_ksIV z5wYPB!B~q02b5wh?sQjjm+s^$K8uRON4E1vN4UH-M;4vfE@zY`Z88U_Guxb@L+p>_ zPn*ho&OQm)pqb(qxfAR5nP6G7Ezx!5O+PEpnWze1$c4z1#%7}elal(d;9#1sqdpP~ z9LfD}ha;P^1wGsu)KqIX8g!^N8An6M3dmeFLDwC{{n|Id)%vdNq?Z zip$r-wKnDF7I<76bq2em&PpBJhKzVVm#R!*)SlWF;*dUCEb_Ia=u*(k4*@}`XFoC0 zZym(M46#BCWxxi*QA?WaCX4{VQVHe=hbF~zL}U&!5RuwMohM8-(mOw~@>y`&bEDq9 z-Zm8)$=;wegC;&r1&s>mtK|4J#JdBnP=n#wJB*7a#M)fVtTj;t!fwcj$w~E0>fl+l zul2P=HBmn+sQ=yz`g)fysGm_{>U)QPxQHnxAV-;y*a8pbSgNH=NyxgVBxi9D47gY3cVDmDz#G9n|;W>Mo-nN}0MMJD12_jAkq9Iur>@u}O`B8le{ z&%kp=JRWm^ax36svv1-i(AkP!eazf|w0xGM17oW`X>Bti#E4F?5*j%SE*0LOI)}7P z=B`lq<(F}r{OgnuGm`~nU0;&Nq*b1o>9%IZ(zKeN5TV);+CGsT=SD^whSuH9@#F>c z3gYe>T>s#%9mUcD^?5%(mdD@sXmdV`*BTn_ z8ZGc>Sf-i3Aln(EEZe{5=U|t&;8=3@T!L0?LVH9cFIhDC22*39vGf;anRTZcKIW0t zO*Wn!d6a6>gY~7bTE&_ltzEa~yb77#MS_x9*e{4;JB6zc{L3ie>Xv-h!;^n3{3c8|&A$&FdiI)4r;S&B>n0#BCS^#D>U$5w!_I?y7a_xP-G8$q5Z zv)s`MM&}|3cw{jk62kgN6@kKgz2KIn&40Z{C1Kkn{M-3)h{k24u~+<$8iHM4TLwg) zp3w0# z?J*BVpV9Jgt)ubq-G}J0WHqaq3D(#q?U}F)cdJ*0?ht{R%+0P;76_8sQZx{}K%xhc z{+%^FJ^vm(L01S)=aLE+CEp?SHHHzn(b5Osfzh~(28Fe0lnMHJ2OEPPc6c|oCMe7$ z^-$K|EBblfcNys42>geCL)YAQ_A+ZrGh=aDi4WfgRxir3O0M&{N#+F@7(k7}$4`Go zZt9A$(J;mwmF$T>X?eW^HtCmPl}A9%@$496&Y$HJI0}K+eCOl232}I30Rndb#QZ9@aPGU*|QLVUnlQT^o)} zfhP6Wdu@)*@mqB~jOg1P%KUP-BUU(uHUWOM18lc<1|@)N;7w$uNgAyDcqF2WDfzpT10$R`jW zGzRYTPsXBnI;r;fml62eZzEXB^!-9zdpVMP8`!Wv)U0@VFItqZJWJ2|9=XUNN8GVR z^Xvj={D6wtMtbI;JaLtnu-<5AuiUvcF0r~frEEQE&+&A-Nz+(xy~;V@=3HUSSFf6} zqg~k70qz!mzGRth*EjjTGVb|^>`}Xtyr3Aw0=PoYmA-5kFXUZ$8ud<>7 z@)HcI?d(`rwU3N)Xyso%2tV;oX!OR7?1Z9Txi-kA1D?Q;=mWoDV2TjeoaCNz?C(V4 zGU--~VVH1M>G2=>9K>vcPG0P>U!!qnr>qFShD)Y-s_MWLLetC14H-9C6=zS}2!?0d zKLs2a^IF{tM%KN!pwYKQk;zDTeUy*9IXFr{i}7O}BJ9sEgQ3lSx=r<7G_Yf~mtBmM zFTdgK;P(j#f57{mzR}P=qs>TbpJ-wGk_=`K3y3JL;IKCI&Q?)w4lOT%N+vg%pSJ*f z&+fjbQoV$`)M!8&%O>k?jWL+0ZNk$j&CLZWwqF&ZX5rCB-b+7>SD{(U1VJySyDA>S z>e?A1md3Gf1wr(Lsp1**VQY-!U~7`X{N)`UVZTGrSXdgRDve8OW~j@#8+>zz3Rrf9 z+8+Q!#q&;z2lYawXBb0s*hGLjtf~RcGd7>!e>bJjKp!#O!zm82xM&v`o&C}0cY7Za zf!*5gQmOrHouq1eBfenYjeq2ztU%xiF5;AZJ3<|X(i#eZs905@&TTSKow6}2)C|5w z0P(r}gm8~FJ_x2n4cfnvQT-+rgwlt$3}RxMIp?tyZ_BR|E$1#HiqX>(LH_8jSrm8A zmK;#N3$<=&EZNW%@m;kcc3W()OpKXXkG1y8uX!t|%5}8BTA}$GiIT=NSRA!hFli%; zD%vR_tu~r;MS#|7ykoFIRMj~1w>^9Da$1Mw+>pN=!gWWeKXQ~jP&F<&a|1|iCJ%ql z0rAqd4UEo)2?sN~QI=29Fe=0rJG)8t(Z-a$Nf!RH`IXHRkh2{MlKRT1HuXc6%xgB= zHuAaQsU8821vEHpw1iT5bNm#gpYD=+;>d!We+LvT@wh_yaKlE;EH~kocIs4y+N}FE zZ4tNJ#5FC_t<0I68s$yI$?N%`AMf^ql!ckQ&wiiR$-Z1o9V_}~lbK@{86$4rB)2z8 zSnxIqGdrsb>`=(|TZnRVp)_KLs_x?c-tbo6wGoVA(KgDxsvN)ZRr~MEgd*|4b%%tg z%g6Pz_UH|qdiD+Aqz}$tTlr$7zqyA2*u7!MugBM3np*@ZJaIZmDa6<50>!t`vncXs z$9C^Wm00NXH=IT2&iUK-+-8AlN0%_ctze;98!aet@Uz$CVmhT&qyEqR5w0+RBhC62O~T-KH3jO`TVO=zSks9!? z2+k+FaV{}RS%+DNj_zrE#l3t-uPem72YrPjM->kITWyqlGn3DDQXBScLwxnk2i^q5 zvlm*wv_TbqIWu<5T$_WpBemPgD#S4_-^LWtqOpc*MUkpOjLFw$B0%0zxoh3(s#$`? zB0cJj!E&Iins7=ph#q$!@xxdx00M@n98n%;rd?QcP+D_ekd+4`5)6Xw&3Ma83_41U z6=WI9nVKw?e&{Fw_bqU*xuYSvmnnBbO zzuKc5w(b^8TNVAmJ_v=~qw%woAx1D;KxB%8jM>5@Sgdp+NKvtjo8M4}E%NbqT9$rP zt0f5H&SwD_k^V27bF~IUHT!{3NH`$Pe>N*~2ceC0>t} zqyt$WXpCQd|7>kjPpG0zZKm7q!Sb>_Kn&osRTFlgT|fz}RRDf==_ZuazpEQbedL!hhbW5+|>IRYTk-kN^d4+U~i^oqHpKhav9S-Vtkz$|65uUqb4M1xZ=)RJ*B;#>L^2Pev!rGrfE z)$pk1htDg<5WoQEm1BfpfcGjc+h-0XC|;GJT*~*j|8zyL6sAN2=2r8!% zbnjt|DUy54Jw$IrRHNAV6{7o`G)!+qT;TT0-`mCrK?lEst&C0?MeL&%nDT>|lygnR zO5|(AF+u29H>Xg;F}=a4HXAd?8iS63n|wrc4q{H5h`>q!**1XxLmCA*KG$%Dy!$us z+J?r291HMG8t#0=Pj*;6uX-s%_G+i*|ZR(0cR5 zzgkWYOQ$XGlUr@~4S*gqZ&*Qz&$UJ6h9L7Ku{atAs%QDlaU z@Aa(5>Nl1I*cK2FaHe+6pPB3O{M;YW4qWOJvK=XZk}0<=ex%w%+jR=~lJ`D+FG97y z)Z0iZXnvi79u~qF=~*PmCtpeP&dSdZSBzWmzq6fwIUpp^KgMVDYCdDlBW;V5X)51Y z@NGdcJ)%Y!=K$$oZ;HUcWk?vD1(fYbH%}$?1#B4DldsOO;vE{ z!F{3I>u_GEPd>7^q$t}sb>Rl>xh%(n2FZu$Y`S?F1LW?*5n-yzLhbM;1gNU6YBGGndPzh&*Gv^=Ug%V_Ef+Mo6uIm^8H z2?|uKHgvn2H3)QP*uj|!BI7dT#|W@z>>Rjt>|>_a#42@_Dz++M61rQ^EJ&*uV;MA~_h&pwEzc<=j!284IQyh z(`3y%#8oVglf2C}Bb$aS`G>dV&??}YiwjLF=r6LNutYl2fu!@oV%iy|dUW8h8M+bU z)?ff|WVcUd-cyrYPCX^4K6=m$F>A*Uvyu%qmj9he8j%+6x`toZK!6GsF600&U3HfavXjR=mw_M)3SsO2#-rVPv-> zACi;(8h2HGku+4c`7(j;@3*kQwwvDw`U(`e!UfKg6c}80<)&P7yrbBP7+g+L3`XZc zfL$@!nTTFE#QKyVNW=vUP7|%80ew;MXa!eI0UR}0<1Gb;6|H4gOTqMEjG&s!oU(An zW}Uazd|bN7WVPlUjkYQ2AHIkkWSZ06w4)IPdUdBJhoWOr#d>q)QB!3ZnaW;Eb=UE9 zL27*YV@(5+EoL1wX`@%Q7Gc`Bxyetp7M0K`qRgvb(Hi7ZM4d&OY0|c^pHxmonP7>p{w8%r!l+;wEEGnEv@3cHh z8VT2eKM2}$7?Ms*3>QZRE3Hi1Fr)jYLu0&9Xbjy-1ke>dC@o?r@YvK@W9Y%jlvyX} zuesGgM8B=MW-9E~^Uq)2xtb-m(Xo8d=SykF9XsV(L#wcL?5WY5sDvTJlev&kbGd~u z6;!j=a5K7v-#5_I$b;r~_+IBEec_>IHVQX2Y88AR3A|`ldUqh4-GiIaN;MmKF9~hUvbM|+Z zH8rpTh}L~!&WG;4Ru%PX^(+`nhBpk}Y+umuWmj#)SSKD~iiEh@V(eU#M$KoKGZs8< zK{^wZ8!ylk4XzwceHf4I;MOs!qkT7L|Q{V$QsaOPl7Q_hCzFa zEJ2zZC+WCZ2-kYmr}jTi8jwYXu}^n~n~E-ko0`}=mWi;mdIH`D}zv^1aTB+GypQ>w4S&F_e%mHJW<);WkL*jn(|<)=<~ z7=CndOLpW0FwgIH4*u-TT{x@UaOYJQ_txJ&xt|;F$>-{by}qRQ8_)XgSqw|Q*58xj zLe)HqR$+5JpE}T7n;~fWy7NA~H0nQ&@5CQztebBT)O#59;42QZ|Ge)oKFzV+xf#;f zF}y!UIKcmQ@51Lxzc*-pp}1cLZZ*)Fz8P((nOc>`Apt=01GGu4D_3YNSH&-gc!RY+ z>f_io7dur4Qd@k(ONRtA4>R=+H1K@*T@6y>L`Bq7%Ud(Em_+TD`&zM};FrtP$OT2$ zY=oqX+7UbrK?%3v^$8n1h2t|IuZag6OY|ZTELZg6I~Z}qI*DaDmDeK4Pt9j5pbcf7 zE7`(~rbU+c`ZUo}z$YYbSF$sO2Dv$G?+J>A$F75!>I*u*DP&%sAuo~RAm-M&)!VW< z3;sGpy&3aosKHl#_D?@nJ2~t~WFv<-k15J@s-#j9qtMkO)Alci(ZBa(86E;su6zFU zWJ#(fsnu4%$is3MaegE_7TUt|M3iaO4Qof{+1>52#+S6f2Sf- zo9BzbNj1r5`v4D1Rx6`yHd3S&zc8q;iCCY3vWZyV8g54K*qOGV^nx*|rg?PT7waL7 zH&C1AChGyrq;y+`BQKZ!8HJpZU!)`~VLgWZ#Pb{h8BnB=tvtgB%2D9k2FB-*EV`*O zgoiOGrBURVmcTH#>M$gF2GO%y`f>g_3_2CUpgf0oxPS@nSbMJe9EIOyN(Po|c~LU7 zO_SoA?&cq_pP$fq524)ikBdmxPNloq^WG;_RheD|Ilf!Lfz z*so+-piBI}1M^ljxA{@dO6WA&F&*9j7r^6YI#Y`pz?P<;75>UyaM3lw8VcSK4h0vO zQ(!S(Q+KfUa|T$!2Aac27=~C?66U;q?pS`Y85`Zrl(}bsOh*5V6C`XPyovk!huT1Q zSi=Nxf4@6yjtzpXe2}PmtIEmCpihecmhIjBXiGG}!=jgNDqv@^ii1cPQ4NMVVk!iUK${u(@*YbrKg zD|*LV0;5H9`-$vcH;uRib|SEojj_aVrCIUVG+DY!&z{0Llg8v{Czq4ag`xc;9m_ay z$bPDE{(7B-+42rH#}b2d+&-z$Mr3?{n%#`(fgT6#{a zD$s2V<)5#c@l6kHynWvz$a-g4e%r)1-1gp(Sl4=9OMA!w++CkM+~D=QZx3XmeAV$d z8FsggH`70rT2|fmkF>Aa=$vdNduH-Zr)aGkT$+$?4Ly7dTbY#@5Gwp2YG0v1(l=^N zh}^>f%0iUTwg5jxviwFxIx*8Reh`o@3@ee;pf1SzTRv}EG>RTes>5b zzcY7kkbzpi!Q*`WXib0G)Aerjx6V3__TZ1{vn#zQzdyIJ|LC5}q)ai%f=hM=_p;WA zJNo*}Q+B+OQNKQvpUFnFm@0WthgVtykv~6i@o}NS;QutK`0meAm6G?Lyk(aE)K2)n zN1mq_XW}4aWMKcB{tXP>`J0x`O33z4-nHi2Yq8GHYvj^^LGXrV)z!QN7*#5cxlO13H zfP$eD@Df61=06AiB47U<6vO^sgJS->U?fS~KS2iSmL@J1gzStQU+Dj-{KU-4@PAwR zNygO99C#Nd1~&FD^#3avC}3&+MYcct>8+rwjz5GD`w0XKT|z+^k^!73w_GV$K@3(1 zC5wm*#Bn-4&MmHA^zb>)#?l07iXyn3bW|7_N`kThoTkE73vq6uGMPk*dPP#QVvn)y zGnw^p$SN;;bSPI{=F-&IDZy$6|Af8V`CGt_qSd3JR{31=&PQUR7=X+xx;1; z>}yV+5ZS^rJRBVNfYnc(pMD$I$Y3z&vo*TiV?v6Pm)F6(3V&P#R77WHR&?M&7~3O= zM{aUdyAOHTd|BJu9O2rO@IiTSa-26U!Z5D%3p9@%f3gQW-{{v&=$)|Jkbv31!+wpU zG+gN;*83jinlRbNH-sEE6D-E|%~5mV z&@L=Tgt@k(La#YHv{8ZUXnX^gicyo*!nh9Ef&<+~vi=954)uZ6jDT<@`^DpL0a5)* zjzwnhKAStWLbg`xc`YEN~ z9q8J_KjD#Im-GxL@ah_1e}@xWeUnELK-;6mvO;ud#RDnWx**y-&yR#cd?Xf-MV4VQ zGnGd#_&jf0Dkt%#O1(Fg)?iklS=R90Hu#fEZp)ZLKS{DPiA!#9CwoBWCgUfm!q|!z zI6w>DE-RLrZ_qVHmz^(ySAjj?4iND^D=5yNEhg+vtSABl)ji*f*_#Xqee&RM7gLQ0 z2rn_NT~cf!tu7iuJ$heE)@1R2-<)zwTA0df!lAE{B8%|wwNW0Ek?I+bo4rhHGo1^! zG=}>5HiKcbOxt_vj=MG&v__7ZjU>}z`V7~AM1LtkqI};YTe$hXS4>86*aYykQ$9zZ zLR^5Q6Y%*9T#6mL{!CCNgY!3GTS$$sSt3DZnQl7T&iq*5;OPQMWN z{JyuCFnjM1l+efNn<${xe>!XynL#9>ED9bD7QLx>2#UK7E6j`i^e4%Fl50hje) zZkTzNpjxKF%PSN916y-k*-?oVU$L3#t(-TaPt zye%lgm|n~usj&f+E1i^)R9z#PL{QE1nc<(#vB2uZ&|Ik3+#cv(6xUV>Qn|*X>4%wT zs6Iz8l5Zt4v@=ShhY@&r6WmVXCn@ejvnq3BuOB(5`sWBILPfSdYfVU?epsZu*4;Q$ z^=W=~KB_R}ATSRVE&IY(5d2PjKb*V{&5|`&>g_H*KoO3WxU7Xvv;C`AXpg0+!(#TA z&2;2Uo_{SiwDCc%`91V4gi0@QYDH*)uIX2N>?9@)nT$qhI@!4)co=lOZN&!uRxEjl zA`O-Nu7eUatPoJBspBb3>Q@%6lU~Py;c1GM#RZwPz51d#%Td7Q!V)z`xl&&(8ulOt z`lN>|qRdrnfBxC#Y6=+}xO`hnudOqhS@xB58I<%`T@d&+n9n!tXlav*OeT`lJc&n2 zIy4Dyr74G+!ctaM-m21LchGXs?W#{b@j{;7vEi;hDfd8@)+zS^)jQ55t?GERu+plP zWH7a4Qd^(iUXm_LB$fWM@n}z~1^j*Rc>buUC>JzV z{}mg%5pWj$8E&OH&k>)h>S(;L_+AUs>!Xy>n-odv@TM)EW9Km?5oc;^{a07#;Sa{A zazSm4N_2K=g+vr3&LB{jNsm7UOO#i*z&A*Va*V_SF-PlN!9c{kQ{@!>#HeShcD{DA zG!JZ6snc@W2nHNYK;(-nX4RPRzQ#NVbU!#cxcGS1E2ZR|>2@xc8mIu{RO!oixJZj2$%aeU6iVj6Ui&fxN|i3z$EgXxCzR ztgl+`2nvR$e9562Bgy~6-CG7n(j@DeVrFVFGcz+Yw3u7WEVY=KnVFecEoNqBW@gsv zoA1n=x#!%yYrD30f2>)RWu{eGW=2Jp$LkU9kJtRjkF^M5&VPrBb-4o_RN+{Am&q1i zC83e9GbPm`Ofezywj3x;i2zyt!+wz`zT0Ap#L113PDh%vHBvM;E!G&|Az7Xm@KOC} zbHY?j0UsXi>fEctezpfig#mM*H`08AK?o*-(npjkOE8`0+s`F4;frs2tG|tOr z%+fjH1E9cYd3%m2c@gGdzMhi;r1={d^kazCZE}k(%zLZ~q!Ck3mY8R3`k@yeInD?a zb2U*Y+?ccFwe>+gW@`m)0Yt?@Yd`%9U;?4@>%YrDCbqw1(?2uS{@;>3|6W7uADZf0 z*8P7_LyL`r;lJe4xq&O8tTkB)07rt1C?EuoLQyI(lE;x8kz<^oX$S{^#S-I-tMDVF zWe`gogMom8NW=-`?Zd=<(`k;{k-5LHuUx;n-Znp+)eOdGSjrx=EG8N)syob84Z!I8 zzN=`3M9cZWlM=HF@qbs+k{;xj6%`a56cm#i=>}~bo`Brh-abff9d#GEg#r&AmQj#U z=MW(o2=6^@Gr#3zgbK6Qm8b~`2^|q1rj3c$jrr4WCvn;3@yi^5(Sw@l{5Jv`w2w>> zC}CgkJg_u?Phj}N9N_zrZy;=M&j9dVHUU1jl@B3kO)WpZB{l*rE!^aZ_SD=P02~JG z3uvc>3rZT=FElbquk2wIkHs^QMkNhx3k1M1_f8Xt5;N12 zn0QrrrJsw7GYfNU^vrd2O|^}Gtl*tGuWq{+V0SK`mih3nCFE`A>yKs_YUy@&73XG| z80+gCbWoEM@}`XrP;EAs7Q9VOEzPY@E>Aw@m-y(}nHe}(c$m1@x@uZFYg-#T>i;x* zUn~DW1L%D{cvjRlEN-i@v*l;su5PQT(e7f!@9XL44i@v0LAKlx?&-bqmviM|EG&71 zDfd~#Og!kI1u_rW23dPmHRGdrbMN)|s!sTzJZIAu0ziZ~bG+s^^!cXCPo$p8Tm$o6 zv*EksmizEP2ue%!M-LF#C-?(`-4_mJSxd^HL%UZ_`9x>hOrRHT2w#iJZX4Sw8yQ_; zw^;DeKQ4rs8S*?j^KO=-vFF~`(f0sE(>Ch^e7zwK;$^;^L6{Qu)%eF^$qcdy-j3xv z_R*j+PO`$2Qyh>QUdTJ0%i=nnn|;n^mubjm{6c#-St^CprT^HC>7|3ckD`F3P5qiY zu9k^tW}cw(_#CHmNzS-}N9L1$|K_S|uV@UPG5)!%o?qUbskTP%atqjI@0^;SUm3Bk zq7WMhk}9RRQ~lK-!6~TK2SEDq_DXT*c1(9{QmD;)ZvqLZPF2>54tfgiKxP++^@1zc z8-_l=vu;mY&}ecs>(<+^@jD&Ll&Lz<*`N zyzq{g-D78t5#738YKq818CjVyN1O@TxR57KwjnTy=J#Ro7V`oC4BSIiNg3ui5fLuy z@Wv_a#B0NCiGK<7tc$E1Yr|!xQeHgVlihLBTi+OWSlJt)-YqO}Z3I+sGcWB!f_0OP z`MqT+@}CuIE?EVLMH+snA0#hu+=p=>4)9R7fzYlEGDVt1cxzsrTs4@iht;t_uR4P5 zl)}=K5x4l0VS#;@@+6b&`PIYJgv417{lzWDWy@)r0u6?RxGDu35=?koRfQXcl=hxR z^yXj}C>cB2o+%iIFUwnLwKD+(rCbBgG<@oZ{9|>{5hal({#qk_gqAJN2Cgofv{aj_C&D z1m=i;dfa%zDwUY#d}in3R{?CRfoL{*TzpshzMgu>$R1TuB|1Lmdlq2tE5I-$|2y(B0S}$ z{h^{V>M+vQIG6?}%atqHZ89malcUvJko4*0&TMF}IE(tgc-jI}Cql=|6I%teb4^n| zDx?RMI5uqn&xoV;eiOGK4@!P=4d6EneqNz6X|i*qA!fq#_EHn_<{14BSA#t+R z=-%iUu!{HQIJUJ-+yaz1C(b=*D(nh$_L9hg(m+XjO5?b-Ya%kJHK@?8Z^~d>!q|Ba z7QH)>MhH)R-0EgGsES0z>fl*Tzu$9s=z4@G*3flyJ5AZZx7k%2h-uIamxZM#Zo@WS zE;gV?r^-E^%cg*W1M?fZT-RmvB-$ATkLF7$-t_)Scgc0|7MXgQ;ZV|L9|G1X z_MyrezPD;(c1ri=EI0=T2yHR+wq#d~tZE;oU_gX{M8jS8%#SfEP z{xiKK`;02g&tQs+JKK`}mvn=p(- z^7E2ic%z?}40X6IRk7`wq;g2!NNv*K_p23ER**7L5;w1!qe9wer9+kP$#P0NO)@Z$ zs2OCJOVlOj&m#dT!@U5QjfH2dWAMi+hep5sFqKyUfeHL5%T*#_T5hMViNRCZN23MF z`1Ff8+Hc}kZBVy^)nEabJq0jSyMdjv*7dp7wZ(8)hEyfH;3TOa$yD{mYPg1aMqBbz zTSwxdvViskAmFsh3@ioJcjdCe&5pS6yKXYm9EQ}DV!Vim$x%oD?3%8shy6-n%_gP72h?8smlNGhlbA*ApyUAuUq)t5x#@&QhN_(X>8y=$THUiOZ& zi$g5BFwhoTa=~$mpu$AoRDKzQS7$`(4ndXX(g8i@wCZqn+rdgGgf&67oc(|w=Oz(d z8NYl&M*UlrsZQRxh~#-ZpM0Q-2tw^$uEVJ(;g{~aV+r=sg*H7zuWS->ww84aDyTZC zcQiLI)dfiA5o%e9SIX$tr*Sx_ZE-}cn=LC;zOsWcA)yKAU|B)Qu+-P$A0l?ea# zc4XQ(qW<+RT=ONczdfu77=#`*_r9~DvU()x_m;(YOD*7GYy3`lK2q>gu=NZ0xARwJ z6pT7XSWmRDYU^9|xwG{&L`WH7<+X9pmYzGUmS0gt`v~gSC=Z%@wm57#sneKmE4wtr`*&c zVof5GCU>uY6bfBP?rO>EShX;Pjk=AG&Z3JMv3s;#nsjH5-EcQ7H9@St#HMx$@ z9PO;&U-=rh8t&Xv4II9JgmVnthL0!669oQ%apF;e9P|K*>u-bP6IW}DJ1+uvQ^hl$ z--8PUw8mlb6(z7S%y?hU{o2A7^R1g)?D+zs3*i?GFi5ei8jAxO=2uTb?^Sk?)I5?x z&le%KdZF?S&8lT$OHywrO@kqH=W`(ESI$(r%mmwl7MGps4c4$@br&Z(xX<~4-}tOJ zu}coi{tf%w9YS4Hp5VrpuHd!*Ue~alLN^Lu?-uXJS^bj8*Pf#^&pmB;U@>FO26s$rV=U;8w!Wx0`aY$xM^Q9J zq+X2oJ1eAY?87UY%!)=NY8Y)gc8(SR-j>W#JI;D&(L7a5Ct^z?aUqFgp#^k<=hAV!Djr^r$(N_^I+ zsDsdA7jt3TGUp6+b4DXAvL!5NT1Gd^m?wy3z61a#}-H-?Uml_}Wru zeiB(Cr#hX3J!AQrc!_avRWVmu!rgiXv@H>)6)tjT=9}Gdn(FqKp+YyP@wSq@$xbo? z!xM~>2ex@Jo1TI#L8+F>&i?u^t-e#QNxX-G&*ID+OhKHc`>o}K5D(I9>&L~k7%Y;= zIcxlQ8^R!P70s9*hD+rNsq9*TzGFGQyN+XOeFV)F8g-x@dY9qYy^#jZ3R}|}!Dn|d z5`aVmnQvGURVhFL<%-N#xaGLo8eViUS%1LFJ9q>HCA*JjmnDe(0u7YfSJ~irS@v_m z;YI~iVE*$i3~eKF0GgIU9SOIp(E;i_dNCAOn%i=|*s=aqS~|yY37vM`)iM^*=Cz;M zqd>bL$SG5ODB{8q2Ke=XIl;|%>XJsIHy^7w^XcAkt&DJEm<$m%nN}#mfjgVEFn&IT zFRwyfZKcx%QLd_N_Q~M^!WB8vG0z^uOqrm=p8R{QUQ`BT#3?Xg6{zuIx(@#bpztFL z)u3B3*-d>n60~(?5YjINq}DP`m!9}S-AoOD1%`~JtbY1)ls=*TnqY978@&ijtT<{` zJ&S_@$Xve+67pRDegpAKcv%KdiQi}J_aIuqf;JZA3(kQ{1*&8LV1LXW3WK7a^xnod zHt5ll5rYFAa#~>ezx369ZDIMHR31o`-NHQ{F;fD8LC-w^i+2=iQa)y1L)<@)(El_l zV#h}h3Dw!qf6`LOF5<0(WAO>D}mbJ z!Sa8^%ovcfBr9xt`(@oDUtTyKp@(C_lZ*zOFgQ$3=FwwN$^GSb$&aO^p|bNw0F}?t zowbCRem?q4Tvo*3`0iR)TEIoQQuaY)?GBr>_aI1fg4m=Sh92v)z}Mpb%?adY)(L29avu8%NUyL z(@IGuA8u1l(fW){a=%{R%T&u>K^npT$f>MipA81}cP8Xs^o+|1qg{ooVa{*Hlb=GJ z?`6)s>ZC>n1EWm2piBz#x6{&TW>_r0zP=MqYHruNPJ~Hxqp{QR6q|O3bH9Om9HUZ= zCrxU;g*W67`%zd~ru$aV)W-SyqKlgHRvVDP`t>C0$)aauo(X{sK{B?NDq>Ruua5=& zA~qv;LF9(XWpN-jSzpe_UFVD_8;E0)O_AKvt9W)DU#pxr<>gWre&2JS99FTK>?v?Lk9dr{?tUtb^ zLzPJRW!+T0ZGAZ8jII`xL}ZA_-0lcAi1yV;lLy1lq#kUl)OC&xWq#}Hb{(12%$P;) z59a72K`GiPu;NOxH4cd46?U}b%gsb@90h4)fp_-)wL9u1*%kkd$sCU;`sSRV4qqyq zj@KU)4`Dy5s87%6)Ww@*BIlvp6nDmtW7=w0C3OOpF0A=W8`IPcvxh`V0I2geBQH?L zE_OAgz8NqLs`5nw_idx&yt8f{w2nD?N%W<%!yitG3|19kblw)Dl=Tv_G}`^1Bl6oS zbYc5rtdgfH>yvXo_JV=?4ix=@L(O3?7JI_6o)>j&@=z$^&0nv>W>GDd4O(R;G}InUuIgeqD z{H?TvQi&+2oRp~+QX~);&6x>tsNyt|Crnn?n@l+pQ4YO?0_haqjQ1lQ@9eoDUp15l z&XQSgbooovzD-*FKkjhA`cV)Co!^V;gnjZHaV&m$lZ;6);ssa%xupE3^UDg&D)YgG2*8PddPq1ae!FYc^+pAIbLX;~@O9*1kv-5`KSY$2ak&XXRoYr;C*tn)X#W&g)e7xVAsf z$Oz}7L&HY?mhCh<1B`6_quOOI6{A96N3;tXm&(CbrR^g@^2vVFdRnG#D7{y4_H%lV zukq7e+k0%oTQ;~b%Gsk>*%%E5c-?#upmZ)!Qa8VC1yOSFf^_TTjKzsM2=G;eL%?aJ zv%k^v>sLMf{rn0+^(S!k zOIWye&7-rRZbu^@Y+vsZJ#joj5tswe7NF_PZ8K0fi7b_Ol9&K`cf`B}ZsOJFhUtgg z-Yy<0+9+z+#Y48+`M0o0bh>38)!h9_Z^HQK%pa%y03Ir1At5FJjy?2^?4Wp)zvBZX zyV|W?K9BpYwNz}9#Lp`yuildnS|*tZv^gRfO@>`|roX~^@t!vVGOy2RVH|>l$QUpI zEZ$s`=EuAh<(T(jm$zRTFZAq&JCgc{P7E1nzZPM4=Sczw;fytec0dogqE>G^?(02_ zN_4#ZDydq&lfbU`sErY1DN%c;rIy*{DEC%Z69V`@2PfR(*l%)HkGR z6-6Fu8|j2A?Cn%4V}tdRpD+C|;qcJ=YZ{;Vh65YUtcJP>1HS;I0%A;?c#y1PKti(4 zo}oLXZ{!5#HI?V#?i?Xpwbikqb?q3z{Yau(cKX(Gd+5)D64822mJTd84E^#QBydF@ z13-roR~-VdOVY&y52gD;Mk#>7I8g$2YF7Uec985_+4Vxyp8fOjA++bXTiMZ=6nYtD@ME7uN^_(#82dqN2jNUcgVX&j)Cuh~BWLI>*sn?2uuE zqpZd)g9XkZQlp}I@>hYbryU;0)D*exTt`JYL89opVS@rA%q!`lXU{efS6TVb+!XhR zo5|&bUYqg8Y+TB#_Rz`bNeVb!QW0ths|i8ejlwqf#TNbW-zSG{r;-HYv{HVo7vk^l|T@;XH8t6Gp3-u`&6mvxMn|K}_9?vZs=4J8@R(A}$uw zZh=VUA;)#&D|~jwvV!+JQA;Za3qKr<15^z{2f3{swlm~Ox-if*AOq!s`K!eZ6I`1* zMmeJaxtrob3%wy*5jG4U3qoc5OD;;*7^nqK>(Zy8vl1QHh%P8g#AFow6`K9iY=Jok z21kNOlI?-y3YOt%ZA^9>3XW|jrB=5-oy85-7sPCoWo5|{6koy`9m*8RH4c4l{>TinsX#4 zYhb!?{CRf~8m+G+#STO6>3?xKi$#2gv7I#O-B!jP^}$#!rS)KQXZ=u4)6H_R#m3Y3 zDU_w3f;3AEu6Rjze5-i(mDE1%8NN=ghl3aO0F7~$n75gwCZwP$S9%EIY*3DHb<*EE z9^$sohfJ73ZWMZdjJuD0+U9y2N6xm$mW zmUXyd0WTRa+y8>*z?)FOKESuJg&iRSj34xP^+BpH3uZaMd%uIce9J2~z3FVaGQP>n@ z1(0{9z+rhS{%GChM%7&8;J%t@RKG;2=85vGW?J@@sU*%(k3}^-M@f8z4fpAwt?eY#(RO#510UVX{6YP@(7$1b^AhFR$f zZM03ul2_MeWZ|_%WCM{T(%4=vn-&w*3hNNTnkjzX4wM&9Qv`I+H%4fDjY!}$Cri*D zTCyOP$9H8fkh@Wh;Sk+Cxw>~Sk9k2@@QW`7Z^2!!1I?Dm0`qC-KkPoT8W4Tr3~mbh zkrOTRCY~?D-o66L3QIM`1h^#D$Rxm%6PhDBCD1Z*p6;Gr2o#f!<1gvu!Fsf-#qsPs~#hoeQ4FZ$#`$8hm%QR<#JNy9-ws# zkRq25-q<0gjH>jNzn^kg<05@)(+-Jcax9oo{9O%@6}Tin9E0~G=6uTGb6rMjq2$1D z5!hIF2@L)SIchri`M&M#;tUS(v_u02KXmNl#gi(L1rAAECQ>`G51^>UXNFJQ|BLxO zci2tp!sb&TDp~TQX;4G|!&u1+_Y?|-->S$u7AAj&s%QcV{r3;OVL(H2>Z5jj1G;gpSYz1pKpshk2GWWemi-#(3uCJ zlCM!i$x!lnphD$VGaHPFb>E@WoBg+DM`u2?Q2GFIf&N_Og39KLPi&GdP%G}qVOkXO zS-wjB5}$r_kW@T6^n4aV(b9dfw_r=Q;{K6<4#d;!6B43YE-06{?&r-BfK9@=Gh{Ci zyUPfQVn7LOU@<@R%K8DI+={O{dG|x!ci!)4u)vSN<}xyFYAgEgg$O4%JrUHcRloC9 z$fv!jbghsS=r7$+v)2c01GIqQZA78N8%-53rGhSH2EPknX9vzqPG7q-aQMag`( z5;i^RPrbL33^+0X+~ff`-fKDM=I8NK8G%BCLf-P%0|v) z$-|GxdDvZEYzQdAuNdx=k#f&gwuMf>V00bTQV3P&Q#@^WLwsOWyr_=#qVP7iw7rc| zi~!bgh3VL|tIWwlPm>oV7WBEoAe6nb(H`{<>!zD9$gKsGy?@BWd|As+Y~&3A%$*h% zTTCp=v9J z@g&mlD@NVwg1vepm_E*r8+Bao59YoCg30q0=>e}xcink@QKc|~5Om1Z7JAh@ z&XEzS9X<6v@I`$ap(BxdHl-^?YAHG#DVtR8p|qAS_$;K7^MWIPg;4;}6k~J~I=1jq z!o+cQAC{^}KvI`QiKrg(2ckR^G5Vxm+sws$w57?LoL>@dk-DBd7Xj`5D8Pkf!##^XN&s(KY$1SXAJ1S;u-(1!R+Jk%~vL` ze}UOG<~Bil?~pftVN0RiW8XLg&VlHNat$I5eQZ6q_F3Xxe+F(-8)6MwV=7jJ{{?2J z`3uah^EeFs8wu$Zn<Y|LE}-1iyG6D@A(otK_dFP2ggQ4i|~hB!s!3AUiwdRF#W$m zP+9*9i2Y|g#{Y^O%*M>f_CJDywKb!0My$NDb?vf%pDmX|l*TU-MX6nmmi=(N(hiz!z9To4TogJuseLxke-#JZ=1xL$y zdvVh4wM_mTC0Rt`r!N#J6F)=cyEWpJObZ!ws-p|C)ZV&TlJFnW!laET4N+b=Wl+ZT8cxIOa=RN zSX_*^S$#8hP|U|olFFt1>WbsAu&^@e`f{>2*M%#_5tU!~aHSRa1g<(?`#Ce!^!Y*V zR9StS{&3ato^`gFLuYFJ1$R;Mj&@NpfjIc0F!bC!CiiuBe_2ejw{q*6i?`uba}Ix+ zjAUOOvzwndcVK+5w@O#;!6OQunL6o;#4~lKp<(Vx!<1WO7ycV=de$H+{=}81RqRhu z6jWNC_E|*^)m**NbSl@qg)FCV8^Q*BgW5d*NuOe>MyJAy#w27~34>LL;8!)1v>*!& zi-EuCUK!o37HOOxx{_kFz8}&?4+(|eF@wE4>Ow|q8snI2N?zl4W%E($z@$`?tFDxA zri^f|aR6M|13>O9GPe+vF~4bG{hxv2G#dDA;5>-1sNsaAyX`GWZvy5x5j#{>@hvhCSjLRKg=-06h!s(wuqv))%DvXPWu_~NZYg;iOuXD5Pjh&~{z*3R zX9WueAHybrCOp+g7e+FTkI8N?&fnA!400FD5`&9h(hopw^czMr@bujAoJq`la!vz- zoTDNaH05YJIC%#O+j!KrT~#`w6V9LXm-TF{2W9LJ%@K+b2U(GRAq%G#-R)Emir&9xktEQ_wru z1*(oxW|bBZb5cJn%m&el&)lOD4MsY;`^=x_ycL|r;L9yMwRmtuQEQl@#oN_}h^iw^nVw7>m$L_uyeV^x~gMEk)r z5U;H0e)UtRYiLk)Zgo|(D6`h5$hOg3l84Kjvr$dc0=R>eT%}-eqy$T$%}8oa61Y8D7c}8XF2#w;t zkG&WoZ!TjLwS}E2&3{a>g_#45hk$LLdyK?%hk6P7!7-^EA}>q}^#SSL18t^0QFTur z1X8~|xTvWOeRNUxh!Ggkc-<{TxtSJq;6g6I=?%rG<%4!3b5@8(tHD)R`A>2?T#T1< z^VQ|!#zyDx#^>t*1MINlHTp%%^eV01=dJtibveD&AqMXXqOSgTEngahWLR(RQ3BNH zn=n=O%cmi`Y&(_j)IQ+x92bEbnPluA(QLiX-N;rzbjR`cVac3XiVW4U_81J zsXYxieK8Cdr@WLq1eh7yJ}8U@%8qF01ka6862%KT8f)0ojx%CPfWntWf2J zV$KDrtr6JkazZXJ82+6ZUdW?ob)frvND0vl+%tyyNQu7)k zU@*`Q4~+^2r@d#GCguN-bao3V<8~Wd90O9E^24J#D2L2X3!*kj%Y~yID#e!Xwu8{9 zV)Eq+moLh9@&ux4I;zRx5>>F1Lb57=TlTk<%@pB_)^MURs~IVm2W$u`_tdGU9>Oy6 zqHR0HM6`zS{$3F21P#lwrC)$P?sfd3iTO*Vj?PeO_MLkH7VAvxmQC1X;g=ZvX9tLO zosK%-2s|Rswm~6iam6qlB2LD6TkFaKcBKpK%tkQb&*`8^5z$0<2J7WxDDKeG8Izd6 zxz@j|OxU-Tu@z)bty?}OIEQE@n`uxyjhk7C5af$cbb^jCE4u>NHo!=91jxSTjW0Nb z`xUon2kBN)hnG@x%D*V940**YL)Vu22UZ8wsimhJNhQX@!*@r}7%+uuSv;|Fle#3z zRBwUJYdNPC-7=wZhg8dHiw&z9wsxQq$MfI;LokW=%w@Q&J%-plqspD&VgdJPvXfqW zsgroZrTr~#@r22hL-GOFWP>@MJ<{%IiO(T}^HhxHPPW)6imcw+#qStLPF|)TSy+r) z;694%))G+;0pkW_hAV5h-p0kxbO_lMt`Aw{iNVdK2Ia`buY@5!Qo*eY7)1#g5OfAm z9%WR|#>dZ`FbAI#2rAE+Uw{Qs9>p@ooI7CY)6Y&gZG{f9OmdD#or^4|AZsYEvfV2l0419b8~+hENw`Z^nkl}UGbCy zB0cPej8h*JzFD_9*40$OHp6fxbD#A<8r@KEcx*7{2Jh-iW7ttjYTN;Sg_y6VP`@cS zP{EdFUZ)~9Ygsi__@Z+lTHiBXW)v=iGDaq(HpV7|krowHMXd>|O_&TTL&Xvm^HB8A zDq=qNeWAKd;Zxz>A?f(L#Zj^uhO6&OJ!L_|wcw&P9(06m-fk)(-faq7Y-)}UyF-8P zt|~352LFVvX`L7Dj#z=OH-9wBO92&BtCuJ5qh6jjVuka>Ram(s+uCQCa}IvHwB5qF zJmOqG!)1;<2&wj*W=`+a`swBpGfhG}6wG#?L(=(6|AFB5P%tMAZ%QcLftp~C?mYqb z^)0tc2zn9%d?cffLNE2DFvdqyt#7F?g|my>^u8rnsk|j3=J|0?*HDp;h?ZU3TN0Yf?H!UP7Ca?nSW}X}R zCaFu~{2%N&$_oA8y(? zcu{E*$ObCYkeju%l}qI} zwESt+R4vBf&kM%saAbgrx-`s2BkP-Nku8^l5o0VtU9GK2V43Byc+8n27`{69bWzW$#TsBFBnGtezLd;SQ=siY33BO5Clz zHT{N=YLhktk>M)bEI)GyM|suDsOY4d+xM;7CWL1OPqyWZCo11d&rmN2LaVa`E-L0e zD1=ZX&X~Q=C_Y{pJv6za)g@rja~g2=_+UuJf?z_fAe%DPc3nT98gHEEy<5Iud-~%M zXgY_}cZa%bT|GcUWPx3Dp?Kx#Nu&t zEtdBl$M`h9hL@zMTYt3Tf;E57`fj6ZO2)~i;|r`tGv;Q!=Uxa4^2*A_!a1lBP?yFF z+WCtowaNzC9%SP=?eaa&3nr;JIp^h*XCsW!Px^G~BkS_K>C<@&e(*uhHLuJ2P*W&z zC-uu?7v~Lat9HqMy0&_yX-T?)YaRY-$#M<+@-auwYpKPP=(#aCaaFkwuTpxe(KHoq zusot4WhT{3LOWB2m$3*_!dgLQ4=wJUP{U2!?cDM<(XLRHmW$FfEbJch8!REwjhNXg z)Q1sizNmB$)bEQH-m6w_#6>#FMoE>V!>nMiig3Y>8ft)47MqS50Gk(C?xj9fpoXU} z4=W2yO+Ld;Q$rXs=n7Pphnc~ymP$jS*pP(WETxu`o*Y^@ot@*Ek~>xi=^I?d?K9++ z2VQ_~&)^@<0VfVi17ke)z`TD7u1f5iEH!udSJpjs0{fYq@AkF&GU*=F-r!|y<^Ms7ibeqH)$hD&NUz=HF!{{a3Y31@Bh z{f(#P+Pdnn(3ad#=K|rT41X&P+?8hTG2du&e+_p(bkm=E0cFcNB!VI9m}juLX~2ch zAcD*-`lj-NA7UfVT^6xuZ8!iKSOvFaHCuR``~Fruzp;gW!N^&tVS$mA(} zDbU53(oGHGM%HfI%sqsRGr%Q@Ex;wuAcXAUoFEI;lpw1Feb)@|5kZcnuq@okt`=c$ zVuU>_CEbo&4;kXSnFxEK>jvBy$`Ln~j%a(Ks|MWaR^R*IKnP?UeQqqz?`GaPl$jUL z>v0c)Lw)E+z|WO@4WZ+;1YAY_LC4$IvSTvU8@8Ul(r>3i>Rf3?ubw1j(AkjD_fX^O z0q*R)&UwSfvlPY`3m4#3Q+u-F1AF8le$U<_oi@Y+I)6L!!J1qL*(afonx4VMnwerxah*mIASaIjp>6@+_~L$huVfe2 z2h&R0oHbuqGm6=vlnp@$U0KJqpvL>DE)(oDt=Col zH;oUkhY5&#>4es|k^_I**%|v>F$EK3pKeFvG=l!TgAKZ}9d4i{X6qjG0JD=G@<40f z81NMn6ZAe*W|1EWeU3(Hb_jFtYM0o42`!}BA;#Du_j#m}cv<$i70{+URjgreWN~qN7iDsMldj^0yu1r97sGjF- zt}DtPmLW^`f6ZqNBtfMZsrCHJWT2;XqviHQ;l8^Eu~>G*tNQrD&jItQXxNSt42PZ^ z%92)Bm8OrBTNncUHFADCn{kMl6aUrOtaxOvlNeLs4ma~Zj+0imyhliKlxVP6Ee&gG z6KodG#T%4p14T(eY4ZzDn8DWSeUgqU__VPvvWL_VZ^vrMid!c*2n(=D%Th$-(OlV( zp{;;A8)E5fx5d}=9!I4n9uc*9jF)Vv-e2RTp2mhj8(p;pmR0{i?j`LL} z(#$n6B)B5aF<#7+w+n#gIhXLWAW|aWV$omdMpoVPb3KmWQ11aIJ<_cDh z0H7`gILrH*6Dr|z@_$FEY}owAf#5&SHNT=gL#}GQWc5_XSU=BN zf?&-54$Vz`Kp+^152{}gKH@GuEr`@~ilbyJVxI!9Av@oJuGHN|uLMCQTIs=K1fy%0 z*>5GdOdpR(yHTVB)69uDU&&aid?`<$)0wwQz41lV( z4S*UFCGUG*F9f=n^W88)r5x1dT%ZMzl5XhlZ*rt^J1Vfn2h$n?4S35r`alU^%KJu8 z3WBn7`a=m{$op2X3W9#Sny4Xg^1k1$=F&k#&iHp{!l42MdZCk@pdsW4Zu|KgY$J85 zUgZeJ#NUBA`9lfFL2OltKNp>FNXV9|eRpGypc)%YV*Eo<1getVMs{eTiuw zj9S9MBTbv*6#t$LIBF7URp|-ZtMePa<;D3FLZojf1n#9xt;e4(#Jls0rXQQH<`Z|! zZdffJmx0Y5I!_YauG9u!A%tCo;rij(AoMuAkZO(_e308|*Af78JMlgu$6B|GC9THJk3tIb)aI9ms9(+(; z3KISB6nmy33jx{_2cDZowhDdnxT^#xjUp)kk*~ml7$XWEFQjfqwf{4{TY3`@pr}-1 zu2R?r$P4-Fz&l(HXuL7N$HCY1`;($Rss&-)UNS&Sk)3z|Cst20EERNK$Q;Z!VxI|C z52WtfXFg-FcPy*q)&}vJ(K_o!_JqrPrA8 z4Z~Nt!Gu`8W@Qajtc)c{)@Er*e;A_;jqVznyit78YC3m$tN~NTWCBtl9~D{OD4RCQ zLCYLU1M3+5K!vn>2Gz4KF&`BGurJd+QM&g4f3{yQ$>DC9+#~&d9`B>wOk3l<`EVNJ zJ7PI`ro5Z-LRaYZFG0h#Jr*K<_wbl-bWxhUxIMnBfrn-_&5t%isXLZBgfhCkvT(UC zJj}0V+m|XU~*<73fKH3ekSkVv&vGB0cq;jjW_6XOfa=W!|d979ENoVWCu2be|WlO8c zZP4&j{(Sdvj9i>IcMPz{(1(e9;2c2@0}F^`s2W_@wU-t_rW{NOV-uccK#dL|98~Jh zE5lS|h$Kfg*AvO7zL2FJpZIG$xbmROo|?AnD!7|Y1ixP9`W_FW-biG|dGT2qrvLJs zhCbqoh9{q-+LE{;w-oY}Ey%aBdczc`bmcJmRJF+L(h*q44FjZ_DNy?=WkH<&R*=ex znt$7gA)t1+9}KE9LjgbOfCrj!n<`9Z2Av6;BJ$0#zVl;O7H6=@wAr<1>TUZnBPx&8 zTSGq)p3)#RA1XF%j||G$Bl;-Hvlg(nFiK^AZ>*o2N2$a$|)XnIK#7Qht@y{ zHfz5A@-@{btM3I4I522bs}w-zjfaU|k@QO})2g#;H`D&vvC@(6Rf^L0^)-?^6KiX= zaGu)iev9l2qx5Ux{S`9TXxoX8Y%wnQulv$qyInG4XVbm8Y~PM+4wYw=ig@emnQckOfT_?Kg9`DARQr=Rxc=xm`??%oey!W*= zr%ax@58j>1&6+oNR=kT7Tj5I^;8R|0HeK_o?d z8#T6lAyiNzex0h!$mppeqWB?^`1-I&X#-OItOHV5(H2G`Mk}hrA6-)G?8Tgo`9p^Y z!d1_;22syd-+J|aGnwIhb=B#7$#LYo6&S4te+`UoV4!F~6j2&ly26Fd6s~-wo|3Lv z(b&{e)w{;UwR4VxqrL9IqpcNM6&0mJkRIx_@6!!%B%>Gm%`5Bt1T=g$afHZZYV)3( zsRgJ3T?WiC$jP_%|Fmei zZvO1`Y@Oc-USmBprNf}}RDR}6U5c~!c$w|-sEMptj!IQ&waCT3do2qREt92_-tplj zQ}hfD0yaZP$QSnNB6gqEkv&L8Oeg_92ahv3%q{q}+dq<_SnNGC&ZjEx@+qjmP#)1o zQ@yRMqWv)!nYP-NzO`OvV{VPO+2P#vKu2hIlutXdch&axnhnS8&dbis&B(w(lKD9# zwGx5-8`xmsEvCBwxhmqNi)aSZX-rrCI@G9j{&U^-P!vkGCC>lDki!~BJ|~A`__pqD zTziLdMZ5=3&0fArgR3~s@0y>H6+7`)9WTjNwOTjQ2`<8s#YSO@X{q$v_lg$PX zNmCifItHJ1u(ik`J6#Uw=;zz0A?CwK)vHsCYtU#oqB-ELTeveC^S2 z9o)r!D_2;y0Qlm0o^m%qW;=)qi`+3j5Okj8A+O9%D0SASGM{8X^xQK!92`w5MTY4; zK&gkjdrPEvFj_BK-U}!QL+}O%ZZFUY58gZr7@=zJ`58h=+K+M?^`S!GV&daeL-kJ~ zj}`x>ibRQ3IX?mPU01O`IU7ADBqq~UR+{=TEsGRSSdJ?i8nwc2%SsF2XO1mYhMf6% zXD2_B06~ya>(zs9rOa{C2fW5ZE-n&URs{;alio5DC@Z6oM^l~Kz6n&O%3dUDu1GW! zt?L9&@PF`jk3o`s{hsK{W|yrl+qP}nwyiGPwr#tr%eK30cG)%gf1Y#V%$+m$#*LVW zd9!mXBQhe_-nn+J-}-#RG2$b07OFZl@sX-~ywQW!SfD~(0OpDo3Q7>YH~DrEQGETJ zqLMLl*&{K9sKoFG23)yo6p!Nc<6o7)9Bn-YB1X#_buvfbj0!2I+@i*U8`~9d?+^pR zUi3%Mw+wtfOAkgPm5dWA1l>4nT?Zbr9_Mtm+@4Z-24hi!$uc>?UF-2hFld~|cN&(Y zY*Wc(_#dts+toU{VipLbsQDwAjY=OBH9pz}4=M;?pafBvMTnPX1LA2cf-rI0JdP@o zlCeqh6+`Farf-%FSc1io`pC>lqdRJ+c%)jkQ8Q-pyV|w=g3B<6^ws?duCUbgea$P} zMj997HF?c`3vZJDtb7UchoD}&;j^&|zuvjhNrBKMDhyuMU>WkQeJdqwlBWCBmiq3z z$!V*s5$dqgk3K2trXo?gGAdEdKhMi2bf0MK`!oMA1<&ToIBx=%eA9BV zHlE+?Ayb$TRdDX-nGu{DE43-yQ7Eib)d&ufO+}OUdiD9FhRsJXO{aH(IV4zm4)^t=BX;%L_Z2wSkuWwXY$PcJ!u89+Gl18oG*Q%fS zez~jP!gyyH9B?3lRFPzC7&E1eUs_(!LB>6&BHx%RcP5`#&=V>8JV~Y7P5cHQuMzIL zvf(wsv%GR!N0*AGE{}B%7#Q>$IaD^}_w)2gOlKJnEMC#ge;1d(OC}rAiN#N$eBG7s zqfqqMwbr!;?y~YIV#_ehJm#lHhr&)pw+Q1B{@|aNjPY_~-xpV8+iaRD&X{f@82=tH zf}>40Q~K*yE-Xo?IUG~ZsxptUIk&!>xR7YXWv_0UkH?+nE)@9ax$wDl16rtg>KYn? z1T$A!YfA?(GLCF<;)4fhGPDPY@3c-J%7NIM^qCjI&*7WC;w)%PHFww7HBmMjApXeE#<1w0;ggBhwCRDu380VnpiVX9rBGfonz?E zCraX#X25^%h%s~g_nz4Qc^BmW!3_O}D*1nb8DeB$X8&JG@4UcO@GM*H27nQ;w|Ffa zppaNJ>f;Rt5U;Q0pc3Q3f=~#F_I9tYiQ2om!hi<0XF5!-uX3;blCCqJ|Kw!6>#b_- zRQ6PUZFu{4`K@<-1<4PZ15pBjqM_lTMF+-)#)d=$hDZm7Ma9H;XC+4m>?80}!!q-t zpm4{%@Ve0{(vgt`iU$=cEjZmdRewmGM>1LMH##lsq!1by8SWV!EbQ;iOF1(*N_-DN zelQ0_MIuG4!3wp*6YdiSI3VxV0I>oQ5|Vrz0exKv2!Ih06$L2H&oSCztLy@WLlGho z|A4~6f<8O0y_xm}g2up#OVtJe*B^%R*^CGvC!_*Tk!viDP;j+~`>JhlCdB4KW`w51 z0wqDY$3xfS`|<_}5>i4eHZ?gqB;Zq2UY%Q7SYc#jWp1l)Zgg{Wb$-5mxbyoWK0T^h z9Uz)#v^PH3-|3N;kd>Yto0^yzr=_K?E3dAst+2JTw6(rDy*$Uq$HK$OOV7^K)6&z_ zeQ*47HFo~qy*+(7e7OAB=cWe(`gObbm)&#k&#jP%5C~CV-@TB)!^g{~rAC5}01wsoGFoHqNO?kdFL(CNeKP5(r$)n_OV!&Y8nqD&E7>Pf0Y(c} z%-Uq|Dm!~Xdps1B?WFh5wL+bzb))%!v}ig!c+<%7jnA2JohkEhaxT7K#G^97B(64W z!|MxQCbbJ$cD9qh8GTy7h(x9U)?V9OMj8J4pKVrBw^C@LK&enGPL|Q=ATA2IxI2{4 zP#EP2>&hPVXq*XYr%bSE(!dl?e+YfHo;#{*I#_Dwb9~KM>50Uz_5Rq1@>dn6&c^3= zyMs5H(zj(0%19>D6nqff$DyhtU|f;Zr%Pud3$YO^oeKkO+_EcjHIq`V1XmvC2Ngt2 z(sL061yp3Ue7+*cdn8(FYFKKb9y#yB)XdcrveW%eoeNG-Fg1*`N@uUtBikoc5%2(W z7_VBMA9}SGpv*>m8B0K-8TQxR^+)G|7X!K`&m_M1vyX7d($kxKH!HmGXmHF&va%C^ zEclNjNSk?_=tlEmW`05P7w#C8#i1IQ+*qzi&Z7DB+`pp+w1Ko-hoBDiG|-n=m2HXt()>aOhAfkyfqY5= z5R)pzoIc$-%tC^roW5X51)wqTYZoD<+AsOuiX6q}Va;{Y0tqALd+KuE{nLC=Bq^O%t0qt7-jF(sM zK0)##`n-G;J$t3bF0gSvwT0M26z086c+s_G!e)y6y$)I=GIWS2rznmSMJF>A~6^h4I>}2xZu-Qe5SQIiq^Wv8?U?T;*3K0AhNC0b*+@Ndg(&gR@Y+#1HFYA1?hqzqbP z7z<48M5|wODb~;HIMfTO<`z3kdhNu~R#Jo#%8{u&M(%hKD`^j~C6&cBo^BT*?t_wO zg2?y~TrM1mI-7fEgjJJV|%!s|SrtWg|0DdH_+ThAJbzv(qcJf@*HDm)~Tz$~xveZ|yn zP-<;!zo?zt$M5LTP+hO=mTCK2W&h}FV@UtgtdI;$9SZtnC#n?DtTNMA1UdnB zHU8z)rS%(kp+MV=yo7APOyb$RR^$ul@FeL>O&J3Cy@1)cGSy)Sdsbhg|kCDmq zC<3eZIgs=}yjZ%<8*Ls_%`|g~Vgsl#z0IX1Z%yNue}T$5yu~V0J>5Hzp54O7>t5TKXEYZnEKbTK|#2`iD;q{v5?QN)=JuKj~Q^#ZCk~6;A||A zZ(Y7F2J(Z5>3kkMAm9?lt@VukQgkmC`6_nMR|afhN*<1+pbT^#IH{y>%a?>&pRN}B zsIp4(5)D-$F|DtY(~cM}brzO)r`KL-$P8!f7Zo1E69w;h9s)>;%CK6?GvhG$&RW?8T*Ds-=@a!}4p`}6@Ld^BT$lbAbr=yFf( zwRcXOMXl|f-Ld80!bXygYV^Du!vgD_gHB$P!Xz_3xzsAhma(n(xx=+Jr_+_a>ktyJ z8IALkXX&24*VA_SC|NiT>l+H@e-a^3FE3wKGD$Ck)pS3Usmlpc1#h@a&hB!r!85UG z{L)X?9XE2u_$F?eXRBeqA+qV(WOCo4sIAT`_aQ{-(&5Yvr>I(9EQ z0%?r}7~sZ5Pwx0R&+fZIEMBP3>@GssT#&DyU;rv_mE1Gh@r8PS)rt$U_o$70W{fJH z?*cu_CKPTuj;)r9wt7F(Tx^7Ny03|hL<@+jYKmq8y#OPPwCo9tYM&qQ^=S+%sQ#55 zO@**8QJ1$=cAdq=7qVRo^RB+V=!WscC#E`s8wkXZ*>@m>ey56tMnJ0U;`8e}Hb)uy zE3;*QK_0`1CDMM>_PkI1xc37$Tq+E7a=p(}NN@8gSA6t1}U1==SSM?fVe5ahLTUJ~Vi2Jy^K-G|fTF`US08_b$*yzvO@E>%x^!+OLXPnE zqIOJ~)K0!Y1UMFnwT^o7C$HUGcPtz?`JjP!QS3hGrc3%3C!~n(nCp}s6`!eFeiDgq zf{K@mCGPp%=gCx28FNc4Wt`_TYS7IJP0UGF&8n(j=Cp;r30Rv&8+ONgX<$?f{c*dK zy@w8R4u=j6-?#`87-M%BJYD6OQSjc57(+5n0R?CC2uc)cE4viQr)JqyLU;)_lw^# z#R5!C^bgC`lo&^oo7NDksiMmK5}+uKDnk>jofDf_3lO7iNpv~+ELO2AIO-({Mq{@D zlprdip7())T5T8Nj446!!76N;33Nt95^bw&-v$)=xQsZyYyy%Cx*r;8)ADM9FsdjfL&x;c_fb5SiD z_;B@_*4oSy5@~Xf@hq~ zxFAD1F!-|Q@x|B1h^LB!7tJ2c4g*>PMVV>?RtpguU{iLOt^WTW##GI@Za7@yE zV30bv0t}eFdc?NzlWy}uI>s#M+{UJsHkI5B0n(g>*;bG0`dNoUq{Dm5iuZrZVWQpL zpfMJ5#me)mx{KWdX$wKRp@g|sL{Jp-AiEYJ6;K=t&!gQ)Hk8F)&naHRhz7V_m{9|x zPpJpZPyUR`eil~aPR5V^t~n5m#bHBVRT$b`Ck2zO|7=>*Xys`u0mdb5ObnOyR4&f` znjIM=#Q~PY(iw!|yWy~Gfn^$^<%jZ+yZhNvscL}sz&d4gTaxx*s9}&qVs?dcH}60& z>!~GXeZzAD`)p9Mc@-{A(!%;`L4^LZFWS`V%(f`(?cw7(YW2f8NkT!~-mJ7|Yoo;r z@dl8hP|F#)MEc|Aq?lsZDaRp|nk?Qqq zL;Cfm=xQ-14U?_fEBe|M2L3Yp%<=Ag%S1%uh&ll*NSg$j;%On|@&JqYqa>bhljDGt z`I4+lPlXM5PAfOWOH@@-)z#S6blLFdcM&>?R}^dMrI0)+b(>IDS5iZ+WSsqZ;q_HJ zodXH(^hc-fqqCC(zY8>)+3F=Q?l=e?*F21aK;oOo`Hkn-Hb6?c5W>j!Rq? zWMgdtGu8G2BDQG7W2a`_Cj|5uDnr6x&v*>EEy)Md%1vzWt~Zx%F2*D|&^s`|ULG2@ zFrT66Sav3QedFx=SR$s>e4`n@{9YfYNG%H*I|lK(;rm2yr-dXq%Z@J5#6?y4=40qt zv>P(nM&=~j$}(LxMqTRwp6?3VHski}jF_j!9%oErQ>LU$@d@(6+IytPmnU@OS-y{V zjZKV3gdA{ZAqdG%xz8%N40LG}*)xb(pS*C6F9zd6#H+?xZUgkg@w~oT$Jr@H&hMci zcY~qnEja6*2^Um~hUq{*6U~e)UcTsx&v#6|jl{E#Ca@&%dAhw-HV@3Y_1F4vguHgj z^fA<`>Z;Avaukc=t#M{#du-n#bM>e#S3 z1*}VLvB6atKz#WB_C-w1#1-jPQwW6@$gR#H*IfB!%>HXRWJk3U>(lIAw6;F{xa86l z!8hOoEwuoC9n@Ww`Xsu+UNbGRJ%#VD;;fwV3w~|m8LHZr)Oesw@3_|bh#)6RE?BAd z5PxXrz26@V>*)QgzXRji$`1Ln;RFAKzi*{G{Bs!>u9!=YB0 z=p|I2f>>vm_80@gSaAMHr9Mt$kj-9jRn=J9YvGJ4F~{qMH$ueKox%@Vz^j4J=B`! za%$=bst# zfw#Qm@^e+xl9QfntrveZr2qPrKX};XLFtkJgeqz6%fEB;oqRSMDZC%;z{rFC*ZBZq zkf23Gmo;wk+b-a31lm!^zaI%j_oPmZRoUP1o;A_X;ukxHdwJ4GQ&w4DmAu%ujm2r^ zV1zuJ~Rf~T%fZX(yF9mX z`pPt@7@O{Nde^*-fx+#oLj(WQhg0Lv_Jt8DS}Tfaj>66=sj$*QjzYt-p>J}}o;TtL zdwKb`qj0$;-3ilc(D{@c09tW?rtgnie=ZVdTK!c1@hUl%@jlMFIZlUqV`y>5JWBH; zxzRpvjj#Fcg%#Ety>6?mZ$c~A5fud_wpw$i&oavYcj{lkk(O>gK>^nY64nV%yml%5 zWgnVYnfyCMf%~BYUuSuetTb;l2Lq`{B>q@*ZG)=Fg&!<7nm^V2Qh5ZanZnvR4~&Zs z9{U&U=h53+CFwKP#&NZ=*J=IjVIP-PGbfWFi5d)M8FlI2ci!_}i3PqmG~!JQgWyWi zNIl@3YZ}jN#RRG18BbQq!6yfOSyKs3e*^i~KN_Y7c@4*h>;5U7LQt|@_TI8x)JUlg z7-qk2QVa|4XbdUu@=6x1S<>*TQMshT2hrX_?Krixs2jfUYiepqhJCdpwo`P8`XFpQ-v+7K zNDxbK6V%Q75C>9CatVR_rP7UybS7Wc`9uqOT}#;O6O9{E+{@Rr8F3^ze;UWr&!}^X zRS=#73Frs;A_a;qwfi;j^ioK#bQ$GiL4TL`?@_ygWUi+1S@3nCxE-=y`$5LlHZ+Fp zI&)S%Rm#Qh5C*RW{bC!iWLJRzgIqOTJSHA^=-d)@xxWlpN<-0{{zjv6%1RXmMaz|2 zGbyw#7v(pG7{zNXyh7)8BQeWn(59W98k|bh{{|m4j4C zx$1J3>O90T<*cgLyyYFsPMiodUi>CmQ!V{d`Md^<4tfJs(?ih+f=yifp_ZUP6#DCK#YiwOrqg1H7=~GRvo<^^&LyFZaHd z)eqb$_L1f=e!|B0moAG88fwd_uZ)CToKebIrD<%fvU9Xs2WKzs`;HOldET!5rr7;z(6UUImwRRZ1a`6A26>JS$ zb4gwg$6U=-yN{+n_BwqXVw&WajL&4~fkjfss84==o0XnqZ46R}$#NG>huc9{lnrt7Z+#-@teAe&jeN+c884CoTuN zrx5oC)8Z&@;=AR+(dea6JfG(4dA&sF?^JwjWAljJ1c!nab!q5}7unxD`g;L}w5UW0 z$iY3-2#VIN3yR&|toxdrLcxlLY0_-MmvV)tQNe2W7>L|iB?$^EhuZa8r^h?yn5Q$j zJ@a)E9z5lXA%Aqp`DDcwfqR1Rt)&p=)7bW(OMG|@^Nn>^Ya1BcunlV$X`C`@*UV-; zN|+`vr>)Sh=|ume{_Z)E_v|H>5Nf2Av&qOTGUt@jVddcG&cUBGT|nuWdE+@RrI&q< zQv-vqqujpP`IE~+UF^A7#Tp;F6|5VcIV3K*QW$|l#yRrK+VIPkU}LS~81MPZ4;xk} z_WA+t?$ybZ`KGGl)9P~S{Rrw9Z{nzEvxfY+-L-^&Ba9c)r$Jfn4l0iV!JpepTue^r z_by+boW5GhXiw&$4KE~8?QAgBnr5#a*3N7t|Cy=y zIz)(C4L_J1wD-Xp1y_dev-6uO5TPBTePaTG6j9slFAHQ&(I1-_Bch2R_+5)YVvuGe z-N-M!FEZ7^pv~d1M(_3tj{v6lDFo51bU!n>+aCagyG9#~?C~ii#(?n3t2||(2d(pTGRL`@>!LFL_32bm3?(7^r|n{rL(*;Pt744?Vaf0JqlVO^l9(&A-Uzy< z6&Z5;9krJy_LBx8yHlD3TEnut#hQlNiJs@Xi{@ZO!9b#@ST|)wP^Q0$TD#C(tCK$_ zG0!64)RLFrKHTu4X7tE8#k~*_-RSa?Stp28EC2lQyp|gbZuHJZOt6>NM(8>!8tn_# zGI%EyVYagZXU8URXEgxh0Y$?{j70W*43)>@>alZM?_9;vT$#7}X^tS|Zns9DTFP8$ za0LG#^&%v#;eM@S9H-smAxPR)+k4?QU8y1LqV*1PlE49aWR6{lfw2ZYBc!@0Mj~&@ z3=`BVYhfjn_eZ^s8m&QFI{WVpA#wwf6+*O4ySsk(B_5WX3(*Nwxv>sh4Y{@891oTstZcioJIfrAp8ei&;8 zUNzx5lOTPbxmh5Q>UDE+inCRoRePw&i>^^9B3X0C%5^H3ak8(~D!WVwtCO>8!h)CZ z4Kd7?qUj+bFLUp684PEy1=g8yvJV-Yc4U8%&q|$wFslf=W@IO>Cg7jT)({AdfJ$uK z!|OyynfxWF_NOTkFmUtneRmIe?NC0Asir*66co`-q%sjnserv* z%jFN3SJAm~Lc+l@42KJoxf%@7AbrBC-bYFC5Q$e0J~7b#i78p&reddaLqi!(hF4~X z3d&Q%0<&_7i#qnoCz|1914ZmoEvl|VXV@)zETvAj2}%E>lf0^Ryt6o z@*Td`^?adLtHxcDgm#YL){P~!L3!>3~93-bVHR7)}uhLzx&PCg7O>n^tpFVA==0S zPorDq&5g6;7BkAJbkdJGvTCB)H$z$owZ+*u2`kw;z<4(hgwmr}nu?n0PkjmiR9?zF{|Jg0BNdCJ<|J=Lj- zcODjeA!zR&tA#N0L{WAtHr$AbR_6&>u$ikduN&7iq;A(GxAgoXahE-K>5eTa?;RF9 z6k}{4qs0c{@PW+PN!-{z^5(LoH=*)RGcX^%35;tZ`T&Zns2S2y`XqO-;_l=NSETTI zr;1yQ1LCy5dQTV|=qvb~Y&z){*AQ{L=}z&P8_91*nTr$_X;KMQma zCH6F|1;uX78^MH=UUcG+yiC)qk5eyR6g`7s4Rw=2Bhq}CiFUbF4>8m2K;>Ce9`F>5 zILa<{@TA}wX50$F&omA8RquK#_F?HB@U%`lu%#8oNp%1 zqksu%Dpp2VVz>1$(kp;h1}Iqlz%r0y%VM4N4wmXLFDY+Pjps+2v9Hd%#vKb*aJJLb8xi!Up{j@M4FY><& z1-+I^i`v1s?2F{8_@X({UR5^gnzcv2`2GP^BOK8ESg5?1)q?d7$as+CO?!o$kmu4V zqLxH5^-ySI^`kGRp8I^w@f*893$bA$)xv95!dH2ZQ>i9>jZk91qOn?w-cc9vHyR#k zH#N#~ziDxGHV)>;0e>*Q=Y+$&bQuUNTk`g_nizv9^mCP2_4b=a=7$ES+W#dVXSkCn zXI~gVch{ss1Yb@dr<3|d8&H?-|3hO0P%PxHmj2`~_?Y8;!kG9Ag1)P>h-}pATUXg0 zqa`x5Q=V1n0zNM`UHYv_5vf2>>OH+EWeWnFmLQ0>nQBO>*8(ODUIOJu*qU==*W1Jz zw2KITa0*2&_U`+z$0Lk23P%^WzE9Zckrt7=#7eYQ9TH6yFGGEv~Y?Laua~? z1?%+@-eu8&@&;t+Y-6cHbnN_Ace$!OkkK@e;g}iJc*#vRs^r&(UG>HX?(DBltY!>f zaGYwn6wKX-`>K9JW66*cA+3?gM>u*E7D>{s?V!kwYAy794WZLI>3%1Me#LNmjKdd| z?p0&Zeb8-keVvHr$Q9|>f`hCsn6TBIC{0g{vID^|hA;60)$`k87(}2!c|7M0I~%qt z=UH)r+@qLR^1@}KN0;$0_IKm=iCr!v<+G|CPta&-CDMxTYnoup6JM}o(C#TZZRO|x zmVZ#8N||xz>UZFU#Ih3dBd}x16TpX@aJQ*W9qBj0^-E^*=Bb zsr*r-IO=zP#-?O?5YxB*fkH9pEe5pS08mu0fLMLMg;I@bxz+-IY2T0Tl}>@pomb?g zqh_ho5T5I?tHwC9$C_n=&7NmaXdHy3>b^!YECb?%UE#@6b8~Qw5u%sha*jVMz7uL1{VkX8=?Ci8hOd9qy(VmXTxcLbM#kH9dNea}{6!2!8)W=j z2W_Ri9bHS&0Lf0J(D(hgc-yu2W*&Uo2FGgc&rKh$-0>+$4jgy>9a?l&M;=<_Z(;Oy zGxGiV8$fHd-xRP9a)S~z9DM#@l0*76FK8_TwB_5fThD*%kZQu%h(RZ~S7th^_1zry#l{2ID*R{A5F zWMAe6ixyYn$I&lc|L;*-VnxyHb9mf-3M({jo!J0TSWYAJ79(jp^Ew0hIBfbj`$Rz_ zUv|s>toz6!WJm-!frGvNrW^iHzt6=A{+zdeE!f?yF0OiQpvs_rim$M1V~=-$K7vyj z?h@z9PYKk)&-eNDeanADe9QHheSy-irR@Cg>MsB1L~A8eXM0yCV^e2B9v&EaQ4be! zWfwyi(|>J=GZX$tg7!c2P5vvdn}v}5-<6gBF%#wgEh19P-pTf#_c_`A>kLLf;G>Ye z2ch;qb)T%9taO}Agv<4z!{r`L}2Euwx*uz8mpIp3P3taj<2ZxO+n62+S-@1e0io$_R^c_$@6=CyG;u_TPk&yr_4#+I=NSp zv$Xu=p)c$EnjO0Ny4sUpI__@$JM`4|{Wksh*7x;yZ?#XdjQ{J3C`JzkvARTmnpA$# zr?g*`0B zFzC8~IKLc5F%?iWrQY*jXAbS7@O~s(P4YooTVs zoFaZ;0v1ttUncA7*FxO_gd;5rHkJO#P-Ui17O6@2ixoD6X(|Yk_R4T??if||O7CuR z=$r2&(8rF7nsalD>a(pHtM{cn*VpmvF#7c&kAUuZ&k3+#N_*e54%R>L#4~I@_R$*o zh;@+q)0O=Y_wL}N^Y(fYrvI%X=gjr_5f-K?^yE`{(eap(L4WjczZ&MBSIQ!*oH44O zQ@TY~yL(4o=A6Lx3cDd^A^w;ba%^3Gjq>?KP?q<7vo|^WQ%lo>mU8(EC4pcSu{W(E zpsP-6#&@bKbyMLlMP8YjAiWGdth{C|PlQU+TXg0i?Zk$_BwA063`Xl~!OFdkqM-1S z^EDQW_24k6dTOUR z5Gut8;_>ep$La!+3l1TXoKzxK76nk+rDcM!&Xr?|4Y@(7u#W(quBo&oEsVi97~y{0 z_ZQYE;Q*Oba15q8=f;0JBQ*bZMl{%{7rO=DM!~i)dNQg`jZb3Ia+YT^Jz}a4g5_k? z8%iL|Mi-#86OS({?KCv_jU8FFe?d^!?(Q@&nIpH(Z@_mBj4DCPty}zs1n6|#j!jLR zT6dWy$dI|lM9{{hh+3MLYeHJ+Ny1~nG~>aAp6Eej)+CxL)3SIdgNbxWp(ZQM%6PV} zq5rhL)3VbaghQzM!2P2PR2@J*gYPnlN_#wHmX>AtVZ;}J`Nk{=<+V~CWtLuZ!&^0f ztILO2b5j_Cbq-MAFqmNbH3q~YX&%i4OGII*dvAvzriTrRs^Qu93NL!sJt)IzYp+hJ zfAr@?c0jG-dWqX)jb=7S^a^9N{eb9q$l=8>sRXhX3pH|rh z=Lr5cu@`JZIoYd`JYbAi#2#7gjF*^(m}HRHE2>^fpB*a7LR`Z%2hMO=6Hv!70c?nj zhO`nu#QjT@)s$`oVjkFV*>r=5rZNI5>NLDQ{15Rzt5t=4BcHRamqk-iy(tl-eYt{y zn85W!w+hK&;q^hN0c3P!^xcB6aJE6YKz=$2(Xm0PkZwU=ScZmrks3?bNNVZw*CbOM z5CGv2+vX=>wSh7ci3T2^C`xmQq78_8jrC%|N3hc$C16-a6cH9^k`m@!20TF21xSO& z9!Nt(JV5k(9fU?LADE_)xW5p34TPo=8Yt?78i?k;;eKRt=GYwA02vPmJwZD_lno6S zeKQ+yW-CxsG#dyF+ddFrtQIKBmJbjc1Hippn_UCYD0DD@QxTPYfWv{PZz*R^5`mJz zB*Vml@G%#_WPu;rsrIscLF<<`!3-+;p!;E%$5{CWZu4Cs>w{uYHBY^PGzJDE>EDqJ zz;R4%+o3UZpEe;3z;6WZ+dwsb<~}_=-JT;!-QGokYeF77@PhvMsE5D#$Px-cT98IK z(73VHno0gxfAXs_9lLHegAw>1Z(@Vv1c@fo{PK2`XX-*tAS_dq_SqX=9vksa@wnvK`mqt*>UxuhYI1ca3W#G(~P z@L~(j8p6{)8CVkOEp>WhDqU(q0np*zB)$Cd-}V% zdS5lENaHY!R?-;^m_v7wfze_*mN;5v{E~1?1-aE4vl2cdH=JvV@(@~$8j?LJ zTd3h9xS2LHH{e9$OK6lTbq~od@`%4u0cwXzx&bcI6CEhPqR0ZKG}BlJVChOKE=mn7 zCr;0iDzzhgvgm@Cq#siQyXVRr3XzeU)$OS{i9rRrEZ2h9H1|)0Q5JEe!xfslhB0CuN3{8k?^)q9)4Bgo{u&mhkMqfJ{f;C=2rJKv)BT7_}3u z+XWve`*W6w!k0s)AWS7$ml^e6tde%!qy=zh${$ z)y}OVXU8}wdd9t(_V_<}Zp~Jh^}E1X*( z#+!Pdhgvl94i|M0Tx4!Zwqp6(T|-k}8F<~cEo4J3Bff(lUrQh|T1%#IPJrPk`76KY zHur1@%oUt(`@nbJ+eUrx`vcz?`ZD;#Z^rq4&$~~@Hcs}nVc^BBVzek9$zR<}y6Gyt z+J3lAm$g~19e9#|)y{mb6-;6Q=gpg+@X4P)6TN4-ThD}srN{IRAS~UeV7#})xW0~$ z#y**0of8Dvsj4@{P5NG~uA+Nza7YL^TU;P5(-!Eb3^$(E0q6@0a#{c7I{|(S>P62O zMF=EvFGH<-FWIJIo?|LW(MpOffqK4q=EX*wa?8YIKu8{l>Ks&O79kfi?K^xSr!D(M z>@TZw>Fqi=FNK#7tre^z*p!CnJvB5O5*J0+6O-U2a8A8?#fC?aG}UJ_GO^`t9I%?s zu3+NI>u(ulRrl~Y)9G6CWX`jnM>ICdWi%*ZJhTq+CCUDZ?mCe&SFnhCRLtydo@0=@&T@XcTKhGZl)=Ib?K$bLqqkM;@UV-S(QF1+iKYsaYOAg za>>zU)5KVHTO%;5a+B`3<-B#uq@vT&c{DKwuUWC-KDe>c4z6G_v#>Nq%A$(dB?7fp zm|s&J2#c($Dlp1WX#s%!Jj%pYU)wt!AE7qKn=&%+9*H{5mP)jjo_Wp<``9LMGWt`U z+qZaYXX(AfP4~qfp%ZVle;$%v$?q9V!@iT9#g4hpy`>i$ z;!88_I&|!;`4|2-=NbYs&zvpQz%#s#KUb2RxUpNLH+t!^sG%0m$(q~k5weM+1WH|3 z>s5?)gSdhpqNh8T7npq9ZsA=Mkk_<&tEJ<6apUPzuWqoZcDXP7HQtPC!1XMCyv1Nz z%;#%EEgNM(JN!QFj_Vj7I`_={3mm^Stgk(60>&cv@+Xpw8-JPn*rc|8zwt)mCXfE6 zP?ddkI)QA2L6rob(ET*mQd8G$iFVt)Rn-G~7^fM|Tlez4%kqhix9v<}Psg`Mx1d36 zi(U=09m9rODJ9Wx;s>Um^sIHhkJpHhD@rAfgpHC-5qhFZ9MAWuhJvI0j(q@ur@qW! zay_)KVC1BVZ*mz(t_ZxyKmEMVfD0iA5$JXD(yGNTDN5 z%lt;l=mcJSq6QExy)ilr)eVB9GmUIa?F@C`>6}MCp@ z#a#O3Pjz<|Djp{xDCLU6B>zVzmH~tF@qlLva4}@V0xkw-IrNP5A|U{!X!g&q&p~xC zWg^fLrG;kz`KiAd;Md2Dkurgb-*_a*v*&<;kE*F2 zrP5BQ*vEe{0zcd4r31RLLKSI&`%QEr%V1oLx`ucLYWaIhBZ^$0h04`5W zXP^(3gY4pp2NWa^hd=x$U#gVD1lY^=%Q&es6DLKn9T{ZE7}&z4Eu^lnx{Fk8GY5K3 zV%2yDQIWKyXURQJi@0X!vfSeSLL%Dp;RYtlNZollQmSi)H{gK^{y)34<}0Lx1H}%M z?dh=p22U8PzO%BM+R>XCCany-3TyavWKp4aSa|QpvSrpOICQT5tds)4llwa3 ze}gB^F;A@Tjfk);kij95Y*PWEnsz&d($8=#E1K>8?;?Y&)!?u1+k7!8pFGQ^L&p$o z)IVoB!8>63yax6P<|dgL+DLiLiX9dRkL|jQ*1bZ`A+>*boSZ9e;)$qX`nH2_4V{^L zbX!(EY`K|2PO!OSppE&W<2!XB(6P;Lbg_s%(i8-f&~fHpU96V4H$8HWr0C`IC8 zmMs@P4WUoRN|TuOAG{dZC14vWjd-0id|7?YLhu zP_*HUR!~D3|Jf>q0tHozLLCYzo7B}=CQ>$4Wu}G!{*G?mS;jhp&3LxtkRg%p`oWZDr4WW(?=K^ldmDK1f$cDfz;ua12 zFkdR{6CyoZ z(=QCYu^OthOlL-8K40Rc>?{NE`(pPlKcF+4hXUzXeq-Z7N}cbUD^(lNDSAp`e@gK^ z3j@zg8W0l2G3zg+X|ta%@rJ;@pxKIJ4I|@N7&(3Q)3~1}ae~a&@z1Q+@oz?44&z9L z=WL6C$(7~TlMKPn6@ zQyH-vdJ6T=YL?D1;58bsN!vc|g2@tqQ;4^9SQuc|Y_r}!O#$g3tOCT|k%HG=kO?>s zVVA6}6O>&AWdMF2c?+or{GU}>yJ@r-rz1D3L=1XnX;)CYL8$Pxz_4l_5eJlFASwq& z&tX`tu|c)keh)o32UZZJSu{orAD{iHs1mjSZz%#%0BYhb*tJi;UC{N= z_vE&=UV8$Q2y0-l$aY(PcO$)xfaf5<)<23;RO42!XxcTF#fMve=r3xGLYB%tTD#p4 zcRh9z8#$zr&Es}aJ9fnT1MLiYUd2v-gIM_~x>(6eSMf!~>li!6s^Q`+C;KAPWtweg z^0vo^BRHF6H;yqmxl!fAzfT^BZEp7Mik+Ntx2AU_U|A?dS)4U-e>xaw5}Yz|IJ35X zw{S+6eeqMrdXK14WNmGh?i3}B$>-Gn59;13s*Y~k8in8x99D1w1b26W6B69r-Q6X) zTX1)GcL)~TH8{cD9l|Y=Z=bXGf9`+Y?!$dpjjF|JP_x#oImhUukKUs=TkUoSr?Hnk zX6;Npti*@n$6-ft@DVzhbTe4J5`2X|)ru~3FLk-j!D_%)@Q2f3i%GwOJpbkzETZo* z=s{;Diy^}_Hc8qCcf~OfVv-dscx+2se*|UdHqt~voUIfGcCac^8EWhhEh`j67ZD+V zt9mc!)ze`QlvHP_bQ?>k8ZBfC-2ASh;F@la_G!)~JS8ZunPi?8 z{axppD58qSnY)dObwIN97%XBl0n@ZNi3nN}O!PR7VNa1oTEYu?ww(rPypmwhHbZ$$ z*#-pf)j6Az)9iubMQvmLh}mAKTy=h5b)YQxIV`(@!|OuwMoUh0F97Rbn_3pT*+>Nq zlN)Sl)Fa?&kzZLkf!!huKcAgh@`YcHWD*n1L%~xP?9Tr-`GcY|SZrOWJ)k{52QjTs z?sDlO~Ps{{__KATsMJCN4GY zO}9ggI+CsadNOT*+IqIm>i8lTmfNR52odR*H}|_w?q*>Y{1d8ntpuyC;`oxs$>d8v$_!<88>9u%u!UheDh32q$zlN>HGYmCXf(CL(0kqh<8oC>8NHIJn- zDD>*xJxfYvPoP7Y<_|(eRoyE7f%G~qm-s#XBO86V0J&MPsH=-)3X#($!M?o4pJ~3J zmMTNH1AM_EVzE9qc(oIW>|SeS;rk1e|9fVjZm0}6PLz}^*N7w^AWnTGTjyKv(-8Ti z#ICU0sHP_9OE^fbmZKz3E+k`)IEs3;?vQ|DipZxA7dy9g+>EB6-iOPL>O|=bMi|@l zwy@4$vWJ?x9B(;Xh$od_t?jsk{rftnQ;)u9qv2N7U!(yvEJwJ zVcKCDbCSX@?;x~D?9$%R_y8^Bp=`*@6v6wgWl0UQG#g!;a8AlHwUM@INquj=bGdyK zfb_hvc%jp0*Y@u3WeDS$O^42a{(6O`W!miDT9VpNaYaN1rPpfQdOC<_)_IN^QR+4u z>!-ZdT-Evo0cG&i{*Li$-@A70&Jbrh$Ehflw|ZrP@5l?zP!Y19(ZM7#pGZJ{T62F+ zNkD@AQ7SeOUcJ7-1bli#4o|@WGk0P%{yR}BCbE2b*>T>z-6=!EsqKZ>rL|G@I?qa0 zpt6$@s#OAf;jYJgNtHJ5#W*7RA~wy9=h=cUUaj?}i$(W&gw@ga&B9b3y@GoLlD)F4T6$mb3_|@ntP>(0aa!^nE#Ky_J)!R{v z&C?&@<@=VI5zT>wO56{;k~fiLUz9xIn{+*?ygDC(Ijl`X!Yb8v$|Dl)Ev!lx9?;qu zXj3=yH`8=V7x?5QH$XM*WNH=Bh<8)A4K1ucv*n=>C#!tOfeb|5Bj?`5XeBSWck z{-BT*yc%Q2sCXTj_cre5Yp`c$@YdWDD_>%F-5H-RFS>b-?@JH6QQqUJ_Y|q~)DN{F8n}#(_=t zr5|bJq^5^)sj0PDR>D%8rInzH^&d#;f3ulR6)mG93l1)*xvF3s=RshUt()ZbEubiM zjwsIgB4w8J@6lc<9XQj-0f2z1Fw^}pdNG*A{Qg06+j&p7kA$S8SP?n6lxicrU|$g_ zSed%DXX9(rcvf9KTp&U+)SikJNq2<$L`!wm?7uyAZARBJu&F4jz7>9jZC&8!b1_rr zSlphjC&G^XqlGqz7YGlbzISftO>4Ir1Etzanx5(W$;xoFmtqcPKYR6Z8mp7c^k~Sq ze!L#K6tn)&Bi5%ObHfcwTx6?GGKuO7qr;x5!3^um#nWSyB?8fxpXf2p_NquY1owS0 zZ&i_CWdxz)>oZO+{W+x93H}q%tt7xuGk>u}59@)2W$+17bPcZN_~i3`N3SLfnzpQ4 zX{ApO5bvJM+Kx|o7uJ`Qs3=hqpn|s}|8RyqFR)DJkI0O@F=hF=&!!YzV1-J#e#nvr z>7R^p?E{G3Zg|b}sO`K4g(wNWI%y9jOm!V4EF`iz>8duOuS_7UPqaXvpkv!v>4=XpC}eRU~HEK(VtwR7RA50ZtNuYA1tK+Uh{8 zmI@;3QGGt$j*Os3hSEwfMi30&hNt7ZFu%OgCjx!j35;L4rD&_FY}G1&Z1*`DF}()e z%pI^mF4BQuaDiaXcP=8JyyL821<&FYsvN22P-!xm_JoL7qXWg-w3~Xn5Z+ul&?NLZ z{?xL!=HuGl*{^1CmX0EI3)B1*g^C}G5TafFYcPmqUeb-`e2IX^GiImdOH>37@DZ<6 zKXS3))q?&avVwlJ&f{!SYBM*9q9g(#`O$q7>6EMUY8KkOWs|93)%v_|A$q3du;!+e z6hfCu6Y=@=SzkW1XPM@@eTtfV(jcxEk0SkDm53a>M8})3CqhKTn_#z=*Z=z018aob zEM!uzuqJ_*VlVJBg&>w`N?)+|Dv9ks)~eX~|Jz!{J}Bn>x>5nlRXLKgHeX5yKK|uo z=k{$PjVa{I`Qzs`!7o>E5y=-1S}4=p4`i3&x- zk#3l(U+285)_|b!oK(JwMzj6BxjtMnFYOR_*e{4Q=8boCyw=h5tkoTDcQwUU){oaq zJG69_2=XxPdF19YwR^wZC1zCV&2YkRE0#IM%dvcc)92_pyg<^2?*W_G;(cY5y|B$R z$;56wx@XxL>)h($folikS`O`xI`q=RiOgDOj)fld=>BYMk0CAc(R}HJE5i8cgIqR8 z5JG7c%JYd~l2|^SL>PII+FBhAF1(j42HNAE8;Q(r!_xEk$4Zi8^1m$AjxJKYTpx98 zU4JGvA_sc>ocbNgna=Hbq0_;p_;`|dn1GRZ6Ec4eZuaAo!dCTdeE*j?TZY}lFKFQv zV~sfJ^&Z^0wRCG;dy#Wr-z86SFXr@hKEM6FVqv>2wn75qyr}2>aD3SXD&JoEnd5j* zfUpkU;+7mjuyF6Q%@<;+Z65ZB?GZprH*>rIU4jk$u<*w70!icOeK%g(=t(8G#W4*o z*?d>|_i3MG&Byi)>>nCWbf&wEp3U}9*~ZF;bN5=czGspYzlV$_)_k&gn>ChA%Gt4O zF$W9J2#0O*y^!(bw~eKldMA{ud*2>-J9&C#6njYpv7_jhsxQqZ#Rvm5>GCF*SZ1qpv zZbwoYRi^MR;2xQee~}cx^lPrczkTM%^!y<>MN#3eE<5{etlkoF&s|+JacbOinsdl2TVrS)tj> zbZN_POZMDvp9WJ-=a22Rt}4b;n>`Co^^S~wvsz_->FWo}bbfT_$JG5^XLyS!pm=hh z=A>jpU!;e(&=5A@30KMU@ma(nNOASTRpt63H4wVqBguO#HPEp;a3f_Wvnw~S|7p>= zm78O_SSWIIOoBt}mW8gy9agtN+X-UlA$(+B`KRBU7}14c*Y-5E4dO;_dc8DErIpK0 zBz}ALt>{aAg7o8Q$Ae;dW}_juYXN3qqcfpMS|6@J~zuiT#Flvuxeq??7 zKC)0Z4Ikw(sbapBH$ULR2@kub%fnUubYJ83(8KEVwblMn6< zjg?2%aW`tC_T3;noO&GEQTg0=_uce88Z^Dp+wEx+or4jiKQ7qMD2-!n4&qwOoo_Wr-!Z|VP2R+#hsUoE{?Sz&et z;NcGYbyssD+hZ(Zupft1bj$F*A95&Ju~y)bKpb&A{TM|%YOEi4EFz5 zYSYeEwUDbw28nbOrstyZK8>?R!p@To}VQad=U8w34SzQe@At9ky=fpTxX?T zWXWKa=SS)okN7YtyFq)o3kBaG_vV!4qtJfXcblywxURI%4mkTBB!oSe)YuY-JL zf&Du*jN{)ep8q%c93uxaC(D1_p<~Z4Q6D(Jt@3({q(NDPbFV={f@`j5x=#sogH5&P zYYGH^t7?5AL>WD*4RUugFjAa58G&7j5S+rwn;tO{_40U`9(I!6ZYY0wLCTh$@(f=h zT+{l!Z`gW$%x5>&sPMx}`Z__L@RoPw_q}(=Q{&6og*U}0@5^Y7j z%PEkKUuS^j$+U7B%bfSPiXuRo=Z+2KpzAgR$z>bpA>HbwciynqK-8BLohT=T_>sb6 z+}@-_AE8k6+xBJv2yGOV8GP3Z84m4OYtL=Qr$`5-O6`TYQ4$!!lGhK<}TVp zG&4QkFE0C;Q;svkJv}4ewzaQ9Nfq^kkbbxCB0&&nz?Eu(uWT5p;%9{W`@EkCvlXw#(Y+N*YlORRdcs2lGjV2!7UAo5WdnB)1;gO$q>fhozL+2@<)1 zpi>r0s2ZG55F}rMt~m4=91M$i3fmhp%Grv;Z1Gr~6tmu@J9YUWn#Qbs5#?(Rq||Xn zs7mvmX*H;xu#q=)|9~u`0O29^mGFT5CyV$O$nw5aoL&?H4?n zbSGI+&S&YLi8H2z)U%l{Fd~Uw_|Ml&Es=*a+g#U)!+XbYB& z9zV!61MHKwmS2?})PNmWoHp3Q*u58&%-d}YFoxM4d;Xii$ThG;wG1y3@~_?6X=0z# zS|LPt8UtIt+!?`T$@-k`Y!^bih7Ht~d*3UU$UpJl?B@WzfcX$~&*TAAb6}Vij$haX{s}S6N{V@u=*i)x)oQ={6_OBhc8H<`u?P;1@_A zy^W|vGy2w5tq6HWzPu|#afh1wEt{8NYGRwWbE}Q!ZmIXC)S&sr3fH*OE|e2n{#)wK zmW+iLuiKU?H#fOVn)y?{?^6%7vep#ii^{e3hA>oY`=Uf+K z>CRfDlo@8p;_dD|HxETAIz>REHg)=NO^Ba!s@^}}Y1)KdH+|L}*ogTY%G8Y9UNM#=uyRoAfMN7k&q7 z|Nb*@;&bu+r|=X8w=IRR1D)7TS!U==rJ>N`AIcjTKj!pmL2s=kBQZ%JbUwB0L9?l% zhb0iz?VI%tyvJQEn`Mo#*>=EWy*y*6HMoDrs|QDNIl+9!09Ye&Fxl~k%0>(IX`m9b z)-m|gPEY5Ez)o+4CO2m73P6$hD}63bCK5Gt6fJHO-Nx10RSQ)QIMWp+v1m~&#Ek&!MafZpq4Wx+)BQ6H>KXNWlhKNhYR~(!7fJB&TO4OPe z{{AdI+mb&}oQS$fg^YBti!^O~3u_T9DNV=&Q4MPfFDXN`+4wGn0&UFHjbQs^OzC8D zWoQMj0#Vw076GQ_VZLTr&>y!kQ#QvF(fUr;XGf<>W-<`FiemU!-C;k&r&kRjlQ4r` zl4fJZ?_~<&s?cw5wvOJO%jp~@OIBJ3nLn=e1?|k>iQ;VW8`UWPEh`=XX9RT%?93&&j9x zn`*aX4W#lC$zilntXfi_(X_I zY8CI}d8{?z;^A>UK0cX{lxO;&i`j0*V2A0;olnDsrkCW&AzX2TDC?z6&*`EdvpR?5 zPz}MX@~=qWQ;QdKpqUzLY47%ElL7k@g73bxQA~BoINd@PJC1MZcOvzQADs_jI{cu( z$t{^h$Ah!k!iud)EGF(V=>Bn%5~LQbH7hV&3p=$~2FXp!cN-Cy#l0tdg_CEuIc11% z(YIC2+N=a!Lq4Lkn^KgK?6zHBO)ww}E4c|U2({92 zKeMURKM=wcVPxVYE?K_SH4}BQNVCe4BOowJpn1tM+?45#c6|QcBSY|g6KepR@`o@I zroF_gS>h}CgA6b}Lt1P{spDzHz4|B)Uz{+wvvpm+CzJXVBC|$8q5^5Jd(+JW?e2@x z^-E<$Ck6sk%!VKWRcfSIf_t``{WLyWiXz=r&mU|LH)+b65u7kf#x!Z!T~ff%5?E#? zlIA6a#T3>sou%w8Eu&>_Ble&fIAYM?=g^6R%<)#*p)5(m=)oh1wo&?B5)j*Od{rz%Py$^1-0h1u$8yde4?@XCIhGK}4?mUgD&h1aCiFTaA z2G2KF?nMwI$md~Pbozx+Xa!3n+-GYYP0HBrt)oY*{fPQRceK&>D;5KCUurZd-~pGv zve3P*B}yd#ijxvWn&pOT`C9wf;_-Bz+7+6ai;<)6FF#Y zu#hO@etU8sF;47ba2^D;=pcbV5hp5ev26Lx6dK<74hKg-hRYT{YVc-KxO zrh&}7>u!eblM>>XQ|BMi{J zI=R=z%c98L8;x7d;PtsH&z*Uzj(5S2`yi)pB`u!LQrIft(8ShQG!O(({F%Wcp;Qc3 zqF(8!ZyQn|Wl_Fw)C+|crwPu1LK5&Gw3iK=nApH4F{(pV^2)T(G?NmpC3CPnCRKwq zKUQ;9hzvjM<-E(!{-`Ba0{f97{2Xjj_*ysfleieV8f>3}eyI)oW(loaKQ$F}-$1Y^ zBx#G!7dgmDCNeoi+3@fb;pCEmku}01u+Qu=jL68$UlP10NfIWeJjLMFvni3+t4X)M zV$hNVg*FqvlKSBQQhx%GKb4&bFkkF)k1&Z!>iu6MR~70;narmMnN5lh3y`%NWIYk8=C^p;-jG*g@O**iIR2?vDq)o1~=p#vG3l_as{X_2$agyX#j8-z=L#5p6 zaZX_a$0iFXThAf=0F!ve8=G4UFrjGId_gI7(7;enu`9^_m;tJTc-0qHXotTp97gH4 zx%K(9{gzd#LfIi(82`n%pnPfcmmUakx4~;`d_8OF{EXjM&vi?yOcp3!$Xh=eq+J_` z-NrtzZO@-#m&KpooP|Y{M?s{rl`i7LQruO~b~iSB$}sA*B*W1W3ewKEtkgL#O}4~O zNo(|WdTV{9ZoA+B74vfCh>fRsc5T|zu|HI8mDi!s$W>X*Bd+dk%MoXm{iFG0xPtwn z58B)fzjNdO?D)ta&ii*{oCJWga$NnnOEBK)f+1M5(Y<7*0xHc~w5)!J- zzm0TLc!W77>-OMtnMt`AX;&u#hlBn0N+Td8E z5tAw+m>0VDU(1|r5Md?WxAgSeAxf!&Gjj=%+cWuuta$t6Zf}{sTj?$YQJ(b=5s$0_ zahGV2sMw#dOZ89KRrX(DSMDnds#-*n8cKPoEbz~wOm2=IJ&Rla{wxND>8ms&SK^0U zC>!z1HYi>LD`X9MRiiP@_%o?#hm0Ikgw!6xc}-c^6rzd?Q&$UhQ+KjV#Q>LBjE|Nw-3TL@w50A z$S$%^b2wY(?w|ec@|zoLPbzMqR4V5fF1qE|>ERA8ej`ceMN zF#JMSs1q_0HwEzn!N$RSzmk>2dYOeqd4RXa>$s3z0!{jv%Pj+qAJ`Db9Tr0z&sH8*@g)(2L{`ev^)YuYoKe+y@9R#K|dyITd=V~qKCOCkr>1ZkpXu-xCYA_ zDd;P?1&0ggLiUf7af_@G>kvsAoYQCvi+1$*3kJvZ)&cl!6_|1OFR6rLFymk(o4{>E z8-U(r{E1hLqX(XaLrB4&Spi&(Lx{1tD2&y%`m6ECpn<3QiUg=>5c0x`Q5c3tXbW{b zT2_RoN7NV?AV~&MX@pB)ImbG74n&4-?(1Dpu9vl`=Uq?cC(`a^){?jZz5kUA*uPtI zZzR7r&1lRDqIqoEfg5k4>f_d&4wscd{?1%PvYssChlg&4#m6H3l}trEp}-50AKik+ zy@wE7vPw=V2-kKlu#*r>@(lUIi|g0GK0>j)vqT7%wN?@zb+4E2tMU;F)3UM_0+QZ_H6-8?W6XQC602RKlZA*OY^P$cUmhjW=4%%XL+zCkW|Xdz=%ns4eif znot86KY9{dyQRi}1Q}=lJo9E@GmqaC-iCI?K_Pr*c@IYIYw{JcC{z!OL?t;niZ(Qd zwavaIGSt;2N%i7s2F)L>P0$vD zNUO1jom&1-iSIqo34&b|0sW|`OdbqiBf#b(f}l^ZLP0O_F#Y- z_74yy@%hMdtvK>4R#7xp2Ag`A**B4*B;TKcgd8rVQA5Ts4P#`pA8Gaa-B8iaKVxuN z4+tuSoviR6tb8>0Goj3k?-R{z-T!7XUnhUSpe7Xci73-cEENpnk9W0EF+h?V-zqwI zA=?#v3yf0@FdbaNdiTe>dbc4YgZAj8VK6Urp0MBLIuye7Ik!xQXhgCqv(LP$@?i8| zF0`=F;YuG>?)b-lwM1rIppz-8wOHpMpQgS%kSQ|ZyNTuIS@5lN1krl8zl{Syls=i5bc1FS;bHx(QhX{{ zTOAPJUMfzxgm=5`x!QRfN0>Pw_ng^rJI5+e>2QPY(ny_GhvWdEofPd3DDPivS-aD| zv?^a5&dE3HYV?_e)g6uLgpxTO@1dvJ^jIq-~58*`=aWGA_#1ns#1?>^i7Ie0w@ z+S@cG2n{K81<~#zQe+h(Qs7BnqF4sWY$14k78yRXr|AyBw?`#=#tVnvAU712_$W?d zc2>()Lh&(zq$DnuE5``&GLi;KKA(r@pMS>O;J`I1#CXnvJbBJCzHk8?i1beL2=@ao zLa9p`VV+Uu248z4-GAI>iE2r>TC$--x&Jc+9KFd#U<_px89P3;KV1>3yIoR@`|eB$n3nz- znoDjv3{gvpbHFr@VBa(kntqVXjG;qrT*CIQia+khZNah!N-WI2@xi7q;1V@VM@bQT zL(&_;bl2gLCX2;(m(x54hNAdVmng5V;tG0?Xx_d{o&zVUkOh67@mdSEv|S>E$X(Z9 zzO-H0Mg>W9&C&6i%w1ICjNKTlN^O@Y)vpPLWW*y)&nTrOA8l ziw^x~mps3$KA!R*d!AN;CLUY~j4!Jc;Y+QYmR;;o^u=5&l^*CKahH~VHsI3-e#D2H zYg&xTBJs_?9NMlWSrSoxyT+?;KOxV3Sp2pfd-B?$ZRs@qQDgp-P2RcMxEo|EzR$zG zLjP>m27KHS-OKd3HTTVL$RcG6>hR@u#2K-gRPTzh-xO7m#$FleT6Y6F#iH=MIE)LZ`QAf)SF9+2cfX#sm$=3>XMcUQ0q{rx0FVCoYKsHwS^gU$g_w|&4Ft7007oG~=cV(#T0bgyeGeBoV^Tr>7xEmNwXT0qw`_-9hxJC_(|B?nwcoN#$(b+I&Qb=WP`;+XnsAAqM zj+^i+dXy*m6(hC{3XISp@tO7v?vz>lTLT!GDVnh#!M8e?g5nSCN6mlOJqjl$R(7eG zTxrWY@62ST0KgYu)%^qbQpB6+4&wfIhuePxzV0i=T~r}Kj1|`h3z6Q?apO6i2tB{o z^Y4=BKr1^wlH7KxeACV5rP7E|H*y9boB}1s0OWM;$^Nl)J-uBihoj{XKBp5y>S}v( zCZ`i&Lhjp|S)pC2I_DF+8U?Ofxl+fI{JDu{bWGrQso1_SX`vY%A2@#e*D<$qPE^tvl>b;dHI2i`j=?R?N_Z6L zW>0>w&=d$sa4(pd2r%Y{=YR(9V+w+rFm&%Qela|s$ z`i$k6`vasE@>puZ&cbWAgS=(-x@E%l+XVifOSrRil{FJ^Rbk@!-T}20#Lyx%k-@;-w^Vk%{pnQV~r`1Fz)XT842JLfvy3&}C zEWvmEVgOb8T-&Znyc7D`VK-If29RIk1aCw$<1pykk<&xo)@#jzOZ>de(1 zAwHVOh?R2b>d!L|kViUpwcmJC5a5?O2whY{J`vsU>njeQ;x%MyyyA5@Zd0+_n@HDk zH^DIjQ@6k|UW6o(x=9;Y7X;r3T~Rn?keft_)?w;KCkenx&W&V_zplwm%K_%U(u>;PCJuSEy2@Yw zgfl<_0|7E@_6(z2VUAWY-ypXTC;1u1mhHWd*><`D8jomGTj>+=taM_kXGpxjPb}US z+$a@kM>_+7ZpXsZSeLoS5xgF6%z~CSrdnM!Ca6fymR36rEFIdhAD$F8rXQK5G?>&L zX!Ce!r3n&1(k9axjbUGMtTp9}zL>gYos+Pu?@1!>E>5TsRCb=nw40D>?EQG)XwQ89 zT|WQO;af9JXWk)r-)Gh*BXQyt9IL!xE@P2AiL ztZ)zKv$=*pZ8eM8eK7Q#iDYC9rh0*C#7EOGj))6nf2E;jqNl8?Uj(079qT{wFuYxj9EO z3zu{C9Aa<#QU5=?s4M=hi+by^=&LkAJB`X`8Nyb=wxbHKxjyrh6d@xuuH6Euz>ZeO z4`ORbg|#9vfzv~MAW5~|H6Q#GSo1Kt^1;dBoKhy6&+2ui5eR2CHq4?-0BUnvCqEy$ z&e@QZXDF#|g=SSiD~eh<4JuVgFdbIiQT^_i6H$DqE4lKvNXCIv9++$gy?-KS!j9>B zxM;nWMzHlKoj-e5G;qfyfsi&H0`)iTaiS{VY!?xp_}LV zLH&p4Z}^wz-&?A#avMmUEV&&{*6?AzSS*9E%;a}R_afqpyUS%$YTgG*)QG2D`ZV@PY%vvTp;o8Js z1{qv1v3o$bSelFb&UxTqGNNabW>-^w{OSQ8J>JQ?Kk=BO*@WTx0%@s^OL-rAS1ihL z#4|8NBB0TSf^<;h!!O;J>CAGz$^!Sa>0q$nX{Us&}yV0=`&@OZR%dSiN$e- z!@`rO^wEX{iO2+kyW3U_5Y)Vf%-Ih4#LFhmcvV$GP@-{_!y=4~dICF*8^S#SUzmfy z5agXhrh`xIf6~a(u!SnL36C6Jz#Cev2WcIWC5%9TE^<~I8or>Qh(VGh71unk7dpp~ z5hGj=tZrh`tS`OxaTG+BH=n6oJ^^%P30xqksRIzgWG4WZ$-}qS6O=X$LMa)jTNA0A zup3%RZs;iX)XW9ZAm@%Lxfmf@59 ze*E8D@jp)C76i|9FwZ_<&03H|ml znU3rJbilff1s! zwHKu4Xgl@fh{j)$lX;2NaQY!5W4kbueR8n&zfl`}8X&S)saU9^(2|_Q*=dJBOTZNZuqaip=I^Utid=%bT#JC&zt#WV z7XuTSF)4{v$jn4wHOPink*8NDwCoAR&%9ag#vf%?P4o^}X3G-Pi==;x7M+(MC#Fgc zxWE68`TwW2N=C8D!Znq@U7#Zh{%%X?ZED%ClqgmCOIVD|on^KWY}D7X@Rv|ogRu~c z*Rrq`#d{cv{13S7Z~8E>9lJx7IC&GU}~32`t2Fu)xr$Kny#F zf933FmFbXN>_n=|j81l!us>A^*fTCrnDts7%}Ik9xRXYhEPj)*eT znIkVtvRDn*mGH8;ur=t&Tba;(-Ga$$35PY<+wYt{Rl^?9y^9ar6dy+&LI*0@BsUI*vsXt%+eh&ZMt-G z#!$U=k3H*;_SO9jGSCNr!uSc?Vq4E{9JTKI0?i)W-YDka8J$TonL|)u(VUZCaP|+1 z`1wMQ9&-(Z|Iyf4W)?3NjPP)6q)o$ zsLXD&(LFev@?T`apeEAU(Db_B8i#F2pDnV&x;9MwwzkDaXgo1Fy}h-1r!ataYhO?m zj+-IAZD_f~?)pqanQqBLd~!&-vj3%pHwc0M=w5*b%60)0F4%y5F`$-eH;h+{c9WW> zbg4A|T6yBgBXv!Aepa{9Km*jd;A%R2+ETXKzFb&!cJN$XHGh4Ubh(Vge%H*L7B=FX#j@9ii%9^X-eh^9q*d>9d-)tc!-qhzFKbi+9`=@Dr+vx!GK3f147 zAvNn93mzS6NG$Cp#7!m)k2o6cZI2N0LcKxe?FS$66yTha?eH zoH^*A(m-k;p6VEYouU6_LQSbb#B76X3GD_29nwl(wT9L=)foIfgsr9`C#S~=y_!D1bTPA7WeZoady9^xb7D7?yGjrs+Q+GXUiyz`3yhSp3E&S$qvvdE8L#P_ND@a*h_0(eHX@a(E zqwE}f=_oQ8sZg63THy$DjOh|2)n_w)wk~G%-D`JiSpKKCYXk4MhT%vpY1S*U1g!$? zV}su}4@dX&xg8l9D_obqE#T!2kJ|Ft7Q-S5TMmzCCEPjV-MWvqeWh3I9>#u_dm4J# zISp61Tcld%%%Y0bIW_DBub0nxW35f~b&dRFM>JlI31Gm7SJedvmmn{|CZkbnD3X5* z0T)@E=IaAJ{mn0XAjdH3fp0qtPD}=sBdFU!H>C?{dbwRP&2S@WHdrFffyhl3;ek3s9uFK*qKWuWoJ>^*84? zP_*v~0Jwg70myNyMS>o-to?Dsh`Pvzz5)Vpr2p>%aIf3ohc-hURFD6Lx3C?IT0&@x zV;LQE)W2=nm*6VRA^Rc!Qzwc{iV=XfP@K!T)VecTQ06@3Ox=K?Aad-f9>n~nE zm^C^?ocoy;m)*hvJEK>@ngoFB0V-pjAvM9zIsu1ONmYw0l!VNOb#@JfX{lm#b3|U^ z0FOJVNizOW%GEbtqjG5fwik;4bFwaYc>C)(FGmx(_`vVc*<-`*a(c?>6QrR#ESQZw{Cm;6!)(}`2AEuK2T=W=Gg7HDZWKe=dX z_{(P7S%o$jS+Ubg|3{~O?OJPI7)inIe0xw$r^bvBUU{JE4YRhB4nt&Gx8jbIkcfx$ zp255s^Es70chb9zR33}0c_E*cnrz3XYvxUCur+~xFBXYH;1%XZT~-uzvT2CZWHW$@ z5IP9Zc)`DJFGPb+)DFXiC9vsCk0E0fN@kny&MQwBtTzmYG$uF&bf%B>q9WQzz}&_L z?xibx1m&5C_^{=hK~ZS%O_p>!(B>)rq|COcb7QXnC6@2=^Y@uZ2Eh}Xm~+LUh}0GM zAmJ z0Nf{#?8L=~5O_fabGZK%#2KY1#33zHV#Pdi`wTr_d*4THt+wD3IoreE)z6QLrvEv5 zHLK4)2R996m+}`w|pZL4&>H;4d0gEWS;TG8khmewUnuURuJW} zkEz*^Ejs`MPP2?g5frx$(h)dv{Om&qAY3=Z;l^d?I)+9x-G0m9BuCuT)w3S>(LtU3 z93*zVJ!+ME;We}w{I+fK<@#uo<7_;XLG4XVgt?g@>ee?{uIHBT&mzw{oTedBe!J)yToaBvnc?!jRC;6fl9@bkm$HzG4Y`{ zdFw`{GQ%nYY5`+6X_j%tCn{l$@NDzP$yLzGyg;n9rTrgDFEvH~ru1^pN3|Y1y>>Aa z^tkZ6Zs>enOQ$u>v^U~_u1=++)S|aK+4B*|BLI5oRB{-tpdTXVowLuIw$vbV{_k&2 z`M*YWo%T^WUc|9~Xo?*aE^SGcs6$GR6It}(RKLbcpQ*12lzQ|{&5rFJIh+vJk2Tz@ zt8q_QXE6b80nQK(mnEWRB=&0?>AyC0%096v4a&>_GT^I-M)pxNJ zzk*N=gVPd!=aho`;Mx}TX0ae@XZz+IMy)OzqFON8VN2mATLdanHI?&!gKdT>KR4P; z7Cb_uwT^qbU2sqT^s(KOesLn}bQWA{Cum~lnZ)nsT^e%xfq!Zh<6`c6qo;lZ{_aOe zE%}m;+cjZ^&4daT@a|DjwY;2E&$5 zY>VQZCp4xJKS+}^k&GSD1$DH$I39o0omEy3U|F+X3$b5I_K%8fmv(%?NAF={EJ44~ z&E5=ZU=T^=oPP5FC>R#fb~Z5jGOyN8)WblyIphhe)vx3)@DRh!ZTrjVoSU>5bz!NZ(@GTz+w*i8jT zx$+j+x5I~wZm^j{yQK%24-4Dpe%UJ3n|*=###w`7)?73=Dz($a$B4l0f1w1-Tov2H zoREVazL>^>qIUr@608mIg$xyo#I3)~fJ~Tw70877cV08$mDfzT#n^DiGAW03Js zG=!>%o`B*O+XL-?73&#sEP9)$CSQy7EkviC%wrWv4 z#x2hNki`b|p){-I6ARyRWhq+gfCfsHKfo~gO(XVMX=ch{g&wy&A#KfzEEF$PZ59V& z#sXPz@xnKHO9pa%JV4Bb0}!+Mr(_Q|5>_)%^fk0~!B&1`nOgq)OmsjQsA!1?p(w3h zfMv+~AgMW(?v*Mw8}l!!SRjxEkDLKn@EO@9P#YQlfW7!8DNiU3!42ybb`0d1TmL(G zwMZS=EmVDbbcesq|9b#H1OxyRCX?NP{{#SgMKI_DizlfOQNA60_4uCKRwPl?}BU$=3$j&XZDYZ|G`(sPFIFlV#p?q6DD%2h~v`cawB7VdiBS>p2DU!UJr> z$v2%O=vTsZu;3zcy=~12=xYzHM0HfOBzG?755$Y+@_ZZD<%UfnupB*87^TfSyCjCFuy<>bO>-H@i+qT)UZQDl2?670ocE`5ubZpy6 z$4 z+Pf;pYfFAr? z?-&vHRWVJo3)FZ<*#QWU#Txa!epL=2!%^t&zv6UfdOJsDh9xvnNDz8bZBdaLAee18 z86|d%BzR(K&87A!gVA4F5F49hlXGGdNQD2%hfCZ|aZkyl-*ZjyXGxS5O>=l9R^RMa zMQaiKPOn)?)lc_NTD=^%uZ@@^!Re*2Q(bkm4t4Z7epbBIdc?l1!bf#jB2vXcp=0xl zrL$&`kt%pJvqJ3r>PO)_4$;?5gvg~-9{uS=cN`zK*{6ODE$1r`GFm>rkTN?RLwrXT zDk7Xf$Da@py|r07LitRUM=l8#aBskJR(8k+$XX$wwE0X;K-VfAbaKqRBseOl3r8Ytn$hB$?z3mXz7 zkT-|*2coR}Q#tnp(^dsdlLmUqOFKUfqp2+ORdr=v1uL^S%NoPnZq6H(XIDzQ$L1&B#5CtRuA^;5_G=c8qD+3mT7yeZu4|8*dRngjj*c=?% zlEXFYE2nR9m^Hsf0Pw&RE9O)*fI_Z>s(fMn`r*H?ekIO)oTl-%JvC_(*=B7$Tac1o zH#`kG=5$VYf=&YbbX&K;8ktkS;#}Aq{`(DKr%Z0*7fxqkCWq6YBpTAtED0)%=iFKs zu1Jb<8JX#v6_q6d*nb`wSc9z_Dzp5^%8GCvaw&-xcjc9k`LkETDrkY(Kb+fO(@goS z(~ek>Fqn|cQg{XK{qn%t2aw7ALJI+2zpU|~$|jv3#zxgp@i+jRvy>C+Jt>sszvVQt z9&%78ar9Tiqlulvqo^OEr4DE)-vU+{BMm76#e^aZzSEl5jpWLxscX2)R?Mn@1T$Wm0oYGg&f| zTF(q96`Vv&>IEf3x+p`ZyGZMixBpNYDcM#!nzo`jecd6I`%|6bNhB+~$|!X205CZ% zp=DK^Qpq+d%OaC>W}LP}=P}q7)~6CF@la1SI)~|iOxwa4S$cgiDtf!;coniszn2Bq zGv|Zn6wA*+sZd%5m7%({O#@S(hzaDpn z9V@rpODuy3;ib1wy9Oj^t%)&i*VK1{cGiXFe#hyGw&X~a{LtkN1>Bv=P7Zbiy{(4u z=O4_Ose6ZcggHlw9nWTl-K`kA(RCI}vqY{tqQ;$J^w~y?`AICSclQ2KoNZF1IL699 z!=%^MJMYQs;Uq*vjTc~Z`vO(_B|3wlh$F%+ z!jAnyw5usuMVXM{k@07dW+na_Hf_iPaP~IHAh8IuO{WP3Zz(EZZ?7Fzi=)k{QM`sjE>uB#&;oc`S|FF+Rw+u*u5y1b=K9{OO zae-A68z)HUN4v=Wz3Lu=hZL`JT|cA3vbb=?JkKn-Z<`IiwOB^RHI!!Go?oE21GQuT z5JvJDk!0^vBcuKvhy%s0t}Xsh+8i~>Cgl+hC^*lBHD>dwB1}yo`Si_?J!rfuv!c1ErqOxcJJS!QM0)U+6BHzUo z@r_W*?*A1zU>`T0GmhZf_Vb1={?EXH_D|sOi%nDW=AXdV)CLSS`!tU(gFVoW==ZdU z7%O$+JhH~Z*J|RiM02_BGlDDgM8f4WSp|J%_p4}R+x6MC*m=_^7enIeRIbd-eele) z&0aT@x9hcD_i_F~yQ!#hH#HV7N$TkITnG@Ya5eDjj5UTwEL%GRLoB&%pzW zTDwxi?^~f(iWF@{TU^*4$w?^PozxRAq8JBPon>?6&(zFQ!gMX^ic;$0;vF^aCiZKCkR!-DYsx*cKCkOqDE-D#}Qoa-Px5?dR9H{aF zK9{Pj&m^fu9t=RL@MT$|mE^fBAooDce8xBVAGRnR_rK%M{~KAfGEMXu?jSe}&_-!Eun zdu-K;!#2V{<9vH;s|Pgs1S4hf=Tc?R}>T`cphn3{%xMUjhCUF#U1RX&|b__l86aA0ju7>-CEi9GjrktW=sellzdY65!qcCx=Fc@mv zJCc#(Yx&l>1R4shD&r5_+UA!NKj8p7qUUK5VzRB{m#&^Svm|N6?1`K5t0R71{R!

q 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%0A$X-Cf&n`|Tgnb<%qKGH_tymlwx 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%0A$7SG5)$%%#|nlTo@|bB*>`+|>9&GZe*kK_jIl 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

JHB;uHFtztxy<+lnnB{>umE;dM}m!&Ew%B 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

!y5~pE@#s=H)p5Oud3$fCv_PFlhU=vN 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%0Dptb)?| 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∾N7@!bx2062_DENe&Bov-*VHm#tsQ5%I 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¬Zes>FSmD_> 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

2;!y{gGz zR)bj|Q`0uG3ZKJcH~9T%FJ7(E7iTc5e-2S$RgW$J~(W3*z4U0I_h% z1nuv@cg;$rT+ZR|HS#F}Nha7dluL7;@cr{Y>XSJY+6hz^IY#Tp&r=wY%0k1aY#mN2 z-&UUT%@%)tDscTA8l(P{=)E|S?BXz^1)wPwtDl%q`y+hb(H9d*Y3q0(wLfZ#W`M*} zmXLyhHUDHG&sU*uJaT4J`sFHpbLUz0CrI(JCj{|ux3Y+-tcM6_R&FF(s(Juk30Efn z8=}t*IlV|@V<>T;I-j^+nj@-cg*u!$ElkD48Mag`^Xj)4-#?P%lS`2>C!FA56kwmB zPX2sNrjY3b=mqy*=*aoHBndc%D%$2b!H1aTZbU3qbj971$#8d+$$lT;y4YYaFU^v5 z*H3axs%YEC#~@E`OufdDk7KwS)UlO(vfdfY+xMjtO@Ka-^8EpBi6HaK0;fs5t<^Pg zsf4L<$+v3JNX?UrIhMH0FBDurH2c|H(eJaTM~<@n(27T6EJ35cHW#z)!jrO4B6zc_ zRGUPq@X(2?tk@wO4-`+L3p5TV6)F2a8nrt`ELJWnY%l2@I{zKxfOjdEr*dmYsC`~u zWx>ZCo=VuajnG$`)-v937rZAZe2$^IJWz%x8@m-(VE$I=@fGH8?Nd4sda4xP_&evV z?LH^GF*TGYCiUG-t5S#l9GCXr+T*`Q$fE3@hLhh{^pYO=J=gBrVvtS#CT5~m8r=W1 zT|r>vYqFn|F(z}Ct?RLO*Tz2HA|{WSXk>3x%>`kMO+a$SVHeXMj(JkQV=&0I9j(j}lsN zvWo7lsgpR^ls6AyoEbKEb;0^0m4(w?-NjkRR@1VwdbfU_dgCIV6x6A*>3dC~ylyVO zuu_Qsbta}bkjk#?EOmObmh|^F0e`n_eQ|uJzF)THerAWJ(<}Gq{Ra7T>eRu$?LEem z6tD1P{Av&wKBcZW>jUQ>)cC}1g)s#0Y8jF9>e@hk_b2Gml_KMs_WImfUG3Yyv#uXF znVGyWiOX{FOy>;b#}e`&=en4ih#SSWO{RGR+WaS}NM@KNTxAYizm~n3;u;lZ9!{DB z{8Hb#99o>wY&5^L8J{*)l!|&5{ao1SsP?%uMz6QRFtQ#xL!Gp%(19FMzF0Z_n2_#$ zg?D4+?QRIu=RU1c&D<{T+r^9L+3x#^*J~wp6I4!OO%$W0zhilQYjuj-lfTg16LR?s z`A?yTNWan>67%^^7*P2^@3xOqty?KQJ3h}yW(@zq;%qZntYS6h)JJ;1U1Ja*!>#NN zn|H=%&7AA+IIhUer`};G~S2k1Dw3W_z zP;G6z<#D~{aL%-f*O~B=%8I{%fr09wDfSsN^W&~*Nltd7Hs3~VAe{IR`*QbhB@{4Yc zvEW$Qd~Usxn} zSc`^k^c+RPj%Mm;?juN2wg4?iAskte_Y2<>m3RTK+(Dcs(tS>FtXnBbPu_y5NYr`m z`*tVHRlL&OhAA`CEVd6B6=x;ZZ<7u3j=6LMDk%B_bs2*&yai_>q8ixz`air(`OKZ2 zghx+>1|IDd3UT}CW1l$%O|5m4@ytelvA#JqG8e(?c1~v`Jd_C+A;kw}vk$?trpE?E z9ZNT2HJqw}uVA zbyW!u_a)T!OlyoPIGLwC@PoBcQD?xRF~9U7yKr|Y85o^x27

`n)R(n}qG!k{=arRwndMGiY3g9L z;eMxsG6R~7@u&8$@i)6rDW^UZH1Tk5&!+#eFw-ypx-$$ZS|c+ZU2cj*9c)Tc zKnPL3%w?q>RhCm9O_$5-J?oI?D)@nvYSfWCczJ-!aJ3Wdf7ZJmm{wNl>`BZh-|zD+ zci4^(HpR={Uc)6cXDTRL(XadVyC1dli0`)`NqwfpBJ2GZAp%AoH@&m3P+Xqjzs_|} z{c!9>Wo>CcctaD+BOur8bX&l5RX?w?A~TGPnc;l`D(Un3%EAt|SUSx@ymfWq7ErSF zL*7P|zrAG3OjzC6PRuc$I42M7TEd4zo#dU1!eKXYFYd;c`8uC ziAIuyiMjZpWdGt@i}ju2baKw-OzS$1 zAp6uS$KNlzd7_U6+J+rJ8jKp%*tHGUJ$d`K0--sDq7p?M-W&0Pflm{q&9IM=hY7LR zXl(r_NHM8-$Bk^CO`24{a@mUeQ)vwReR=Tdj<4UT9g*fvfTziUBCC~akjVZI8 zrY_x(rwd2lMKV!_MzewGM~31jrv!rWk@WtgPmv=EVd3_6_D%0I3uf3}6^Bvp zb7xP_$^zYgbjd3;e84NNf9h%;uk~UukM^)lHI%?IfVUcCpP@mG$tL25>Wi05@rnT^ z4W}(@8}Buy?Gv0=`VpSQNMOLwJ2Z^@I&&;}t%Ml4D7p?u(a;%lPd+Jd$Bm9D)I3BD zZA~;(_?Lq11j_U=`{{?FATnAy9&Q^RB?YC5QN{>7BA5O|1v=HSVPLIEDH)Hr{#Oe> zhGP4jaGPQo-a$Hi372E4L18{l>35C!gxHXp4V32XcETd~_5M1%94}7k z^MO90HKiluloa)MTcU$+{IubLTM50%RvOC8C7l!dC52Ik8k6~^yk9W+btW#mkX}eI zK|i)k(#L9E&~`!I*Frrtu8NOb31w|#Vc5Jy(+V!uMsNe`(8NH?iXSCBw&`&^_d;%) z3^eqcsx+g&-8fe}6^gwc$dn+XBayuA_hQ_(bj8o?uOyFmfv7Nf1hq;p8`EA7<3Kr& z@>_Yy7S6S3z=?y{mHj@u;j@=G5thks;D$jY#};xNX3O7dbRKXHxbU#+A?Da}5gwe8 zHl>C51w@5O+N?F^G&B_n^V{glJW&y<;14`W`tk$v1LG11^4NBcoM%TtJt zVPp`fUa2mn?tY4#!NoKU8&0VKm8tuHOvr|E|c-tN^H>xfy>e8f38!i&(Ya;W~A4})Tq#Bx7pj_(Ly zR5E(cPQi$sO~6^|I0C(v0`txCZP?asO7#qoiMvbk z12g<4Bli7$!y-m?Ze(SCjS-7`Gm{jvllgYBDRAUg$pPIRh=BcJmY$Uu{ z+!7a5ps+tIYx3a*J-Nt&0h^$R_WNwP-MXwZj+cV!U^Agq%~J1+w;FCAv?r21px`eN zNGt1;`O>+VG3pcSoy}|_#(o-Z`bNI^rW4YHF{p=yN`p~7LYYN=)NNiV!tU|~WgK|W zd9B#{>>|SxlA)qcW9=ttE2*LxN0h4I$s|f=p4NGIc$IJL@kWcd&vM=nL2>KDsl`xP zXZBd_7RQWIY;I55moWTd_RDMntlhht^G^i?TxX6t=qW1!DPF4e8Sg%~7w^m{&6h`t zRaRTo@BFsB_{L$=UevD??)V9TiGUgC^Q}f{HnP7*hR-uQA3ZndGz0sKGkecr62-{n zZbT6th^@-4efO9SvVtyuLlddJbP^=_t5aoF>!}ygRttaGpy1*fQ8r&CLUXjOX10D0 zTKP5`+}tcA^srtJp(aQC@xfHVJgiR8=5EL>!h6f$x8D6x1j{UzX)~C=#!2T!H8(yD zvT$px(JnfT^A~m!b_@}RbiVS?0yZrzY9(yzX}$V(ZV&^_O@7kC?6-{EqO0Wo^rg%A z#UjY(5PZdgxsaFmK(k#KOm%P(jQKwp`^wllf^NxcW{8;?VrFJ$W@e_CnIUH8n3{t)_w*=PDoEht(vO8WA0s6=+-i2aiNOliP#b1SW(1Ny2W&5 zDl%Tu3fg0tIog}PF;r?%Z8l1lP4rUAr+^^gy5jK_GbdM&(<`_NQ62U-;+|L9@k3fl z^iWAa2ek49Qd>`UTCfsMwk)A&X~}TbtK_<3n0uMfqPd+>941AR7OZOQ;wf@gWw23Y zHc6EBMUxVoY7Fvx6$#4s%1pfr;ulI>E1aNG#2ax!KcHSkg5D~gc`|Kg0rZnGRVb;DcS zm&MotPFCz*nB=+8H2S>2v^8$@{9BJ15;PY@@?^J54vR|ym6m-1&6bXwS0Fa-p~`e7 z*cYf6nfX}S5O+iAwOB;rQFvqF-Fd6YjG$1rMBX`!x0LP;Z@>hOOJx+1upp`aD=G$N zyQvBrX#{F}!*;G98jdEVZBRC)8d7f2P9ehRcWJ0O{QgUdh#sk_emZz_YXsa{I|`o4 zF?71)3q|(klBp!MTv?b1yI<1?xsgBDkr;a?wWUH%&i5&9PKx39r2+;XG>K*=x!v>B z{pg%ZyfQ*{X?Bf&UUEprVbSJsh{J2GMqO3h7PDXmZaHbb2dRt_Gy4ZTq)pykuOl-# zbvi`t!`iq9>=x`6GJP5`8NAQNsP7E#e|zM9TJ&z^U5rXd{aDYTYRcdmou1?Yni;oSLK3tRnrIK9s z8)MnvXZPDdeLr`{IZxMi{j8DGXU}uB_llZqr6J4XuIbHpbQDb|($U*wxpro!?+%?P0{Za3MVpY8od53dP3PJ!>fT>+o{8=&$HBO?&z@B5Q> zz06PqEyB8cRFH-b-Tuqn{R7w4!nI)FwIKDC-2Haob>E!W!kbgn_R*m~c^-z0}TkyR+=8@|}QfkiYt~leWvH5aDdf&gQaj{@DB#DD_5&d0D@( zpXws?@!35tZQEL>&ob4JFr*qefDC%+~(W|uY34Xmx04!xoqAAC4oL^@OPEU zj+C8);G{LW^*>rXtVUDtS`gY{G#DnVv^YuZNs<8s%3~XLK=1lyq`9>PX6|m=}tt z-!I!)WO?>t_VINp->q$@B{3x* zI>%VqfhW0so)K-wu-Kr-i^*kris>)fwBT78?R1hyEBNWMvF>s8JMp!3_L6X`RiGCJ z+a+e2R>g9L*}G%OV{G08 z@nXY28#B5}`HxYK1EFmao7NeT4fj8Wi;&S-s!vI}GL~^*Y>8vBTgfGto47{{UZBl1 z{H>kepC5MGcN`s`L`{fwdp9G=XJdcBd+WyM9$FAlA4Ygnu90>j!d7$4KGo46C6)49 zxIb0k0?WyG@8(3YDB8K3fjG4s5`H%J3z??s!*+hu8FsaJ5@zC#YpR5J4!Hu!xwAA? zH4pS_qz9x~6AO`69u)$1*Xe1*`h$pj(T9;3vf8z3F0D@`Hbtp}O)9ny4{l(7HS=hC zk8Er;nBjte2B3Io5Ykm?@F@j~icz_y&1qi&5B@v@W>%ShTQaF6uuyUqs|q zbm*jYbf5z+5rmpS7+6hRSWtP%&DGAx=6;9hkF*Rl|9!;?Y)|HL{>(!5BUi-Q5|GiC z;lc|(%j4rmVc+1RY89iDNfalbOkO1Oi75t%x4(ip8q;w6;A*X@d1hpE&qe(^=VePh zccG(LhoZY&heE&xYeF$wf;BsmeN6sOQu7fF2yJZ~d%|T_CWYz-CwZQt<6B-1#BBPv zif zG7=!=bp&9|2$p?Ph2lwft)97R>Kq*fUoW)|-;KaT^3k#;)k&>V)>M1>MoWL38thP6 z0&0|kYcavExUd}iHVm|4&7IEWLt;|NW6?dOKPHE|f4mQM@o8Hailn+BGi$BLiQH2o z^_HN&_1%qXDvdX$eTpuKgFreef1*E6}~qP?e_VGMI2DSk;PYR6NH}>F5CU z8zzmhHdRNW20|nB6fcd0SYvUUp5>(@I=o=s6C0sB;S`4ETt}mY9y;*GmpkIC6h|#goMYGm7-+Lt?o?H z6kI|y+sg_MSEWO9+$3ErITF+%Eop&nBq5ndNjm+)6T>_@{5Yl)8%0K?DlJ;KE?urQ z{_=Gqj%$;j>>xC!6kPb|AWHI`rFAN<=Wm=<37??)rm?0S&u`FLGQ|0kbGEIOaZx!C z#;xM7%>Qw`+SVLVFc4#ncfa1#pNV}QV4V4M0k-AZ$`tFbQctYk+$mzxS@Lo#CZkb; zyGx5t!QEfBbOQ-MHDX22n--$U-z>z;QtXrY+z@1O8J5rPb6$+TsrZI~>ZDzT|4oGz0o(~bGO1&>|tQB<7@=DY=a zvezNduYM{XIzH8uq_m}Sk#3>3i)IJ^wkh7Si2JNjirLDkx~L6Ni6y&g)xb}jbsX<} zYI|zwwywz{J~oS7_PksdBVgFf4RYNPgRl=dO;}+QR>SmetnEaRHSW`bGI>VZX!$R< z9p?1R&GAU!A#w6=yl=hZtkOhlCNJYNXpteqj>6nJv#ip&%f(3l1w!vp*v$pph`8sWjc?|^@7?!W^p~G=v^%9V&voCP zm|HnrNc?2p7=GJT9}qFlI)``m_X!yQHIJ^p9K6!n6MB+1JWJWdtu^(iD{_xnRmGjD zio;4MdSmj0c_mKS#!0G3Pd4Kv;wI1EmD4*f`v3jIdJ{gsObJ$=+)wGbS$C&Fv zuqvjj8H|vbI8ihgp)nk(vQcH8nTB*?Rja8q^WsX4)X_SpP~k2R=~BlG4lZ?7Sr>^p zRByJW);eGwF4DKw=BjcSIoK(=<94-u0qhxz9#>sm9maJr2&Q_JD68d7h<-0*6x@mj zj1>vV1dDz*r0hwm)D0!7^z6^3X2%4Sj=MsXUJJb`NQ&)BoRNtQZ2-bE7Zb!hB;ytp za7zVTVXg`!XJhCPFBUOT^WX_m=xH9*>O=9EGh!xoOXDD)(lye0(Qs54$3iG1QXGor z-#=BpwZ&k`P+5^CEvbgBC(6{G77;``)F0rI%25O7lZ<t1Sf1%>;>x|&SYY-nFW4EBvJhI;R)>|nEOvQtDBP?sKa}fM zv}yF9i!HZR`GNkV$>?tTscrP4&?O7?>Q<7GPZmLT-&Om8OEruWBWviuSCzOyyBkfx z)Rs`d)mGZWU-U&{`$+TPy{Js&P{mAqup7uf{QTbd5JYu`{R4&^5Vo!jHc^HyOw{so zmzhrlF-w4S9qRmlmd!-E9VlDKqQT{($h-D-@~f-U1N+kJNJoJmg~0JATEAVW zR-_IV8P#xN2T2m!`3kI_p%iOiSj*Da88^Gb#;{`OO*YPatEFqwdWygdnLM&ud>A)D zDV<$&&7lJ`F=?%0F{~)7H!(mHr_q6d|AZ5CopzEXWBJk|J2li!_SsC{J_*%2HR+9Bx%i`D73#QLN3skQ4su}*KoH*yt6v!zch?{T+YtLmuw~+SGYAA-~<-wOqyF^l=OFqtPc9uRRs^g9@ z*Y-A8$xfY2r)a1vem|KE_6icz=^XrP%PMXVi`puzkQ!1j8BoVrYpPWvpP#*`hV zs3IC(r}n4x*#wPa8a1T?jIo7hNUB?+pcagT!o334Km(SgPkqc^@eL=2LpT^$62Lbaa#^mwWx#TF7iE`R>&923wlVXT)M)bYNAn zlA)J>v}J|MfsvQ$8?KP4{A7>4ROrx8WuA5Ddmz!fnfu&>qtPfOhfYq)=3Jn_vcU*1 z^Br0P1j2E3rK9*m78a4WKp!49tV!;-W~m`9>HwSHR*#96Qn2m)FDE7^u}<*s*pVLW zKl>`zpPXDvf45^G+3g;obHnG3s0`NgQKJ6pOSy z*MEkIYYz)ABvSm{n&?=|8SY8a85E%Bf5$1p77FZ}xZ=Ja8)cbBYOUSK)bGX@Ezv?z z|H-kLd6d3grak3)>%=BX-=)&AMu&w9rpuY$`TpH76Cc0vSTfkl-nzf1w(~hHtYv|j zkocr7>gRZeRE6{ck}5@vGYqjnpTaI<>ZC9ibBrYZxxzDp@UWsDNt8%?BHM=3AdTaC zi1wS!-dEa-iGag3Gn~p%;jzG9w$3Yq<~Ya{PuCtUuaAlJgLi$iW1}`Vg_%Or`_)Hr zy&`<5|0+fbQekK9ai9$UD|xk;438p)4wmasJdL!G2QL%9dymYggHgiaJlVj&l&teR z6W=_W^AH*rES7Uo(+=&X58p#pH2YO*D^E%L5dDQPVzNR>mRg(|jr9ih*9(TiunK+q zzmMhk-NL96`i`e4k|gX+!mznf+Ug)L5h0a{xoxrb$huJKRV zd9FU<^Vao%+BbzqrJDg#V%Xu(AgJxg2+x$59+hc_+jW>Wu1R2_dYH$z?Q6wHr{G`n z*Cj^bzxNS(ZqHY`7xl8xkog4teF+Q&+K&7-cP2D9b_ZpMu8MmvvANZ4W_>{3ZaJFp zEQh_1${(5+7=yiQxAn{zZtkBS*!zJMRS0!FTfgR~+(qnm`ttox$Kd+hsg`#cewgOY zm;Pueh^$u42`mRasTAbIqmchCmAZa(w)x=&rp;b!uJqj&r?Kz87W*Qm+x65pkvY3; za%Br`7TIWOzq$I-i8}WF-S?d!EC-gepnoW8|810Q#`EshUv<|?ZZ78)d1DM?*zN#G zASXE+T+X${OY-&<3l(5(vfvHsazynX2xKD_3=ez@*atqhfEN^71ou7NY%EkJZe`Wu z7|_k~%Tmi7fZ#Cyl+#aNh~d3);XBiN>(_-XGOpOx-|m%P>lItGbmI7I`~+JHbE>>& zNd0{?2g4iZ&)bmc%`Cv&WEl_pzLEyI>_fhJA>r!vd*x0(WSbFD>f;^c{QNP>=|_LS zt<_&hS6?juB!e>T>zU-{w-s`~ax|%KMJx*UsHQ%+uN8@%2~B)7)IR(CxZ0`Q#{Uv; z&LKHuBiA3Pij}fk=)rt5cBD2^tcCsLGcbiTaX61rG{Mk2ww28fVilt5s970{sO+R= zvbJ~oR&M8YB!Yf(Xln24INDdoY1z$*Uh!MeHyjdYGi+QB6^Aj+`^n$?_LY>`Z(O-% z*hDBdHyE}G?)+BB``|fFe#qYbb;Uv=K1p`GV&f?KbZ;i%Y(d)7o~UU|rih`tMF5oh z*ZUXHkd$38=zJUt8i}%u31t*Et0dN}|KnSWk*BZxaW4`a&ldc)KMF-Mt1&weC>~d$ zSlq?vn#=5kwdHwNB1AGZE2wd29eY8jLZu@=T{mBwIPE>p8g|xf6+mY%yT(Rgx&Bk< zD6H)+x8F6SBGi`t&4T{=)VDx66uOL$ zw>h72$Ug3zxM%h8oZcO(3ZH~yXl0ZC0ZRP$@6%!{0vs>texv+7aV#a?glZPrkcl`s} zir}tj1eqsOEhv#Qo=GjRC6Wtt0e;s%)z0yeK}#BjTS36>{R3{rmu%9=e~vb-A+=`x zdm~PkeDsccwtG2?yxK1+s$)^=bV5~Q!RwypgUT0Tfe=j-z$@CBQv5W%naK^E7UnuX zR9xG!FK~*choRWJcD$9a%oa6|l1(1W!3s=|rs`b3mwz(-08HoWVw~Sw2K7!8BItP( z+<3wV%cHH`Iu&YAHG899Q14%_#9)Jpz_)uV4CF8+>6l8!&Ta$Le5D=I}SI2@L}BYkormYxjU(hlW?V*5M;fN`aiy{NI0R3zhF1Ww9pw*nUqwFST+A(|C}3ANR94TGFg>z8t7Ys<&cTda>TYbmPpf~9T@bf_ z!u-6L3i$bc1&i(cZ z9sq0rsyj&dXsGSa@4zR&$1Q*tHo(oWxvx6GK++LvpdT>cu(H{pbAzSOi4e2~1sKzM ztkwBk_<(5#bj(1&9<8|DKL$gI0+|09?GxH9JLtXtObB>D4f>=BqLFn{(rOoAy}|;kZsG(trzMP`~X~gk6{8PRFAWScgA=!qtC;>s1;r z1qzT49^~S`@{+epToedp>Dm20f4p%+$qcJJF3C1had?*B!GmbH^wK1 z;UWQSBSY-|fHsI?WV2rvfN*`zT@UmS z8z-X1*^WK@OP#=0Z3fHP+ofRO-K*|kOnn^hX#5(o_OU%3^F(EsD_eOG#O~#O5g;?| zDOt;y!?1-pc54Vd-U5eHWUN$`wY?S^L)n-w-(vil0R%=>2lxnjXe8W3J&5jPV}FF* z1z=UsFNi>bBP$!zikm>I59(J0LubNVG$6hhzdm*Fw8P3$`J5ROu>)C;LlpM+_pkIn zj4z(9&}OlpUA*@!U;#hGP=gpYQ6GOF^xDHf8p8}cMbgAXwUaJzaY6RQc*X@96A%bF z<=_#6B{bgk1Min8NwK}K1w{tHy)cQypaly9uSt8562NxRf>s0UI#g`55?ib|k{{$* z^I9v`@>_q1cxuYIdTL&}H430j+bG?}Tfv=sVJVF^V|}Tux^tPi_OgNS?^|4@*Vn$= z%#s~bY5Y|YeJXotzIR$i=g8j5BSLC@E$;Jx+qy7a-1?|^&H0seC>bmI3f%!m6rK=- z3Fi5n1T=Y@*-dT>2`Mu%@pDdbG-weW^Yocnbxd-GUUx2iRVZJ%7JP>dLmT(n( zZ1nWCSX-!iyBX?Ya6hpAp0!OjG!CVaX9t4$2W zEfjof4(eAS0!9Zkr!cX7sKQ}|;VL5h8xF?za2u+JBJ)~Ec#&Y}RRF#*QcWn4asf2w z0M#+uj=|xJo2Qz>1?ZVLPgdJe(07j`$A7Ka;*U3!k%?byg3c(t*`;|N)yH2oNsmO* ze>8f7M8>nOERGzH0++sJKUoRy5n)E8TnVz47hr8n&Fe zcOIGqR<`W|=RWG=RmU{PaL0~UW>;oEL1Q%F4NQXzG)~jwpN~X&Jdn*z>XH;{mvYvR7(vqU&p4?yOA{D^1d)ybO) zCvwE*-nl`dV83m!gt^9{%6=!NbGwFA^gZTZV01j+G@F!$WRszv&xv+BZMmoH!^EaW zZ*tG6E#DiisR+t`JTM)4u|1MV?J_?TXeK)-PiX-C&%pp6NQrAe<6`%JMCxx_Q}11V z27Qc18K1N8t{4$!NOb9THxHB!F?!ex_BwN$?16@6V*UmW3iq4ZOF3)JmNOMSRYg5D z=DIhFMMHG|T*!HBJ-F$<%N1=Lv~1L11s`b-kzmmBdMuw%6iMG3*ygS;X{%Q(LiyUo zz@II?C>oro-n}U1PHW)fD*};(%C)M?C#bab^l$8iHV%p6&&2# zrCxAU-Rkr4umkh;X+C$Nt!;`-1=XAkc>@b>aFnO|;_7L^{UPzWr$5Ov#JZAE1<5`z ztu?G{-Si1i7SO7+&iG)UPc=#d3S0~9y!=*ZHNGtci~KYzsIOC-H&M|atJ}Mwe*Ag& zvcYa}em;V$>vDD<^UKZYEV^Sx{4{NwF<0CTtx^@J6+ZNPI8(xC38_oD_%;=|$7})o z*u$xzrA0jJ*4>Y41FsfM5UJ@9UdU2hzg4dqTT%4&DD|N#^Q_t{8Y*jh3Yw8Tbgy=| zyI=ia^k1PhIO$4KBi!;_pL2*?c`OmQphW4?sS_BvgXv! zrw}BLfOg~5`u9DpN>xXGrBdyTH|5ju80oZIlSU%k$4o@@Tl(<5_E(6;x{}eV@pClw z%a`5VPggtJmNCiU#wc;uMs*e+x%@e8sa9;01W zJ`($0Icq&7RZLRW@r2;!Z*D^u(&qM6GLdx|3|5WMS7aQwgnN8j^OkT=m(ymJWce|c z&9dVSvhl9wE2684@&X0TX_GBamy*5IeyuNd@ds!mAB)2n#K$fAo8WQ~$dslDIs1Dpl2M$#3-z13AXurap@3YJ8LVpY{oAcipX!R*F9NBJ z42DUSrD_}b+R=rw_*{;-!UinG)FM$yD{@)1#u*8EbwFGtBbtgEr|Eo_v_dglkspfc z7d+W2wX|p`k-!kW(5v#0i6+AeOjS~?lVh|~Fx6BkMBXc-L`RyG@9iUD&+7CEUCXoP z3@G$9tkT16s8Dc#aC7G9BsrEh&qG$jYmZVDuVggiah$mXyf0L%s1h+c8U+2P(bM1zaRBAP zsi;s7vLj6g1~`EBMbznd(_gdckoFmHY#J`Jx5`FkCGaxkyj zuXMO{zR3W}Xsgxk^qQCql}jJRX3{TI(cb__BXB`-cCa3{HUY52yMbh|<4u}Gp~@PV zY5b|SD4MeK73ED$=DLEi8spt8D8(fs+;SaIS!0)@D@ebaKDVI;dzJoZ3j1VRU^`op zLRgNmE*N|dB7V=(2@o;1C(?^K{Dvbxc83*5Mw7^|j4SU~f>B(g$}XFfwntEA?^BmO zjo|H?X>CLGVvgN4k8O!2KoHaL^7sA!;pA2poENlvqWBv`Q8?T)cIhG-W|>d)WySRH@#BQc)JbHE&fa zNjVUx>Q~BV_@TJwS1*bd+K z2K>Hvb>yqhaz4X%V^VmigWh+$^ni+5K3<1IyB%C;V>F+EhfqTBMEqMHuWc|?x7T!Q zM`uw=l1%j&CYy-6_Li`KddJ=p26Lg>7F%cIAmYFbg2Ne6Jn;g~^ji6>WawQC$b^NI zUq{d_XaJ3A?V?Jnu_f5bmszKLw+^XfF{`O6sa3sAtPa`iZoP|ESy7}WG1L;22y`y zhRNUnHO*aay@oXP`5p#aN6ipp_;3QIxG@^TuEx?vLpLjD?Xnd8_D6FJB82aq&Yoaj z;XSe5l+h624V@CXbHQ*atd}V?ckT6?EpN*(rWfllK9X%Rr=Ny@*n|&P!%Hs+@XY@X zV#bvDJ74|-=otmK{TZf>raVkfne{{~=kK@ymc=+_7X zyeNdTIi&ybbY3LesL;@dmzvO9>2?;*Kkv&h{;PKpBLT*0cOhzaFNtzzfKKjQduD;! zxZ8}V*w^a83P@$Y2CZ#GLm|@228Jqp{M?*l$s|~MH>=51;((gkpzZWoj1tVHRXy-_z-8|BZ{?2aV0qSP@_* z`yy~j*$|3S7de3@JTQ10P~EQ6+%&vZlLXQ?{Ou+VOI=a{nEa?9i`ui#^PTNjnM2y@ zz+N$>Ycriawo}R*4%pwFP@B>l-5T}i!Ccw**>u>n-n?H?x)J-*0l249j~MGDZ3xP+ zWwUF288~q1wxCuf{(~hU*Gz@>sAYRAF1~BdS)+>lo!(H}|N5bpi_lmR*9j+Z-K;05 zz6i-bY^TG~{|bRTKf!+zsaLMiiGzrpXE%bqBHm(w*i~L??9I@L<1i|y5+RUn}?bO)v8C7CCd{?l?Ica>V_Ff z;bXo7ESULE_@!7oVNW^G3oKzjEz|pTn!A64+mc^6TC?^dF2MnxZw#sTX8H1n4(ZA> z6U|nGaG%^hh!4SA85@MGkcAe(OwA`8LHF-~nR_T+-j1YM2ccn@SErvp5%H}O(Kv)X zOM?mOqcW2#jpkP#I>WtMV6Ek?AP+i3);M&mXRJ_O$64va(pkBI|MjvScH#BauNjB) z?SEU(H}RWoSG{gb+pdR?&gxYlJuHmHsmj`QznyHOx3ZqULS+Yxbu;+}Jb_C#vVnqt z?l^pKFc&i-q97988gLVt=Fu`g+7h(RRIXAKHq##CyXKhKfCos{2r$@$*n}T zHU%a1Z^rJa{2L$H68iW+iBHLm+W8x`%X8=?*ePCdK)?Ih>T2my~qSu)(&_ zo0AK<<=B!%q!6tsQ9Lih!jm|Kl@c8Jm(`mQ!`k}c1;Vvq2>-#-^vjqUPl(%$$?Vx? zW?|ICOep=WWq20b%Lq7bS4VfzCOVsBJz;xfyWkB`924;sz5+TMmhBp@O-QMzXJ zB0;D!+d~u`(wx79hdlQf0rSY$_#2%6yWl3^n$wy@QS-)FgOu~%BUZ?v%vltI5A~EHBfYz6dQRH$)c}s z8;f-W5W8u@PkDRKKICoVU=}$B_PoW=6WX2e!KZ}_{cPDHOI@CmM)^!#fv;t ztyaEO7p!mTA#+Z?nFxsBdEfBN4|ES@2r3QCIXUn30QooqXO{4}CbXj+?@aFobE|*c zTakP6-yQj*lw_uqxL|Ie@P`!$mZ715%4Ad{#w_JfUigREjK~)sfqv68@O?fC*GB1G z21Ed~9-zG;tdfMO&!;twx$&x-9;P5RD}Gm9`z~;*%w^wfUn}$B`r>ui)p zOvJc9AE)D{vonif6k3_d;?vWR0oRWA!D15KzhuEE`@QA?m}b)~Rv;_^=|>Pc$v|Q3 zeKtw=g=wfIjOjY`J#EI3@x(3Iy_&6#1g-#5CN55Xu!$*~Ajb?LpU3Iuqi0KveHI@C zgZaitulYvdNK9ZIcK)n3b2Sm{b;MMi)hj9SBq?;aY3oC5>{|1hP4e(x1o&z)kfu`S zze(W&QH>)-=MePV9@j4BVwq-I`fp*IC(l!U3_?O&?Nu@$%!8umY=UgRBAOuM#_}d^ zVLKCNsl#vJzIJj%mYgX?}`|#U`9)5EO(j<;s$gsf7n~XBg&2yPv zR7~E&;UL8Io#OU1U7^}1NQVvSc;PBHGDr4%8)q{kzHPdZ|GNPqe#>AR7$61s{mK{w zM;?!osab;O{Izh|_KahaH!2+Ru8}d*ynQmSdYdY(aWFSu?BF2fj4Uy<<@UIRgdhcB z4+CK9TS%OC&)xm`M|;k!y&ETnlH}#khD>`a45CgXRQdEgjhBU5+59MtQdCbn**jTO zyWc|Qy$1?O`=3jG)Nz`fYLB zznx=s`6r$5$IHdets3(8E_)?rj2+^`*ZgZIVA=a zmaih=P>uR)XB@NkCntrXrt#cIfAOuCXQqx zLQ9F8CDGy#^E}eMl>V$$X@4V>ded=!{aFlV>Y4jon*n46Z}cR#a~ges6|y3JymgeXJY*o zY8`E|yCu~2>h)Rm?nYs@M>y$y0XHRRxlJoy;rYmSdLxtFhjWiG9@VQ??QI!)nyE`B z^zg&<00;TxHGWJpC=6jF|2 zr-*AbRy%6QT&b~U+N3p8_iXgUDO2AQ(tRkh_GD<+^KT(2z%E zcctuGBdgMCP;szT-j{;8WSK{DQwyQebl-yQZ~97Ho`l->FFoa6EZP$*OTMe>?iJsq%h>8*O8VbDh(ECDVc$FOz6>W^@?!-; z)5TdG_15;G3wS5PT^I_u>}@rA9?cZ8Z*mC^5t)3|SHHCrlPGi^zG{{Hu~SQK>?7Nb z)cNd;_LOIKnuK0A5?DENZXa`Z% zsMl6|wh26!-%SL2TCj&PA9&M79$OdZng|jOT8%`7FDw<`*BwW| z_pLg4*b5apL=gNvG`Y`tJx&F6RHwn<;Fptp7o98YF`pLzz(}9zWojQY6fONl8zR^ouT5kC5c#MCMg%yRc;rYxW}IW^2$%FlrcO;Ad{4ymEuKHPA3 z(4m~-;_5ahT<}Uf9_bBDmFpG{%$#NU(s^o=f+lm#o(Nk8i*BI;CRd8V3zh}lc59b# zcErm8K-f_=#pn>)V>mh^zAsB#VI65ccKFzp03LnNgVIf_c7cj9ejn1aQfB-+Yth+Kk5;D0lt2oZCojx+q#@KR65tX%1Di@86`QO1PE%kW($` zqR=&EW(EhB&z?4(ZPc$x(7_4Sj{)7V^u$inir+hpw=hDPzE3b~M;M3Xrxe|imz8U? zF#yvfelf5&%~)?8xPtxLBfufXB8upX*TeVvK=){}TlNV6gbNk={Q!mnrOj8=+IeMbwveR0u7 zP}0O2Ld|W8fnKBFfEuu%ke8RN)-tVU8vr*X;AL^v!0-LHg^ec!Y#`V!v>{)hq{Do{ zhYsNUOG=Nw{ow_QB6l7_m=ExDxHOY{;$O9^0MLaG;$qC)Y3MNHoB|)%w*3r|V8c!& zSna|OLWC41BtbOEPF8KEBoXLP_htQ1jfsd3BX5IJ8P+~j(&T|fFy z*bclW^OE4e>!P6UOj}jvyk&uhB!FCbwW9S!*nk1^MHm_}*rg(f&IDc`iEBvVhtM08 zV1yGNZ%dLt2_dTqj{3m iBp3&Em&`=jtuLSlD=G2T4YdgA@#@^IG>m^x#?-@PcrRlrcD5Tp9Ui{t#2<)+*0A zy#wT~Dtqh7CTIo?ERZ%riYbqc34J;;0+0n(11GHN`3D<6vJs#ayzU2i42-iGs3a;Y zD-Gs39xkoPaZ`h}E(rpC$=B-*BTJ85Y$>(6N)L5KuKKD2LXtvb(i^?n!YEmtW<{YU zy;g?75r>q6-P}^qPP>OfjUk2&AIr*vNteS!7g3I1UZpeY6kz=AD=$kn0B4@qAS|_s z1E~^sIPyek5o3j#6ANz2UZ#Rk0HZ_TnQ*tpWQ#-m)^wdwN9}x7vC6|Dv*MsD{q5L=n7ZiLSsR%l|p-Ifdhd_=W3{#NA zsRMr6kO(clwQYSq+aGwBYJXO|wBhCUh)=^M>4#6a30L+F`6H|vb8$!Yf#;+IG}LxR9!y0aV==4D(I+$x!7E>uC0T>5%!u2OI>wQS;eQ2PI5ADY*X3IQprr1$Pu0I6w!V%!f=i2s1 zI@p{7^WIo`to?;``Qsnmb-=>06-i3UoUl+RbQb|$rlxe!0%>j@MAqJ}NW|Hyc<6fb z6ceP5L%Ea9zJ)t74OCW62+tILqUh|P<0RmR#BO0{q9T;>_=3P*wUyS*#}#}pw%8{d z{`;q;%FWx=>F2)tPDsQj`q^9i|9MJw&q<(@ANhCd8(u zrN`nBF%ogQjqi#`Kp-H9c0#zkSXtdGC?VW^Q+ua@Q~b4L%87f&`$eJ4;)K!X$8uP( z!adn1={CyOFwD;UOQT%Ou(V2xO2S*yI!htvU{yc|fm*2=H6NCq{HVYN+Pek z{M8Y{!;Oza^o$d)c7jDz5s4Ih7Oy&>^ zxJ|dJ=NVlJ`N|Sk`ckT;l}U_<5n1}wqLr0M%(gOFI!;rw@Fg9i^2 zn7Pu}0_}TsZOT|&JtN)y%e$(FX1G0;Tr1=E`SjFIw5*l%yJ^jK~oj*dcEa0ud#YJk3G_pf>D2|5juYdP+@rK5=jSPNA>V*9IfEy2GT`Pa&Wv%+D- zd;}Zz*V;{W7@b0AF(vU}0t5P^Bivzt%mREMrg|JB!s=J!E>GexS60fbN)_LDkB5$` z#XQVh0fPlQ@jwsFgW*%jENI%(;ifegFN4}1)2{RC++sAzmdQh>-hjq=$6L$;>2>XV zd2mekW`EXSRIaBrm+0o%Wr{W}wwSl=jrsk)_!ilg&9BkoMk?`Lidov4=%1bj{vlsW zG4aVU&c?C~mDuv=pVFlOTb-lRS`o)-&_T9#<~3OcRo~QRzG06mI*VhwFFB-5=V{j} zL@A}@QnD^iMb0L>PO^9YOXFBh9c?S9ql~W?gdB|TZ~6P$qXbDxT%zjU&|RWSWn&Sy z=euTnzN!FoUy}CE zE&`;~cWd0nb$mTZONb^^RKKOz3~5#*Z41ubm~nQJcpS2YpeY#0EEH`E#^oy3%Sh5b z+dI)CYo2{3mxy|MOB=r&-K)m$)lF(L-bc1Mx@nDNC7Wj%Z;i>hBjfD5F%ao%K?P*3 zJfcsTT&6UUV4FpmV5x3m6RQDC`VwxW5 zh#!+O2AG&xE))wJgq{DSYqvERK2lX*Q3w~ zhV8E*uBzxl>arET!H}iRRc`-~#LZ8+s%i-Ks#jv8G40__R`erV=2(%as0+|G17$`N z#2GduW;v+CG~q0)!ZMGELpXqL?$)qnh-r4V;$eu1n~(m==n*!P8W}Hh>Qi0zo2P#F zYWBpd_E-P;!_>^2O-o=LQY`wZEXNiCl(!90VSqX54}i;)OK1w_1l$>l^Ml<#fA>T{ zjCuoUiG@Sd-dNioTUA~F0l!P$lnI5?2WB#1zD zvT>trfCy?axB;L`#vMUDY|&FvmXsKpxcxZ_TScNq#5ztrz@+}H^OrRd^)O)qfK^JO zk&S+zjIe|3|I81JG4>G7xZ(8LueexchM#u7qJv5{rv<+-oQ?*Oi1SW z#>GW>YO+mxbhH*3v81h6f)LnZ(Ar7Bx1kp(bX{UQF@8tSl$4P|C^eE-Ef9JS2P-0! zx;a={yqSQ*FF?1g29#?ZH50S)dFq>hs7;mOrOW=ieHW%q=)?L|L(u6KW0j(o730Tf z`WdC^VIv!PT5CR(lpTQ2%jt8Qq3V5A{l4Cy8iX)`;i=A$sY!48b20%&z{?7;M&gU<+;Wj|*c$!^Q#wBxp>kAkk+YbmqEEDEpRowd*P+MyIZ z@zS7XhEOgT*dqcDP>Em?S2h^yuOq4kI6CpEdiKz{kzntnJ(}%j+%BfcO<%UuHn%C} zjfOaH^n{6x-B34Bp~@%Lc^?$oz&imVI|pKH-a##ihj?$li4XIDRl4>(|9EG=1TKgB zxbxRj8V3e4#lB@pnkF>3jXZOolHeH3$SJq5-zxbBzP$Y=Bz7XnUs(7!WOfIDSYk|6 zvWuOn-z6d*k{NKw;<6l0#4>! zrMK%-eQ&YNYBRZxtA~5(s<+Q}x{IBV4wU+BNpM=8%7=Ka@ZA;w0W}NeSent+gEMsa z+(z>wR-6c$TwMx8&%QG0F}1#`LgKn~bB1*}K8l|5X>>Vk*6b-V-#}038_6foTn zVo~VbztQ&hHTE;eD4C$h-n=;dso;DFLhFAV>dzkYxxk4Ka8K@^3`t&w@j9&v3?u?`bm+*D4XE7{`Q&63COiu z(^tmtmRnXKIJHFGgzYv^;2ai4%??}?v9M=Yqy7PyIhMkvYv-KN_~|Ghv~AjSteA>6 zq=I1V2|-dRkSy>1SJzLe&%{5J`#9=;n=W2pCMj2WMbCHlNcbfCEI<%U^K)F<9K-bL z-+F(EZd$6!*wuE8iigS+?K!8s^V;EFD8B+OruRC$p8&v|%o3!qKZ{k2Ic-|*;88_t zMwB!v9(vc<{uiH&h>U%p!0e$EnlcV*lyg=ZtW8#pnG08BfoHzprn)nH;j~)X|#*v_qqJild>T$9%`b-B^16G}?nz83gXeN=g)4MQhg8 zYwyVb(+0v|K2*W{EAepZny< zWw)I2EKQ50!v5H3Gk-J|vNXvhOUbgPE%%)u9a`Y^Lu-{L#ux+ZSFy*_pbxNN{^l~f zD{`<7NfckO=^Z<&c81)8W%!cIxkrsIPKTFgO`bo)4=VWKDu3SZ+HE)3SKjyUZZOr} zz0Icb`@HDN^5k}3s^K^J{BwP=)#&)m=jZX#{7zl*Sy%P+_?s-%uJ>RZ;)Tz({QOPZ zzPJAQCVt<0jBRyQ_TP0lNwl&#y{aWo>0wt13okNoe_y4RPPG;)k3Av9PL7ZaC(DfG z(1k)pN-k%AR6<6+r4h^YnV44VU->zSJLBvP@^o4D7~z!jrg0ebNqOm6EGu%gz7DtD z%CJ5B$iT|4S--8j(ass2T279ut+wNe>t(c-I0^4WXAy>}zP%xuueZ@y#kHEQFfhcM zoxh!mG^C9$)88#Jkt+cpIu(emPFW~@*GxPkQfAhvDCbN2j+3j~DQovZo&pWjt8|xk z+G9j^ow969QD$)Ji`>Y4h~RYh)B1FRnSIBfe8Ngp~@G z^3~frz@0O%HNE5o;>`Fukyq{Fu;qe=oaVY8ny+2Z^^P_4+DvI`ERzYQ^S%4?{@hxu zMvL9e`g*Ta&--Nhah_uuzo&K*iC)9$r6_b5&1@R!Xovl9tPtbDd@8f+%&PZZZi~xo zFEj?)J#HI`getVbp<=DKk2lTT3xqlAtcm(=y<6p{+z5tX{7j~Mi`6ot3qUgajwXv)5U>iD4S7Pja(GHb0&>Nsgcigq?7(2kN7v2X z#w}Uk!|DSlM3B(r5<}Tk!nV=j&%j~?rd%~;^Bj2-)$JiQZW#NaFfrASMZr*OsQ?KU zzz%q0-Gnv!14N=8utdx#Y9*)0cuL|>_OCFItRs&~pv7cKLlc)Yy-bMv_id$6B7Owe`d*FE z#gbn{CcWhN=O)p2xvp=Wm7GCYbJS|)OHJO#JUkYatS=788M$3d4J8_c!H&xz=!BR! zJi4SfK^ai5RUu!I`}cIqGtLf{#`o(}pUyqbUeDU|6!I4H{(;8qeLvs1r(iGREzDBp zSJ9*Hs)SzMyNY#K=$Fi_Rrpbj0IW9CR=w3))-$_agzOAri%!rGo-QO$mJ)apBmuMa zBSNP6`%8Nc%BHzNWj*f$H`WMar%nG=;q|C9krVKc<~*Th`eUZT92Qim@b{vs1b!I&pqd1{kZ(xvv;HIFl5E>Yy}#`q`Ep0zP;5ET=04 zS$PE5QqB<3P$qAP4IY>-3{-$M>jpJBnJFIz>g8WkfpL2lV|Q*V(rT&JZv&sh)JTS% z$}9C1qP~mS&*zD7EF`L3D*FN=v=&<>L?)>ws<_b0x*OxJ`|)vY%Ad2;xzxARwZH$` zTwU2jgdQ7kDuzLW7Sq;I6be$43mH7&3#p+E=5?h>`-h3viH)Bm9VzbOiu?} znjM{Swy<@ir$Ye=*e0emYKIdf4HJcsr!WaXT7(0a);xKFC{Y_nAxO06PL84$VZ~z7 z9c3RBkIil=PM_e`SBNTd`7uu6yyP|=d+VgP=_ausFJf>4mR)yk6_Kb(YHiVjBxbwu z|M_@3vpBnJy9hiCWSlwMShFU2(sXp-G1SGOvZDbe?j(RJ5(d3py0*R4upc!oX35EZ ze?7!)=vx*3$-&(Zz<^FVK{l=rrDxGEZ9<#x{l?*Rb-uXa{UspwBf>8ABE}dwh@CAM zH9ktYD$o-PGza|;Lh(8+mDozh;qC%Ysnm@No20=mqOhQw^Rc7$kdj2Y;R}pKkQ8}%Q!5s zVUwZ?G?f~^x6^_JSV{5U#loa9xyvx0*t>6e-YOIP)mKV6>dPoA20sx;&Qoy<^gj>Z zZ+qUvlU@Zq1=GVW>j=#cv`hn>dhcVLKp*OeN{nlqNK0}px+%Kd#*khX8fncT5%J~t z2!5PD;m>Z0OY-jfk@x;e%?40DSqH=+1vysBUM4F~lzL}6;w(~Ht$ohZ$hY#zM*Dw~ zdPUhrdvOTVS$2m)n6`#Oz81Cq`xZ^?}gWPf8M{JxKY{e4WJ@L`l{;ht(u zGguh@F>8EWxax4>KCwQaKQv`NaZQ#~%^C3;`Vp}WUDfZx7B~P zP~Nw1N%YoSTc4-=!&A+LU%An9FjSTXz!sZh7%M`A;XRH>CKwo09KdSK?AY0jk&ub1 zi=-AjjAEY<=Ka}(0>ET9%upm z{$Y0$#Dqa{;mt1+F348Pr?HAEABx*OHeX?*X>ZaQH&wn_q3z#~d9Wefgk^^gwpCkt z7~{EO4^U7J5j`}Acf-QUR6d50B^Y@m%`EGx@u~Hx&9d}+T^C_!tiD$N$ny#Aal6;> zKI(g5z$b??-pyM$ZL*QAtph2aCq~W-F2h3@S!8VoV+<#SoWK4_RWt%N&+sDJyAyi| zS^SKHKFQmxe>WEcMFddk?cEn|td1)?@k4#u(W7rnU;eT72=2<1TyUN=la#JM^qDqO zu0!BbRyi8L8F&TfowQiv^l&hLS5w%R|rD)eu8iltsSgH1l|;Js)m6sG5Z9=~Q3C^vk?)o&p)svR!{ z$+b#yLbDy?9cz6YTVtm&TdNgxAf`1p8Os$)+@C(>A}=s$8uFC9xxv!2c>e_>djUE- zcVrT)AG1yV@(JpTwwvnu83=3hHC=*kE=ktwqHGkxV$&2xTj60JCgSfdPPO*~)Pg$F z@@PD#Pz0P>0l1G_u)$e+*`Ctq@5WwKX;Fkmxg0+FyN5l$G#_0)=Z)0Y6G;q~J}|h1 zO3PdV;`aqB3?$^_WSZc}<3giIJd1{~;rE<0NfRa~o+Bix@N}pvKRZprdRa2+AYq&1 zsB)T})xw9Mu{qYKYtGU$V)Fq#?Eeg$`0pv zJ2WNJ=(gJ|Olx|^5=3*SvfAhNKRDx+$bdl}#XPvcoPt9Y30iWh-ri}@j*uIX^Y_9; z(Ra$)9|A8i;yF1u$xt=Cq5T>2wLjZgm{63{EYC@6aXl!BX#Wfad8pDb#dg0Br`msY zn1(CrY>-1o>f7#g6neg|RJ%ktX}wClN_kpe1@my0I$ch)xYv5$G|uXAJ6~L{s>WEK zamugEmow#V3WrOJqw;3`Bz07)6DN20T01p6%%uBd*=%GlO|A+|}-Rh0X(ePn#%1$?sXN0m9$}F2_7APUzHVLcQPjv5T`}>?; zOp(LBU9z>=^)KgS`sHfvp0Ok!f-dc8Z;k2iqrfZ!-(!ZyO>rZozCTZoG*31x;u%EH z;7=H@*Z}0roX2M`c$D!&kQisHaOM|57585DH3HLT^2bWAt~pb&go(S)57v_tf2v%P z_fKoALW<|PoRnSl+l}vBH#0lCmb;4Ny>Q68Kh8BL^7dTHw)DFn-?8l^R4Y#b7o5_8 z@x&|aYZfplr;C;IiO>fe(y$0q z(m5FoWN;=NqK1trznV`LdGUNmJ16+8lY_bdt)Li_Dks*CM)hy zbN`A@*u)dp#rlo51TLwlc*3Azs%{=gulwW1fX=eCq-dE{{K{9YG*0SSQVY}0kin+sj zoHG3N*KJ(3$;U0Q&EW`4JS0GMJzblliQoC_q+_}p|4>+@)M^Li_!1z+MS67qsHEf{*!vR!Yngp-KodSogfIjc z6ecDpBS9v5X-f+VDlyHK8#X+Jki^w-ON#VO-3+LWXdtJm_Y>gY4D(Z?Q)IHs%RzG- z10$7$dS+-dOI3a0Sz7HF`m0iIk1317QLau{Xw91K@(D7iPf;z8y%VL+3IluqPiF|V zF_r6Ai-BWQNW_7~uVuYT`~1J0Mvh8mY;yiWKZjp7l8z_cZ!y!h@>v|p69{xi9agCu zInCdtLlBtOIMba$LEJT#0l|`i_o49GY>pGkA$~iw_3#mvbu|E{wit$8rPT*rFu=wRE-5mlTR=1ta z7XyoVIM}vNFq{apgE-a3__`kdkd)XiSNMh%@GS2NbYbv`O}55lI(ay4v(#4Nqn)a8 zV`RnQ$pK0yYUHvvO_wyQSxGgky(Sr$tmXBdTuzs|Un)1D33dJ+Oj4H;`e_I8=q&(8 zT&`TWRS%1L3`@aec>i>xKHY>DwW3-h9q;mupeiq>#Z{=}OOL4b=hXPP8cvS(3LS>X z&o6u~<%AJ>9mVhREe(Mu)h2V`#=r96GAVn?wm*J*GANj;f~ze)TAtr=vV?*!TUA!{Wag_yH`SlB z$0FP1yp;C(dm7HFnTbEVK@mE{WGk>};!GUdXEV!rem5OkHI1(ij)LWOKc3T2?kGDJ zb6VzyR;H;N$~t|U_M%q*=J#i)9Zg8ex?<yGF8~`%z`ZoQ9in<4yMGoW@)}hqoK?Js(7Nt=IEX zK!3RPf)r`=Z+OvSxj~4ZVX0*4;w4VzwgFSXPO)WZTdOg{#a&7_OToD)VPmIJTq&#n zld`Ne!N6R%ONC?D@itV!yXEVhK10l~YEgh(2)_dI4MAk3hPb*8M*Nmq%vr}@%F|O) znwxv+_K&8=&nbB@nuR}i*8UxiSBZ&s?Y^I2o9dWf=jSQnkY6_|mo>9B+Fx5*Q(HSK zErs@9zg71uLorl!wLLHSj$4ysaC6vf3@nbs1SQTnXRi#&_Et#EOO?&%)?sA-oDryv zN{r*TXnBN7_+%+`%RM@%89zFfbJdHYiwtAClyh;GX4ad_O8l9*Ddp|7Rxg4K`#CG8 zZFFGIzV1Nl{NC2k`;(?{(rilchnM@Pr&iIw*v=0JQf`kz#oM{gEwRLLYEHTgl}?0g z!bV(OaPJd%ZsUeL*{jD4Th6x;?dP4uei08Pw6pk$r!{M=O6m>XqHA zcLs0WKs&frj;rd+MRTgqAI+=zt z*EF1sBR7(F*xe@ZYp1_3SlYWUfRyEBGqKqmY9hv|3Zx45?-f{_$LB5{uwCbtY2^e> zRFuxe_6Sf_IxM0b2j5SiP^8{bDLcA9>O7JYDoTL_C}t%U9`7j`J7q(JZ;HqoG>DTY zssrHAPhBUQj}Xt?*ppQ<^6A9Pc8BW``&sW6eWk>XkgUaGscC(ijHu{h?L6Ku_S~oJ z>0c4IjkRrgJJ5_!$kL@J{V9y_f7WB7i%C^9zaNLkPuYG2r{nW|!%W+wA66vkT~4O& zhEIIhEHP$rl6wLChIsYlh~0}ouY=5C=O<@iJkJ5Lq^a{Up3nwOLI)U{ayP08q6e68+U_V#TSm%P2RsenF%aJEFR zX9PO$RD5h>@Zs{TT*)9*z>&d_7hoTTVmbvfJ%7gUIlAU^oe1RY1>IPRU|mKK-F(ktIdq%p^@I;TYr$apxOHWk=VxiAH=r* zO-F@=<^N?FPDcbWqKCYAM$m5ll3dcF2{)(?jC?iB;s?ss$QeYTF8x&vyJZ5F_2P+MAlEmH#c2u(;D2|>iHRh(o~#v#FadUrq<*7;LQPQy3=A! zZc%yV>;7|7ee}f_64winF*=Q$)|s-;#S4(&IO8eT*zrw)0j7Lih`Z=|-!0_n6oo>j=!N~I8=!Vtm zFg|$8>0dij7Ub&<80u@{a z=>zKqvtHRnO_KtT+eIK2=%J{y1Vr_L0peF{G+V1*7%IO!zYYq(H za9;b|ju7y~SKdqO1qsvz2eKnR+T%u5h3WyCfLBO1S2z|potMM_J`i9M5C{n|Bm_D} zhB62E-Ay2D5SUC12HO+|cMXt0@D506Be|ypN-)g75`ckFJ zfrYva0ZKdGd+J-MtJW#H3RD;iBMco~l;fwGn+&shMrJ$8J%wlBut|c`i*nKn)CPSt zrjj7&b$$It7C?S%plv+#Z#4Wl0Eh+@9$EZY`}eRfj3wvupPSNZA~FFqc$;)N^q=y@6>5Qo&evi0$9_erDfIxGujhF=^I8+)j93KJ*NW7!e*?)KnH9|@Rdaa|A z_s7{tJ-;Q7;4onC$pN9qkGtI01b0L)7V^i4208}__J5BN^`ZNH@-ThvpbTS;7{c=d zI}M4pKwkO?u|;qJjQ+ESz>D5@oX?$8(;^W<7fP?xgL29;dCTO-qQ%T}^E3H$qms09 z(;TCjNz8HHhPbP;D`mhcpHyV3^|6ANb!e*Hw1jwui}@SN`J-!dI*x0zuvqnIM!aU3 zZ8L17mhxjfJQv!y!MTK(Y;&CAb-mdcgl;ALe07vytJ$1{2+z5>MaM*9!W|US0TwI{ z9Jq6(Bx4H&scfa%T$2^+B%4a;NiJKG7}~r7ZAcyl%-jYN*&lcx#3;)(wI6 z1)IiYxk)nFW{vea*h0Rw4Vj&q5%#H@{<)2o369@$1P3+U-ub-Mm{_dujHwhW2RCL! zDSlShb3lC^{7>o&@vU%nvK*uTqLHmzT`r&kUMGwZe4)VHC; zvKyOSN=FDA9FY(V5tdl~egGx&IEa9=EYR;PjI9pQ3m61@78cD&+zpoChk9-VP+zWK zpI_Zr*jiev>-y~I*vPQ5Paf6PRP?K!)O4F}C{|CU|M`=CVs=vZs?OZpR1514jt*x$ zRJ2+w8=0t7WlR%CL>c-DU(AoAq*|wdvaj1Q?yJpFT-%*zqIf$Pf~_M&!A8YYl< zvMT9Jp{zx&a$hifQ0JVWKBPSp&6gQO(%QRVD4uxdh~e`~K5Gy$(edv4u4@pHGm|Jy zblp@ULt*`_*{ zk{$CPKj2Pz0UDq(()h#SXztG#>Ekx z^i;|aS59beGlGU*fM#Ibu&@DkuA5Nlpk04qbkA8vklcf!!|{fw%%K6vt)WN3aj?UP@ z2AL_;@>kHbadJ|U>Lvw$jDLTp@CRhf3SwxE+ZS{SMyEUf)%Q;KoA7Rob6u@jM`8*` zB6U)8akxPk;W*2m9CvuS_r=Ed)+$L+%p6121u*1J(mPIWuU;jJ8X2uA1oZD>Bo4IO zo$EN>#Pu>?fX)wdyvYHPUo9HqScuT_kcXrOY%2a3axW6xyS^O2_qO9Xf9lPcw-}^` zD+(U@@{#`J(TjBEXOZ6I98)GD^yWxJD%huVjiUBn0bXhb-2lyz$Vhv&sPzf zC?DXdjQ$}V^?{++_^U}YY*5Z{WMUZJI9*jp@M*?wUJa2&4Wgt9L+`g}oeagV+1I~> zdPhO{Zft)gY`_U&jG`g?JMynCfh z;ke5F8aloCn~q?qU?asT%r_zMUXt+IGRq~OZ`!s8O$%TrA9+g^QU>ea&e;xqZTXnJ z2hc%HCRGt8hl`;NFQM2~lp?vyly3uw73+$TN?g`hf}_eZNsG*}$^Nq3D9e`_kAtH+ z%P=e8snN89>?pxd+$a-G93e*@({W@@9Vm7wF9V<8{SAFyHdX9_2ttK|ubdBVl7nAN zok4!jikq#{F{K!zs6eW|G{{$-D%;xf8dFXTl3v_O6>)6Bd3AF{tS?=I!Lcd}du+yp zeII#L7XYKICZmZW=7VDp!H_A6UOC|CBhM9cItjBac{W3p{lkSzKPDdLpQ;bKG6n*6 zJgmlX;~%Z5;?Dv61wS$79~=13anJ6Ed1Eh16mskktYbp1QTfM!c8GRiznq-}i=Xx6 zT5|KtseZUcEz?&ivbt3;%wJ-DmdSaIDnFZle{g4mgQNQY{-rlih=f(p7>0yKsC|Tg zun!jwwcIG>)n3LLu$YpouB1VWo)!g}qMv4IUDbfWrb16&({86~sJQ$T0ziKa9sizM z2>*;^y7;%b)zDuLuFAwqYf&x)IXrS6*W&h;4_*@hoczO>l7XMXtK1B3qrh0Kq556w4(pzuxF;T@x3 zO>jd{l=w(3RJ~%$n14mb`|cNnBBu^PFOH1 zl3l+y9@2>U_0p(1ULD^Jy6a5AWNmTRQF~Oi23g)}{X1G+wEws{ru>3%?e!Y>0X_b3 zn0}@lyyb7Y6GMGn81pPiVgsUJqQ)NJ%#8)GS;-J87KX6KLhn9Hv@o(nranj*{A^bU zCAavgM)V{W=Tk@<5VXQM%UF?)EOnn$nfr9h=d%eh^EIL1ufK{WBvO0pxbo*0=l#*i zXKJn&*~g*!nKMJEz}tLiK2*Hz0X}gc`ajM^#PPTzrEyh4#Ttlzy!PY_5wNb2!GYwj zw5Z=v{2l)bOTO0^dYrJs*8FCrCIHR1GqkJFlml;v|G|0bF|ba(jq>9atkB&g^M%V8 zhieeG4}gg(Ku`;bnIxtm$XvkgCHmxUN-jx7KMxnqu)loP=_DMTrH7N+miIaTXQ@qc zK8R=JcGsVz@$gjSa^;bCd9fPWZ)hm)Iab5HMRCEyqW$Ne zN|Bc>JbpsI>47cQlda|D`d)|WM$ZcQo+|b(?+Z`zoUP{Lzn2I+Nc0mt2B+t-xnE&) z9GISfUsHx)-HFox#2Tk`mGTMJ>TxnF61Hk7nPuPP+PT#G0&YRCt#m!VqxQD~04 zl2X2?bFolhR_QX;ncl%frL`27JN3T0WF(Onv3FeKvTmc3tJZ{niO(~UCQ>NENOwsl z2a~#blKa<3Jo%G`mVwRo*s3xEFM^8+t&PD&n%h_?X&IoFW|J1$Dwc|&8Wl%Qa*_q2 zotVSSyrW`B#+F_6hnaQMGxfYjNG>-Oo$SoC?9z|qjquf1Pl=#{Y|=IE09j-2K z%RvHXovoau{oAI8p_%eu>kfAVuC`=Brh3in$Cz5H)Ghcr^GyYJa)L)#w26bb#0U#I zR=Qo15XknduZsBDyRbD3V?Np zpinS@azWy+2k5eF9b~xJ_>I{{KcXgmw`Ac0rA1!>vst~@3R%fT^B%ecVPbY5GEcQq zS9(40Ntkx4sJ+b6j}VN_S3+HF)5#>W*!*D8QF&{kbi;m&uvWvd!`fu4>FZ7e(p~m& zpAN?w20Q1in&^|$#j>B(&nqLMdGO)A%z!NbUs5>fWswKPM)@#p}D-G)2WM{4fXmOJ1FKq0=-5KMWZX?lk&3YOIoxA@iH zA+`*qT%=v$gX1P1Y~2yQTJ!x|D_dR_pT~7`e=e7Pmu%ZM{im&A2A$907S6}zpZ#3l z2SQC)L8xN9)hj85(I6=_`=kw3_)n@gDzD!DNo*fC6VZZv?n<`v3ELgoo3scm*M7{iCDa49ul#&SFcjDMK zC5|+~{R;b&lH?SL{Qg9aK6?@r{AY}MZ^i|24EbrqRUUf@-{t=8y8N!|F5`2MXJ z-hL{6N?vY#7l~coN-@$t*IU@rX(@n1Zu&K&d^=7}lAMKDJyXnV<-%>8T((%ZhqBHU zCgCk7yV8@BYfeY(9;^bbl!|$T*&af%lXr*eXz2d-hkko3@d9ly`-em-?x&B8`;)>& z+D4tJvnSlLn(o(laeR81I(G^!7&wR63=2UNRszfluC7i4MSoeMr>O2!jdENa#fD@f z?Yy+U)k#$$i~Bj^8{uw!-TS;h5l1<9te${Zp9}DAMkNyBy~WQ3yZhzo(RwiZ(AX5O zEDYv38xR$9C(K)xt4bOTAGJs80Q>3*N_XZeCZrw+{gs{Fb7yUp}8ONjgsbiK^_RgymV*LknIXO zf#BUg5ynG|2vCu)kFZUJoc{)?+ag_}+t}evWHdCOcN%~x5g;_GXp8^*m#LrDo_III zd(G4K?8(S4t=XD*JfcRYa=gfnXt%hp6n; zeIjZ;)+0r>B9#a@MMB7#>9uG!8k?h63Q`I3R99uGSa7Mo zS>N!VL;=Q|l_!_$fGt!&8x8uz+rLeP7JrD9-a2o~zLF^NUHdqWO zUii%-K#1joVP9Shw@RZ9vZ8>-UYl9y0Uol8qUpe}0j* z|6_!?{v*Qw1r0K>GW~yBk-1pd{~I=V?d9pCth({#oYHCD{!${DVJDf!y3DiIX-hL-a(`4|sjUfUF0l-ik zxDt*;_w!@GnKq!!S#0v4Z!G9=6=W|Hut(IGVa|ZdJbrEZ7$}aK>d=C+jhnImxueHU3Z3dQy@7DVonm(N) zVr&K$X9i%@zvE$mhghkutnTH-o~o&~#CO-6gK6wWQ?+Si!Mtod6Zlxn_e2E`a784$12 z^fw(97e~MWGH}`_+7p6zdbKbWr0*+CAS;utUaTG@BpDC~MvYu2L?UW{9R-|MKvLdg zmgrNRgQYQWmPb0Ie+-hsMkF)DmkFFSz}10R+!t8e&YAr>wI{OroGv{D7o7bG%qhg* zzqe$w-FtS{^?}hhre~@Jx}5>ZuMRHvi*p{sHop%Daa|N=zmB19fTIiMxBWPF$TlHZ zdk7wodZi(IBJzDqWk8lSq?bZ7ix3DvNXGq);{bHO5wgRu{x{YzP@YMeTj59Lz5w#v(S6nS&5mzKq|Dr(-d zxu&_M+i9H3bM?mrCK6$r;GTe-ZuiFwg{kw~(UrGGr8LfXSaiZazW#xIiD>`+;o|AZ^eQdq&WGE@?>9j8G*a5Tbr}TVE@bomQcy4q&YPHfdmyB!F41 zhw?ybXl=4O9u`A>+F(2qz%OKAWVJs7Fue{Mlo7Wk2!|0Flo9k~&4ozUpS$(VgMeH}3L26XW_cxZcF%;&2!xnTjtE5x(+J)e8= zyL~Z19hq;eE|F9&<-)aW6Ie^BrCFCZ8Q)jxqH|+$Zgv9Up^H}+qS)7049nNo;(Ps3 zaQaLFV$3f@P(cMas}Lc&aDY4Z>b~SiBz{&1r|x*p6=)x2`@g;b@clLpL^3s4tUI77 zB6P}u=<(qiStUH&g%&Q7c@C?bm6s~UkddyYn3^XJsg{Pa0{PX5XZm%|Gs_u_O`g$1 zxX{#4y)kefzB#_o=Qmqwga>=|abAiDyCJ!}xRVKaXnc6>z5@d4vaxPkQner+e*~XkK{f)YFfto+~z{*>fzh&$!;|} zHE~CyG9#9RRt_G+{Z3`COEKoUPLwltX%)LGPfKA?+lnjGzG_R3_ zqKzAkJ8xkXORKij!b&J-;^zAG>-y^AX2r!`b+@|d`|6^-f>mvxJA+MR+zdvBffGV? z3JIsVg5_KNFul=d;LnU4b48;4Yt4VFd(2{N$ zkBYaN-pw#CaPYdTt!^g(A2GG+y&@aLKaW)qba)xuL^Wpe>3;bh(zCHk{8J+32=z&$ zpt_R9u*uR()soaobh%}r3?)S45vXW-t(2s$sa?<&6?ya$=`otLerlQaXYou$iT>5vHD%c9BC?ABf@vA5?XK3-z?VQnQD3^S(P>6i88 zkh!_B{(1`%M~{8)IfdoeA(r(B$8fAGzt7lWMAk1J`z~H!!<<~X>HP-{(AbgUdanZr zL~F<=3f}MV_|5F#@|kup&!s{jJL(}eso6&YvAhpm9wg+~-6hHpwdR^Cj|EvCmi|d# z(m8kqRj*Ms$+*V;T@D@j7!(vl|8-e7EA;0kGAL*+;*3{tRCpDBi#gh%i`9G-d_UGc zY%EXEtvVAYa~W0AY$prv*>2OKVdhK=pU0;2>~_mr`>EP0JL}SlTza7Uzk>X@RsRnf zoMxW(yXsbU3inwJKKsv$<%iSi8@ui7tu}A>T?#-jVtn^noee$Z4N%KOdL5@mNQG}D znVDg-B@q05H1B}Pgu#xP9Yi?#1cf_`0fgr<(%cLV=NUD>Pwx8AFpDv#bv>lMK??t( zo}R*w%#3_uQUSz*8olEukAq9wYbX~1Uxd|k<4GzNoa0G6sEzpKoRSTL1|Cys=H~SE z$uf#y9BXV`@rp+AU6+&~j&Mu2AXR;6Bh2Be<1qLW0n$v`qLZ2~U$?~6II6PE{s zp?unhq*pY3C4-Ocu5BIbk8T57aJ~qNJVy&>a9|MS9WVFXy*o2!KLQsc8NY^O8NEC^ zvR-`sN%L>^+N;sIG<32i%+3;m zRZI7TI~DiLDrd)}LEyE5kZ?u%#ija&KSn!gB-7AC?(ghWn6|cletABmtR>6aemWbL zw>xuEGeltA(7>CTFP3~8RB)22f7M}!xNLv8+#w~Wu5`8c82xc#-Py8(8k&o5SrAsp zBfY^4r#GGg!2+X}h>&CQu<?7dS2xrA7i;p*{CYN`1v?%2vSE&dnKM*a zYp%LLq>*(aB4T=*1z#RsaCmdN9GD08{&VkIP|zRYTtS{Q@51n@t~k3!Vs2Xq(#W6L zavG#B0}RAp=XW6tzy#F8Vz(b5yj~G!FJGiAtsi+ZY&1jsOluO?#}O}TklhK!;S5z~ zHr>-RJyViSI%84ks-3Gq9n#Ru7E_@!5!_qF>%bohM->O+Y2m#1j~rXluOqgbG<-!O4lu2 zlbI$9v4HEqoEDT%Uz`e?-c3_ZY=dB6zhPZrqILtBBVUC;g^%zqbqGg|!HPpnQYRN0 zM)z{uNN_e+VdEyjWGT4FiGBXg*Ma!FkzcUQdEQuB_VoQv7QP8PTWvn8^751*{VaeZ z_*DpgiILwaFs{Ezwe9xcz^ThViFG}C0Hp4rcT|V}OBSB!Eu6YSJ3SIn1nUf5s zt9PP{9uTJGqZ{1O;6d<_NGU(_oUuWC=SZiL$d8djBsN62Q5e9tXKBB*4`({HZq{2L zj$dZC>Yf*Br5uee^?Pi6uAlI3(;p6k<^4O4UO41=7iKCLOTA+jY;I~50Lq7|o)J}N z4Oeg|d_$&Z{KfROB)8jLUlWC%U9^+DOAsaZ(HlBF$@(?bi^0H=Q;Q5J*!7}LL|hm% zf(*T6C(f(D>xoHfvYfi(4rv8)9j3PX)5Mdq6d{q<(%tOdlW}*w?v9HUQw%iqsolpZ zH2K^2sSiQ~rryst^?^uN`RewsyUw6vG%fR8kMWg?>)20+Mc#)+q|cE@1fZ&fASBPy zC_|Q2uDN}4ZL2cRv28~%vO=DUT2lH1scEt>2I+l6P;RaM9~2?7M0&(KUTePl+#8*V@{6gYGtBeh^wbJIpZL$&YbYf6=+p2H z=cMd2yP2DoapS+`ye*fww@X6L9<#BVE6bKmKZsWdSe8;|WD2{g7>DWD(ik*$egJOZ zp^wQ%8yiyuY~-lm4+%zE!^KTc^!c?&`Mu};cfv-Lx?Uihi(dy%Z_~d3;J2W2T6O|d zjGQ?TDn~k9K3v(-sf(^jN{ZiN5PNSOtwD6z=~fYMH+=Q?4F+sZ`3B@?m_XuOes`n@ zY$hk=bR68Kc0AdU0A1~iPM&E=K?CPmMecyhK=?l*{vJPjsw51GS^G<9KH>Yf1&A@9 zb5C;VW)Y{Zb`zSr9AsBIgq!^ZDV~iS-X-a49%5ivJ@A|ik2VsyqEuQ32P^`{T6G_C##ycAcU6TcBU0oGNi$ z;jOBRHelu#mJXp43m$hs_uyuek^gqMp|` zsNNy_)|ssKEB7L*_S5y39KXF;q*;IC<;z{)|HIcez=#$sZH{f+v29y-Y}>YN+qOM- zY}>YN+n$~GlHL59Y&PjsPAc7}ySk35`#be@1COQhJ?@W-u1tIF$1F_X^%(4J4s)df zg+%j+o}pAjZz2SR-znta^NOMk!GO;(vBzG^F{{q9Ec(VbOtX!x?P^}@o}@BQ%>>FS zbHAOKUs_yj8a~!BmsFH{IQL82h*0|5vx5|!wakOZ4?uIq;l*OElj9V049abK=_a|W}p2PZXR3e__3 z;iQs|5=t3)Zv;W&R}q6Q8vc;zX?(dBgNMOXOA(Z?j0@i`-8e>k5#Hz6!@1Is=$N295+Vb-&{JF0t#e1mf7A~VI#s3apGx+QN8S8FF$)u zBsrK39vl9LIUoQS zS)f@9D$JQc#5=tzwanl-VF0HflNBZu>={M*ECt~Qi->af&yzRryoLE7x+psQQSH%kZ7$Y`Y{nQ;|dX$MwQPDx?=Ox_~RXGouR}vgUZ!*UXF4W{Ywg_{$g< zjq@Wyrsf4xa$FM=NWosCP+$Rocu);tk!xr8JX(7+^){z_5fU^BjEmzILfh_FE(4p9 zCPaAc6-%EsbI=Q^c;1Z;PIILlbF;mvCW-EY+=kus7(ES70fx31*bIOTm`K(qY1^ZAhMh9|v~eQ)^7qV(ex~~* zZY(LpG2=>yp!_A2eL`}8am44?bPquNVWmK$==wqQsN{eKz`>w4lQ^(+SCfr;KU(ir zLZC7%AkSQ@!>ogPc){{vAmLPER;Q&dj|(FcQ8-mxvwbxj_lf=@X&rL}+=;@x4IVPH znr&Wo195ITtap&B)sX>`BVpxD=P1eKmlVne+&K?ovrFk_k`$Ki7zSSOYF;(B?HHw7 z7zov6MJ?B!W1n4Za5N%lye+Of&^=6^a^GXlwkWXz(DIO!!jhriE*WcYzmNU8NWcL~ zfc6X`e1AB@1K?`~#900X2D%FX-i)JGKb>7O2WrP#C17xeQ45MBejbF|R-fYqM3y7OZ;7<%|%-ghedKZb@42bd6eRxcOJY` zbgL|L0ijfIuiEx*@+|gj$ZT(@wBwp{$)k&?9b^WCTohf`AV*r9J_EFtn)ncM+jlh^ z>8QyFoq9?koUNhG_qFk{5KK%QhPHPCrZgGveT{4E#5`~(z9wm>CfY@y1A?GL^(VKm zZ8jduu;;RP)DVb3(~mCJB%moH*{Ji~;XMEmje@s-lLf10eXeI{2AUPHj56D#Q^-Cb zDFTLwAg*J_Q*y(2?iHe$i4O@?c)S=!MBb zIyPri-!YqT&Oo(K+{=$|Bgj1mNG?y1$XCOlol;*!cFnsS)8cq|*|pqL1CkfXu40{z zipLO4O|U9sRDdrGm}CGIYP{dat57DCRD39tY1Tr)NScMu8C-i>xeAcEXZ#95?zWgK z%5#R&PP3d6F;qoPR>@G>mxd-lfHGfwDWHztHp3khO^U^`pEUM z&EXE2*Nb|0kLf_smO@Q>K@!s{B%h##j!YPyHel6Ec#Og;HO@ZhUli20p_*WAVOlUH zw#2&-Bb}F`7`UCzP*)I_;)N4C5_?6jLzp$o6V3gc$ggwSjY6;V>uGUXJd|4j>CVBc zNe48}j}BALllD~h)DGbm8IV$10v%wSGuA7UR&ZV*p!9U_qD^P|xus0?c8`W}Io?*r zN4sELj3B|cR!mrWY3AO~LFOr0&Su-S`|}FTW~-43IdmHO8zw$___UXNP&2ufH`w|1 z8N#X05Q68iMqk6XYvDVA7&wl0f)mm(>n>rUsSXcNKcWNkjn_KCb>NhItvb!JN;y7JE0{Wh`A)h z+!mvW*)Lxmg{1mMkeH4>`Z0g|(~c~|`?G#!g*)om+i-e=^<-}4#>){y6l$cW!Q{iu zkn9<~^zOlRyVVYWJ_NbB0rb!b9 zxXGj@{$^Ao^(u*EZrIq^^WmQTmjy9U2p$Tf9XZ=F6jQV5Tv(@?Q}!Wb+VY-1gpbBL zy$i!_scmszD>7NGHBtc3HDo0AU$P8}h*?Cl0yBbo8`#?hUM@>d&+{{?WcY zY}n3w1)3?Ji{?k5F5bFCkK6aWswi8Ej$0o~X$ubKlgvcHnIUFKa$9Ilplbh zJWr(yX*JtoVE9EkSab1&26gYgG}@L``)R+?{biTcCb*}}EM<%zT(P|^&PuO7q??Q@ zp)hJ)`MKB+sD@^nDi%{qZHfe6V{Hn-ZJ$>q&#KQv2>5cRT+<}?*A_*Lldtb?(+V$X z=iXQK851#K_7KSrl>1I|=V8NLa?mb8aymg!{5y!B}LBUkh3@&-Awy6t_fPPW@pMVm>&1`;2B zK31j^liuozL)i3|WYl`<;S5wzyU4M*#R+>3u| zN^0s(oyQW7F1L4XbPcmeHZ$K(=^LA)=DkZ&_UHbK*^#IeTh1wmFxfnqogjOT^@{LV zvEjaan0>$6s9&tdQcz_}($YiH|NxBTODR?;whtAvi4a=6UpOLK>D|lgf z28H+lTI@%qt2@_qKCH3XyW<>1=7i(fuvbvtq(t??I4Ka;%o0f?y%{?JY)S=2OQsT| zT^Lxm!atDm zvprV5*8*E+L29@tz^N^0Ki8%Tat3ntKUQI&FCy=_NcD!g9Q?D?^lCVF~<$ zTMUvJndYf)1B#0GxpD02!cZ=sw}!9^?$1B=Em$CQ0wX1(jcNkYHSFgnno6rP^CMBl1y)j2e*GoSIzOojEDorYvlM1yV7U-m{#L@TXaf%g z=0%yOjxD@0)Ahs@UMC|>he(P7_HFbbbc3A< zfsRAPvLe!Nji1!^{p@EW;L;gNma`x{&GjHOBiLO+xKp`1Qn8$lVJ;ZVNk^f&L9%uO z?6_})gBl5{Ddkgz3b?ZLM9&dY3j!dx_nFjIDsPxSs%qJl-I~G1b_L%quYwK*GgXKu zF})^kzTMc$`3$!|l(wem;ye?!vhH+0@m5^98}uGIFTBpgew_k*#6X4rGz~j{kJx}!MG1B!G@Cm}!DpgeU zeE+i!_0d;-a9Ee*qTbo;sM|NJk+Vi9apn+Rufo4DAw5KR z!#Ee-r>1g?aG4A5_-UOl$P#BQXki73Xt1UoTV|cy&f4Ag6J)7CuVa5{hXp7@c6_(O z6O^X~Fo@p%R|u3-cECY6$KM|g`wUm+P8{0 zuCMr56EG5kW#s3Ac8(*8rNU z03qBO_J}5#1a0+8f>}POFOh7Gy?9HMOr?j(rk)PoaN9I4T?<0DpDIZ+&bWb7i&;Z( zQN*GWpfNbF5So2*I)l8hUD;TpQsVrCHq@hgScLQ8V%2MV;}dPQ{W#LqaYxqJ{vrG+ z{lYie-{3hGyai4WZCzo;LVm0B>BBaaz#vLICSA{wd#C~>4(aNTLNL%u`7b5vNJLU` zl(||yBhn+krk`vJcu1f?8qT#{y0@cgc5Tk7XQR zy75yej*wqXBo}9QdkJMwK(>i)dNr}^Lh1wo?5nIA)lDqpidK$o?hX~5gUvcA!s`1R zSTzvFPztomf6ElBtdg&g&Y-H;GBn^Ck0lDJ-=S1tV)B!&Ipj{S-;dP=$EOIuXJMEx zP!ASfo5`j~#v*OA1aY=<;{Z*mZrX4WDnauM%~-_jgg0;a3*geoI8k{52B+P^lL{D> zVj<2SSS<(}sv2mNhtav-?suR#`#Ebc%K@Vim#*A{p{V9kwK>@TbV zP@HOpdYDM#rH2tdONsA@6SqpMpa#t!AV9l8B=ns+b-(`_QBjjGLPIh3RhY&Ia;{o| zk~4|AXbrbvIz$AfqW&geR^%!K?~W}OdGu7dR(<)rtU^4d-!uO2rZ8jR~^+LC# zjex0FVXi`xP~cUARY+^KZ@X-|vQ+K7zmG;n!+tF!(q-qhUbiRM@z2?pOeib`3$3cb zdJTOI8rK1j#DjHy~ z$uVz0b<_6~?4BHAfr0p=s}jeQC&lyJqi8tB28)*5^&s1YxFDG+tP!EdvdXaMBO>M5 zF-6s4lSTg%NEDOjX0YCfY%r@Y!xT$zP;hY$_N_1UIqKK`H1Lk_py6QJvu|w}k~y-b z!6GrM(uuc8Poz_A0f#mdF0_R0s69I5$RtdRlq$1--edb z!1?)p#+^z4k6?Loq#-5BJyui~hNqC)@~RGJd-^7iH1S^sm2N$y$OfvdWQXqloLYFQ zK1!bXt>W|NAZIp1AAO)Jax!6l5||)m+b;JTvOMY_91X~IiWXd2<(J1-9oSj+QwUok z6UfLj&{dt-zYfzJbY|Pk(uxSP_dD(Z@+^Oa3={k&%IwmHq$!XEOs6Jv06P<)f=kNH@i$KYZ^SA6bcs9AxI1 zMds_o(pY)s6i#^{l+yXewUhYGVnxPr>KahwPztCZh@f5LsMx(2;KWG*`mL#yWoSab zpNR-%5CMXqsP+Y0zBA(FfiK&xJ1^ZgT{qn~)xefl4bSVAH(k>@mhdOc_yEK}x4n7# zYaH;fYo{P$AiZITB*5d~e9UiTy=>_8eB3S?$}GMzVt{2JyUBG8rtPXqzU)}DJ5Xhu zTS`3o>oiw7pOA82zzF@w9ZPcyW#H77 zfKTh;2NlCzTPK--0RMnzjrRxdlvB*#2LLcY@vZk8(_5xxX20R=mH;r=oZnX|T}8lu zm&yPzOO&@XrkK8T0ro+5yW1?*-F7~6YJfih{jw@@bhr|Y^+5kZ9eti-98~nEt2$zf zVZxYc0@%p~_QUj}vyV3a!~csoEC3K3Wc3K**3}G(P0mi%XOd-huZ@uP>{9(GQX?>v{g{=CkE4uh4C#Gk{c6I; zCX>CBWiTK6J6eWot9%V*KZ}W7FgA}S&`OCNe>>JPPW9E8&7e}c4x`Xy3 zjo&o1MppLGbt473{}8=uup4v&deM}>YQQAk{ABa$gIK<`Jb~687-ZCRIb=Z--4;>$ z-T!=awSsujR4bFyr_~7GR6LArs9{g&da0)id(lX&ufHPw8D7sAUfH(+AQTxdOkDvm z8#<_C_WuJvG>;-e9ahY-3870prAtcG3uj1O6@d7c!9)+KoE{aJ9-D|Bmq{*CJS`@3 zPXvy$06?4mZ(D9mdRm}GlxWMucpC%C!SB8fJ*sk=zs-+AB-RxJKqCDgCVHHv-zN0P zIMtNC;t#iK)@&5tthhFv5Nsia1qt2l(l(C@UdKKXQsL zniHGoA!lh3>eh@+c7=F0F-t2LfFQGw>UByn{WQaiX#J|xEU zlDWJVloR^OjB2G5#I6NUOpMzlyRL6Le%CRAqOcXNokMTv?o?U_rX)Q45_GDIU`e*2 zV#%l$u4tQNsqI6>i#wP%J)Z|jijzsy(~SaUHYPSKJ6Wlau^QWTwsqPorGl)t&tV6b z1IZyRewkkV1*}KMsbRS~Ns9M`Y{NGL=u>qxSZKN3#N5rr6Gjx{lQBrUhCN1t_O38k z-%t@B70MwiJc5ObF<*$=*ji`02pa6i=EH&*l6}6|Z(7UckMyg{1*!)w;Ws)-^f#=@ zE>mq97za{xjv{Gir1w*j*2&tAHb^A@v<+B>BITLu&^b{V;~tsv7%+^Z-hv$G8vj?HplAqQR$QaRQ$vWXp+>9e6r*9C3cxf^(C z<|HT#9x1KOvQ8ki32*!C=^3x`EaME%I@qR_xF*lNR;w{KTPBExKqVxr|G{M|>U2_2 zTc~gdUz9$cI2sUWKXj&hgVa|zv;KaTkWr2*lt}dn$VwU!-;je&ERQ^^-NBn4jSCH1 zrK(KuoE2=FnHkT*$=9)MI*gH9^Fr6cB~?bU!I)E@?j z!phYv)By21Ct+dXU~bL^Mo-UQf2+@LTwHe*IfyF(26Lk6sZG&_5$^c$AN@6*8TKqR1ziD z!g1Y#aX@n|8$x5=!mr8&j4+_V8zL&9hx_j8zzoSjkoOG`$FtyL$@&i{x}mXZ#d6i6 zsu-B+>hu0__^5+`*8fWx!GOMC&v!OsqK^`D=UNExWzSSDjzeV%UmLpG;0CAJ>RbEg zbhlS6YN+FqYY+Juqn;irR*xhmK9o5VVeqMJ;LkPWWG^M{ATq1}*Rv=zcPr>kzz9I6 zB<4T7ub;FjSwyb%i6=K_wOiK&in@pb*pEu=)%cLejP`unBWVf6Q2we7w8V+b2V%>RN zr)KZyJkvarJ)^$lDt+Nt46rW;#-CEuMN}99Hu%V6TJ>SvVk!x)V;_giG$jLPC>|l1 zqf2(a2cGvlZ~9&|zAbjKcDd(HmhKnT%kUb$CLEWzFnwB^;ox@=IYPkAdU(7;rR*UG zLin5p#3K8oxDGgN*_$%g_%Dg2V;c8_=J+>>FJt!isBiwCLO!K=d6XGKJj}@@3Ut~0 zw)yZ2BWJwrvE8yg#XSzJw8;;SZ(0PZebT?2mcpA3HXJSCA6c%qA8w?F5FGtb`c1Ve zZt8A=>=pBouK)74J@?X6qEZU0%(OS#3!1u{{Jmp9i2DJ_w8)iQRFu=AH0yw7^m(3< zdFqhC$MAW?d>MnHNE5|j+mbhh|HLUDaui?HBwQV8-!pIs^209vYiuK$D&;xD=M38x z8(F|?&*BxrI^}=IB6HxJ9wf2D(88k~j6N}OaBM}@O52#g*^6;JX@lMbjk(j<9xA=( z-JW^b6MblSC3{o+q|i^gjj>ZGR+d)WDvT)WM(YUU8SL9fU?8SNW{U)0OkR!3UJY8Q zR-0h6cXcSkY4t9&Nt~paC-5WWhd#7RSg4lW2ZY#;VNygXAaRLzeM&<;3kByAhFx4f-t_fhdWZC1)Cl!-H0;#U9IzbQQ^BoM$%^;#_6(y z#lQ&xL$%V`v6alq&PHk0qWh8@yh6GGv>DOL?76=aukg33C+ADxcbpOXKt>b6=6y!q zZwD12%7l#oA?>UDo1T?rfc|i!iE*g8-8kcYr)2Zvqkl8EYS zV)r+Hg(I6wwG^_s_}lLPbX?9L${s>+33^PZA!Ve<0I_kGMV=?|2z-z2FVETZUj6`s zn^g{L!2L9oO@QB^bWW8CiCR#g#QQfsu^#D^C4=wc&j$W*hgh4LLRFhY3q&&dlq#SD zg*qgRMpb=ymloR(*;WRXvt^_2Jk79EB%1RBp_Ip#ay#hlIqPeKO?vT?Zn0)`Sy_Rm z%(w*p*^}>bm3bh#tgCp-Xu0$zl=5*CB%Bg$A|a%UU6GwsGH^6e5WxN{~D zvm%}(0>yzm(+=ig6nPf@=1^ zCdNnF#auZ5&gR+`0o#%)L5#QBb$+WL#mCKoG3dxdkpeJMm2N1vGwmu0P2K+2;1JZ8 zu$T%~yZ+@mScA?0^d>;Yio93KEu8rLFpXXC{|q=%dePXrRw`Qj@2I zxnbXX8Y;qK8cM*mPY6OwZGZ%SlElxU9Gz@bowel6LFH!G4I#z>;mX8eIh}Sv@5VExZqILf{-znUB zkar`bsTs1;FPeSM@DZIyBDP;B7C#f0ACV_u?h!)eCw`khb{B>RC>}Ro6n}2!(2)>y z;*9VegZwMX2P_;HEI;&2KkbwN!6OXUAlk{-n;+jaGU3*A1gZK_tv>}tQmv8$@m>F` z21g6=eMqEbr>UeBna7Ww2fv2q3{dP5VDk|GYyr5e2wYAY{%^2^2g1@L{`o0Cbt!mV z2(C~XZqmsGANxEWHrp03+ZOZ-9!K^mKgbzBObK{?$<0c~S2e_z>dnO&W%K;Y=|*jz z@J{iM+^Nocioj03Eu|BiH!_9Y9M5CbI|^Ea^COL4H*9z}Xn1$D)jKK3`};6+WF%_l z85~0EDV)&)4tW6=eb{xcSv&B=DO}kpT!seUv@ylR=h%q$Jj4lw)?$QI*0jamk>)5NIjMm7h3OO%(Q z>B)bz(V1EQ(Xu%>{kLx39tZ!+uRwf1v^2lc0u3xdaIFj94v=~L19C=#E@cZSYa37Z zIX+?SS;!}SkK;yj1c`9ORNr|4QnK~?PBhS=Fh;e^@-ix%N+k)$X*qcEl97y79dk98%DKQpuJ*)hB^eIxMP#XztOVWj2^vQv zMJSAmo!P+;|0XjacJc{L6@KZ+O0pZk<)B1PaL~X=-vo71r3U>cb zR0?kYNRVBkGrRceGUe-sJ*5d|c$s%bE#lH`j(${v5)a)HODcx(V%82H=NvolqbRxh zHRtuVsi!)w{zQ)z(P;>8_l66<2c4Dc%dm{aj^+=-pkLXJI!7~IUG40NGRNhOSYN*F z94f`yam?}2TEdef5e!n zot?Fz^=-yDz|p_d_fP3uS{_A56@dUbFnu4YP79mZ1<`R(YL2LV(1<}iN>y_)VZCg* zqRFC3qxg793D(&whz0cPJ{0JVQk;}hXSg#Vr7X()kqby-5oLuCdn9?TUY|!?z15z2 ze7JSsB-EWqh|9=G?e>{iUlLmVD>$C@|_?^*6mXHUYX0 zE`gK@jZ}hepA{g%aqtV-SmRg!2Nk7W%QS60nz~0CaF^saWO}6gRuH5-91+Z%^|o$bE6UTn+_@Jk!CCIVd#85WA25#g1r160wNTS*0Gmj z63yL2apAW=&QP26*qi4`Wt-(?TAXkEDU$zHM}wV3Xtj$Jj@}8SY{+G*Xw(zXNXOT; z$ybanu5YGJT#D1tti|P2kE&hNipH-QRwWwu^PnJ>HZ&RuMkpc@z_FwLqN~UWiD<)( zMue`de}ndaztlrUS@IZy3&OvN(Zq#=fB1s$c)on<>pX{6P~BigU6E2wO5`Q%yER8q)RmP&VXjnGEdybs%<{#)KbKFFQ< zF%AMJ*vjS_3RcR(+p1Bg5@9{13A5?>$wsZ6YTS^m> zm9vzoP4DFDqwXaq)l$A=#z?v08V?1DJ8`*5o#K^O# z(#zM7@+y8Mj3d#2C@pw>GxWn`I;6nBH5oN$M#1;lgf=w?*2H8gj5dtTP8j%04~+!W zaa&c5*i)A7H8`ko1dO#zh*w2^Bj;2J>T#+L4MSi12OZTaAiimI1h5j+ByAN`P0s`k z0UWvm-!^;=lo&te3yx}k?dD!2AAXq4B{)hU*9Rbv{HV`g zI+Xew`2fq+7jj|vXC9Bjuxw#GkTvy3VFs>9pVP7FeGSmmd^E1eZ*qN827ss-OOuMgV=fdng(TH~M0gt!xnD8MfSx=L5{}S6~{-_jM1mM;YlFa@*+X9*{;E z=;{XqkP!}c_Y-f9$`~?IuBoOK?EWkJ)ng9VF5I^eUow|awPGHuQY`9ma|L6h^~&U{ z^f58Sdxxv14R#M&Ntx*G|B*5wv!^PlO-u_kza+L9nEDl}w^~xBWDM|2m&Dh9VY&R@ zpsEFFxcs>o60>`?(}oURfg9G))be(NTZ3^%cv_QjMhGYMN9xd9>JD1bS{i2RKpfXj zTHzm7?Wu>jpE<5aa4sFW{oXDesRy!u#YlD~B>X<@a!{xpn`OUltsl<70F)01^cq8D zFQE&J?~uWAkZ4^R&Va<`M2tRaN^PMV%u8LN8@A+{Ja_&s*&P5^#FE-@i~(#)L!leg z#2O-ZH2ALw3|&R!j_j!=a)X0!n7QS~)epS`QmGwKi|nZ%aFg$&+mm-er!yqsic-Br z=ZbQM@NbxXhz;8AH1Tn%HnM8Ldd{y@pRh4}!2&uw=x2+#e%&Ac-BMa@^h_C$LZDS9ERJ~7Fq@D45j(i zQ@nax8H3*fHa7sjBKR79)ZzIW;_U-`PxB6nuJ-W`@-x@N-_`~2^}!Iu9RPTu?d;)iL^8dmT@9&&`o_wx>U{di zuIYS+30l!jQ@oOS4R80kW9#4SnqnK@?4n^Cd)`vT)bYH+N?XDEjGS1((~`G>>eg~oR$6vOYuFGrhOmzA}q)@4n1P1 z4nER-3rqb7grDhtQk3AS8ob|47`)q){GY><-*(axQnm^P9t*zuQa_JBg=s#!z6@W# zrH8iUr=@1$$J6k=N2BzIuH--EA?-W%2XD|xBFUCN=yZgK2aB8|ABo7xm>v$uHy}{u zP!@r>T)7`|+`2S7pMXkSboFcgtv{vTf4;3BkS3U%(uyL97Nr@*<@%7pbMg$gA=GaK zlx@Y0fPB}r^-bihvOP`c)QA%nn=vqasWGDvcoaY)9Bq+6DG)!trhDfak31VfT$j-E zuj7eK89{!lm#hH8)nCF)RtmE1OB7g$k3Rj?KX#X9-d=tpt8;l=ytk?`ayBe2Ifa{6 zac+KcKyVt@%%|o^1avk)uhA`QUkdq7)#?@^^7`_7g!zSh%(ClCZOD*sUy#J9acHS6 zDP&MP-+$>M-9Yj{wJkFQDzTj_~zW3JtEQ26hLdEPUN1hsN z87$Zo<{>(}Xkf1J?X3^$hz}fykVHvfXD|zA6<}epvFJ+}7|&ySL|Qaovn~)W74Acs zw|pV+lyR1ESvjyPxDoIU>D4Y-1mN20kiq(k%*#zVq_+J*Tt;X1=ybOM;jiO9y81XY zMZ9N|JP~C1HbG%QW0}DD#}6^iWjWtuxxzj+Pr^20(L^k!bR=zk5}8=p#-Tl#Fq27H zUY%L*J9YV<&O>(Nd)}J`-qOkLdi~4i#qhF@uqEr}Fhy0!)?6=GRaM2c!t;*lUhq_7 zI-L-1bnlvY9iKbI;P*|-ED*V#mkEtI>8|+t=7gdB?^t&)9E{T60n`7KVy#el-6q}> zWFO35kPZa4gnQ2*l@oH11_YFn_`EqmpdMi^Uhd$9$~!Wqkxh2>Oa zM$#nFG;$W^%86r98c3vcW#Yqhm^k&Kq~OGuCd|cH#(DO zRp{Ce8}0;qK9w19YQ~v8UCO;Bv9L=x!77Az+GcXrsf$|_;fTu85+svGuNN8u_Q7GzRH=H>;e-HzgPmXLe$P*OhVqJ3zZi%_EwPMJI!i3U|h z^Ode_x?J7)RXsA6(yGh5>f3z-ZOhF=`MY$m-(MH)ddca&kkrH7O>DDMs#`bBe{Pg?J=E) zx|#KfBw4zE71b%$3C0r-ivrTeO6cohgZ~EW;SFTFBatgin2jzaDP|AlB>^5-?9%Aj zp4omesFAx5%nOuzSlE4}{tR)Zk=vSUMWPM3jJ~Mt5HbnjZZ;t7%Z~OC=9pim*qBAH z3A8qqU@%&S!{th--7yXvzBq`gW*jRgMf#_agib@2HJ9AbP0^bOQ!7>~z32PPz3uCO zrhR>sCy|UM+V%7XdWRv;2`lzZDzI%Ff>p3~H-*w8H@>|^FqO;DGMs0Wd@j2+- zz7X#w?Y;#ZQ`7eyN$HzCI5nthw%^aOk2b~OOX!R8EAoBIBcE?&=azm(9YR^KW?zWE z;y~#132Xp2Cia9qhsp08wsX|FaO03qn$$8t^59xD2As@-_-WC`ct&qs zNghh6bnW2K6+^~;wEdk(B7s0I>@Y?X1tk9gCJ_s!bRS4U+-{@LY4eH{_ZnU76hs|( zmsiAs9xjb^>apYmu}(R%<<&TQBl0Q|-wz295GJ_iJTg@g?p@~&V!^StBQ z7LuxTd#Tpu>`8K?=M~_q@u-O(8rO>WJpCp2LlpX7V#;RA#hLO`U_|BPhpL8YtOd_c z-v<0L+gQUofJ=ld0%m*^%p&-Pv^X(|0ewDk-5}3A<0elq7Fmpa=wfJ8!E29hm4;yg>5pY&N% zf&o|f-vnYxnwiD%VF?2Nyyj8Xb=ED`o#72aX6r&e)=U=NMx{w-)YK_B7G37Z%ld+v zY(~$2LTiFF4qgu>{nV(V-xB+D4VW(fndtuFkLYqZ1K63A26o@I5u4if>uspo3KTXY~U4uxJ7YDovV(qU;069VxUg?IAgJugr&k7b zC`$I3Db1{@&J5Oj*Y9^a-!0CPc;-!w-?$u|F<#Q!K3X~pu!g0tLivcSZgY?$0ibUx z^L^_x>oYIK-xV?eCCKTa?nbnHirR&l`MJieQ!aQZamAlJ=UmRvk1y!gEmtf(sHWo4 zwIv><8wAKLT$-fnHo4qj3Y@J^Vs(PKN%Qv7qVse6;_{GJiqs)V>o}MN;j@tZW4e}5 z?OpEKQXr&bLehx$yT{m`)@ejqK{92s71Cy!OT-|^X8rfm))g6!`6g@Bsr{`a2;(*} z!iB4LVQ}FXEM)||x;{Eq%^m2~@wqD`wBPk}c5k!zi4~o;Swdr~+Rkcl7+q<$r~ir_)US-)hC^TD z^0>?eKwI_R^UthoJz=BG%*_V=&JGCmHGBIPRG#_w5=a_55zuGY>G)*BD6f0z17 z-&=tB0;`n1m(mIWh7H9s^B_+`(#4HwnzUDcwiQ?;Oi8je%J7L!^~?)sslUp8=57n+ z2QJ)!Z4aF^qI(}a0_Cfagu6s`mngf$09wjo(S&)9*x71gPu#mmg%K7hC}mLdmwq<| z-)jPrK3dLJ;t8>3J8rNzKr#Aa{Aur4M=&X45T) zD}6?u?T)zgaGM~{1Y1l8TU<^lG!V&K*o1VI&CY2#706l8CS@E+k8qo>6vVjrT9Kg9 zg9AktX?H|*xX>UKG&+(g{8@&jf-Z%@P~Yy&WN&Is&IVnjyJsrLXR;8`Ns#Q!3XOcQ z>vo}xFKok`y(gk;;eK8$J^V=SQp|4aU*7RZys9E`B37?EO8K|}j`wZx-=wet4Gm>O zgkniv*~RM6DXbh~J3baRS1Bd8-XW0aI+M@HLMnC5Ih zGbIY^V-IOSpthkNaIkaB;8V+o>Cq`1zqt4-R#splqAz*6p9*vzQ0Q2y@CY)%ZsAoZ;LBFtG`?+alAIKA<2yDnw!sHZ?}#z8ps5@I;|?`1i_i`JO}PD9 zEQ6=tH;8GT5;Es+s)rI9e=B2PYFU{!6WJJ=VA4Uw*b%E|^0|`inG5#>7dNxs#Zby_ z%dM^Uw9W3XF}a^w5VDhzy+gwPd5F||-uLGfpU>at?R`6yb50)5bDrya-{0%L?(4>Tagyc}n`}o* zJ9Gw3ETW#+*8T=O?!XxQN3M?^-&*CXa9j*?EOLX$+R<^+>Z^+!EJB&O@g^_n9ad#6 z%PNvH9332`o6DP@^}ab;JWx7ZIo@ejsbKzS>aen9L!aKnITu|X->?^9c0P(z=Y&4f zPM!I9W*MzVjF-17`eRKtvdhZYO6>hi1&b()n}wY&nw8>1kp82Yqg|~JWpKys zTJV^K@42#UP+E2KFqd2cZg7LfjaE{m3kGHlzT>WT>2Tpbe%6PTNi^ffO90*lY4;Eyqx_ zx0*cOady0AeDr0i%>q~ILJeD!K3UTJHl^VtiTdJi4Rdl1Lv`9r<13^Ahp zg}u(Dc%3W9*tlF(&D>u z5e7BWRUKmX_qsjpuIm%}`PcZT2h?83V9jKUXRs1Y3CkAwEGdw_65{YsQP_yfEHJFe zHZAmV@Pve4BjF8&qQv4jt7XommgPg*Lmp$VGjT1n9`axF$V3hHpy`T_j(Z`LD=VV; z_$=Nf+X>1B{F&6FkEau`SQ4mAIUE(-6v%1Kp9r$lvFJ@tM4r5Xrh-*Mp~tArbYY^CxDqV0oSH_2EZo+*U(sPkFu!OXm+82t*(5d~6~jDjq&?HsI`8KAv78I#H6dnTj?H+TYO7Ln zo5=(fy0T`+bW3&_UGW1d4rn(;E^%;I-pnn5)=q>Q6=Te;wF@4IlgP`4b5#Rlc&#<8 z)aLh|FlIu(9C!6s*K<&IYDrQd#K{dCCN+OfFR5*o#>Ab~llmc}E45X9e&KUjVl0Dg zj!~gesV~#f4^u0g6d_qS?=J_k7*?tp>M&Nj`x;n|2p5I5a!6O*)t8b+5QwgyJbUP7 zuv`7j9M`j!z9MJwxX1^_75bzCxTPCzuT-z$V=q~Z#Tdkz#2-~Zq8EesLE-aFT+TCu z#kX!6-=-bD}uGJwH z>iY#xa8hGU33~St*8;K2CtA5V{f7nDDwXer_xYx5tr(D3jxuV1Th5^AE{4C)IcjrZp|;r{xIbYFEp8G*H`CT&?tquS>S)=EVYMOA^! zb&c=Z0|p7-8a_(0ci|hFZ$Ekq^;Xzp#g-ljM~W~Gdx{L>nd(Q!>Ke(|IpTOCNxDog zMy4**2{WS9g%5HvS;QMjbex$u7UV0{uh)Tz!@jCzvXb%>;!e^&NyrPBgk!>dMLK2h-e894 z&DZxIwKN+kzqu@Z^1-`8=0n2$6c6Ps?XlAi;bmR&9Y$Du|Lr7iE!&KA@#7G_8pSE| zRo7DAp(W1|UaypEx}r(XRp_XV12ajJ{XRANN9TX*JX9ZRqSe{hSni%}(KCr!Jh>n= zL#xkFzH-*oJ8%q>Q~3Si_u`lajNdNAs#vyK<{3T`83>&1e{^naOjNRnTl!|4+0&ew z?89g;Q|ND?Q;*LmannsbMvx}f5?9ePs>#i}o}J^9Pp8y3OWAj6smjKd|NSLJ-Q&7x zy;MpASH1O5^NC%4JIE_p zawpIlenJvRf1k##C4Ip`;QZtFoJ2Xr-&FI19|vM9HjXO0ym{8ik5OpTXd@Wmg?k12 z0?z!c1|C=Q=gTXI;jR(Q)GSzcjq81oFLcxjK9ZxnE9+JF!lRfqEQkXim1z8}K+J_l z=Fx!4CvVe65%gs$@wsF5i35jao2OemM2U#C(?~AejLXWa@hFE~ zLR(tQ64jc5khf`_jV53Vjx05fld?Ny=4xE}biUFK$2_i!F|g3wqy+wuAKZjwDN05g zq5m=VOQ$rcL{jPU6)g=4W-TeT+$!U2ZxwUkI4U{ybn6<}bw3GYd#z3*BS1=-E?`1G z5@1xQV;;%<;GC404I=R2^g%{L30@@RHW@FUbZ+Z592!4WC;jw6*yj`1%_EDmX9P+K zX9#gmBbvQC)*Vr4?fq`){_7r%3)OV^{o(u`kotBLna0PACOO7W(gu`58!{Nlj)t{_ z3ipz`xxbE^Ny^iH#xEGzR(17D^lb9ShT_k|s$!H0C#j7H86V6&arInSv2`_?_lR|* z$(@Ujd5FiClc&dZ;bNOnDNzq1GHKtu4&Ec704aBQy*A- z!|&k=%WC72+-Im~*{L`E70D;aFq-_2zBY8gd3;+@MhKgWu)u{t1MoqxI8D~lQC2W{ z*u|M6O0^uh`haN>1*P@cfOj-E>fBYqs(;=_j5>HfKY?I4FQgdYb6ee`}+S9ht znsiB05+|>S>rXG9ER#ro&dCucaZ!Yl;WBjortgS?w9);`G%db0BBztpHO}37B|7aY zf8P9l*cEb3)=u2<%7SAG*~KUvmYH%<=4xnl@RH@RG3goFLT>JbG@KpxN|p)+5eCK- zIYJXdQ`|q^dlZF^Z`zqdQQyNm@aVll(6nsRGf7|e-1*h}H0~#Yhl7``*tqIgD9Ze2 z^JuO=eVs^F5h2!P*}@$*_MC`%+HsXV^g&?uh(zqAhc{Zr`fVV&4?4{5q_>Nw1hgS@ z-t{?C^!QVTmoirid*zYAUZSry(jC`Adw2?1CQYK5i}iK-UJbwQad{_+u6|b{H;o>f zD|Lj0{B!U5lnUKMO8F-W=*BYVr@xXOZyqFt#7Bo%k_%dy`big!yDSZASQkrkL=2yO zSdd&m+_hLsBGH=2)WfX{LF^(tZSk4QOwNtQHBIl+O58HWi5I2}n2@HnHTa6SF3rN%}{A`FM4dz1zzvS>a)+`g-)WL$(0GdJSTRZ1MV4$@uTB4?C9p& zA0-qYp$DIK`Q%tzu4`?YfqK_`kLXO0%0)tN6_K*=cl zGLk;a5O*o3pL^i_MN~0P(TgIaAtVy1hzbFu=TN2a@8RB~rl*h*rwf_khVlm3*#~`V z9hp8Vaq=2!{N0vktU|3AF#~DTXt*D)MPd|@9EWSS*g39X>5>@hi?EM6m z#23l>Lj2B73y11{cu3alvm#M3PAD;DhEOid>#^OWUdi#g9tquL*{jBS*KE+}6m75C ztUn`aVPyt%eF49(zk>mdPEgRofkYj+tLaHtI9O;o7&tiCNtozKG|}j!uh>`_fiE(w zzr67~@VtVawS}$KH9cz*Zf-O>IV+26ih4G{+vwzkMM>zC^c-wR=p@Xp80ZOp|5NDu zpAz7A6>+c;Q?$8aqqqLA#h6H#7{Q)F1@JQhell~L_2)&If#;dFp8tL(;7h>Uz;|vm zvXL+`Z~t&D(a>lanK;(}TmPA9wtoqn)ipCTOEmCY8JXFcNf;PeNUZeGR47Tzfv1^h z!LPv=fBX%2KP@B4#xDi2?|%Wlv@$@W1AcS^YcxS6;HL(^6^W8Q+QucKVIW}yE+rc) z3o8=|13QV585%b|JtH$OiIOoI8!Zzv0~-e`_-QHWk^nEzGXcMt>FHV6>FJq;fCnq^ z5ZQR15%`*g0eG+h4;J9T2)qXV9egkFKJa<)-+<49?*qTr`g?(|*S|0DHTZt;B}P%; zHSpg7#{ypipIiTP^Xu>bh5>jFgTVR^E24xZ5Bv}Qf_2LQ7nGjF;;Jzkcpv=JY6#p^ zze4aLA_KN-Le@Qlq~U6fP|XWBB3?9vdl1Xzl4LY~T_ef%y?Qt{$~r2Flrt-+qF4HB zE9K(z#sER=82@bco}S@(&$7>=(aBiTdF_WZ@Gn-bl*KM)m1-L~E0nr5S*MIMJg{6& z>|D@~_@GFmb=S4;MdJ}{=l(AeERO~_Bl91XOds(;F!qr37>B3wAmXHRE@$e+yN;p( zm;O?nlQ^pPB|+4Cs%x2c?&4ObI7Zd3Q++KDsXi8*&~gncpx)*I@w~dQEX*qc-T|9e z*Clbc7LEg&yq)R%>G=BX_9V@?~w0kxU$FR z=uxcjVCD#pW!ZT@6*!z=+^49Gn29GE&EDuCUOtoor|*H9sAp*Xrt4GwXlGLn%) zVcch7K3+;;ADB4YK2!Za6b>1-WjlKv4w=~YA{;U>{r?9dkhks<_J!2o{#7~MwIi=dN+c9;;+C(`JA|(a zAeCu-zIf)g^lQ~vi^;i}a&4RQ(w;)!hLr;JKP8YZ;tm81y*y1M~R&2vzAB|U#)YL~msfD+UDn5Lq9Ml|y zYS&9-B*Xb)^H$niQ;x-bCS+X|hGoja#I&8Y_ya?5>-F2=5J=YcAS-2H`~MF^U^}== z819sz0TSMA3nmD|y^DwGXa8qBl#KuFcsL~QLoUnjrWN1C#`(_I4UX%c@GY1D@xMvZ zu#ocYB+X_MCP3nHT$730UGH@?zv`Sc>WE{0(i&Mg2*Rxz?rAqupVfXyc&uHF5bTlaA?;xfSLb2QMN3$IRtJe5Q3{Sm zD28j|^c&5g_y^(7*lbG_pA+(q$6k9<8pO$MX_diK^u#6+aRr_?LpTH$4w?U>Jk5UM zkZn&kh>Qn-s1evT4tGw}{7RVC+z|v4Q(%X9`f27k)IHML05;dQ{Z4x!_X^a{24tL(*0|F{T|So@`&bR@nAnlgM-cxEi1axw}mw^G>-MM*8g^6}UKss$!2WCdiq4J z?Z%h2BwYhsAJ5oW$oAZ+Id>q86e4XMc zDDvDnrx1H+b9j$yuYN9pIuU=$cMHpTRmo{&MHThLU&EjsZX^rHO-ZdOny|&*%XY)j zm!E>1>s2pDDYp-3r3prYAVE$*&>V)llcv`z`KrZ0>(H!E>T>+-1Ef49lq${%juY^X z>PNakEUvMw|1mk~{uwmIxF#cX0k&%`eWL}vL0AT~v^8xSP-QscQq|L9~Y1c)s zjas7GW&2Pv?d1w=8`GkATo*W7#4DA9KxABb5Fr>g+Zx8)utI;l_~Kd%hFei%_zk)A z*U9yHSWd3JbcG5s&rlo_l#{!8Bpf><5!dSTn4VxoHT2AN8kPjHo0Er5KYLmqZEVT< z2;@$iLGD!ILu##}jqzkLe6Xjfhf4ViV7oYuoT*-pG=-3lnCTHN!iCAr?de0yt(h)q ze)?;oP1&O9b4jFeu>*6O{i=?uKn&LHT=C zMMhdM*JVBc)Xj$Yhk=cOmYtQ2;fMH#Vb|gtV7L9F#{Ex4j=!?2nkGOB>)Mb7nJsq; zCCgj5aX2Qe;bH~xQ|T+c{3~npRvo_g8^dPblh!r49LLZ~jb!lR%d$zqZWg^JKeWsi z*S#2Nepj*f%xa2ve_x2i+ws#2->QJkm|bo>4YK^B}Y31RO!9l~@US9A_5DcEdNnfXI~Ned-cZeVUzg)usUGa+_eOU zWv9#zBmMTRKbXdDm*7Z*W%Zz(HBHvyLUZ;oLqkLvS$-+r5#TK-Q!g8x>S**zXNq!# zkZEz{A{&~387sbRsXMgen0r%z)g6v1?HnAj8q$GPt)Oo{lLTtSOxmaC6pUPN+iEnB zu3WpK$*f9S|DqP4SmB#rXq2U;nkqz41U?38|6tr~@EC`Sf$Ol>viCsmMFOO7@Ki6k zY2fD~t5^~4lnJ0&i4+8Wk*E=2~6{(cQc ziR2~?3}iZJONX2hjH}7*%p+@gyU)tAKRB&i%@Vp2w;7#F7I~+d1 z#lzFB%fq)el~E;#C(xUk62S{x8h*rb-LovmoJRlr*Ey!WnDaiv<8OMO#)u2*asKXugrmlnpAbHwxwv=&iNsWvS_j8kn z2}jxisp@@qrFCK4@vGU}g>h5#?(ZlGEaFHzCr3lprZ$Cf;VnML-^@!DxW}sEOFVe> zp{92JA|bzN&AcCo#;B{0zE%*fqY?21qA7xDkL?HeO*EeP@M!cMDv#AWBh?euxkE2Q zUw&3y5H!hxcRcMdcVlSi#Z)QOS7r`TvP(o9CK&%PJV49Eo_1@{F#KKxaubXPgyGq> zEC)!%ce-)>m2v$gRb5$Ei;G>sTHiRjx*uO^-%3@r?f{JIS2q2r<#2P{8)_`SrmCT8 z+>8uDPdM4zDktGB(Zk+vVnAj-z+Img=F<;kLVx>zbpNg`<48- z7aJU7Fy<6m+mWZJPhE#>QS#xm;Oxuso-!6I4xKyZvUoPz!FH^!i#YVODA+p%#SC`r z4GBYo%vw#Az60?n=PV)x6OaE*a))JKgX8ZNBERF2^&qf2Kyci(IEQujM9y|R)-|+F zA|7Rx->OBM< zBjiW{t&D(de9Ex@Y_9JcT<6inXIs&=s&(YCwTXgJxw9(3F zq;cX&<#U1D!sXCUz~oXIvji@T6_0M6U;*fwPf{Bp6EabpUn&VF zHBgVVT?Bd>S)szTx94BW<1}CuW-i8%L3>O5$_#0=EY2Z){L0tx&1Z(J z3~yjf*j3F_s>rAhI4s%bG(_7Gu5!_8-}O?f6&ex?=dysmkcgam`YECgk z%#r!_Vc%mKVvHg!%(+VM5VjhC=2ip+dyE5s9%H`G8$HHXk4zJo2^Z^yUU#PxTYb5J zZWi=5(!wb-ho_1&)8OsOr`qS@j5PHk2AL}D@K=L0_#TnwYJkM*WHBPxRK=u2rE^SY zxxNO?0l64%!UJ7L&*5Rc7}?^K$OA{c^+x|A=L|H_Gi?!PIDzPR0wO!!>v|vP=Rgtj z5|M@p$3INY-iOEEtwgTN1K17-le25N4(m>toWE8b0b+Hd<$vhLv@UJT2C<5|2ycdm zhTpvA!x*E4;Tg-3CxsI?_)=%;Y>7V_*lH|@O$efKqt$plR}I2XeswPFW(Uv2k}pu^ zmhmYm+fR?iHg1&!05-+1YYH?-vPr$jEoMB^VS zXYbLtCsjwb13={f^_<;{by#;z-W3o7Le^pJ^xg$@O$v->#<8!KzDQWeeiKrG;=0}oGCm(zPx{eP zJLsEAPkjzAWy0hf)X?>|WoPMypdh9i>gpW!R*eEpL&V!W*2@n-Kt8F`<>^&a$r0mFk0H_=gkGt07uva73Z|0Y^XklN<4|P$i;(^V^x~E7czwZ;ZZwGwM)1 zfYv|s9gc`H9wHL3;K=re%h`K4?n&8^{Qz(|ARK|m?zH7>JLhtKh2wT+RXQwdqtfxS zFOGL?Yyz_Yv=b-g*;#eP_n)r(d)XEj2?+Q7f z-3nC5Edg7{J1d_cjFOFa18OvYS%yfrGl3?LBNEr*$@#!+l^-D#K^d+KjuXCcyx0`Z z&qJ>qgC3q4YqHs~fqjy9%|Y0vzeya0Iw?SwtRYc>KfV>^&a$ zr0~db0Jt0wkGodouyq_cbp^~-RUZIc&c@bpQ?aUPx5ed%+Ko8b2nK1`s42hJ7+-qYPw&)H(%3%AACGdn zq<5)+rZ~$c`Pd4aaFU1+OfdeTa`qgIU?+|Kc9aNMp~ z{mni|zyH|>iNt6XXM~tmW(82IwfCijG%oQuB9_BhlLUEKz!SsuuxRD+R$Crw)#7=9LjD+iTq8KoERV>*P?uawJsrFW6!1r zB;?k&8o-W@DzKwtz3`X`c64kM9=XcN%D==#67`+{J0WR3!av4+H#Z&(f2L9dxXAg( z+S25=5J4J%Y&G7?1Z9#6v~#>oFX9Lbj_m(YDraBexF>Z-2Ef_-|Glv)n5^zvm&3ku zF6UP`{#tkpzH#Sk#-VQ>S~qVX0WtvnV}Q4+K|M{F@WUmbEm<58$+>HQBDnx?@2G9# z_DQ=iN6neniJF7bo8j0)GEI2GZ!}ZbXonKxf(@eys-d zNlMT=C#*{ZrkNc3f0WAES2*rT;gNyLIm;x;$lr%o8l~f>IrB>9q z)Z>T(rmGDeS%CfjBv%&ImTkw0AF5R%=O@cT(3cQLK()$)`1}aB6(izI^O0_qb$3Va zP!R{1@$o;(elE_hWB4bNE543E~2G;te-0DbSDwHES`^7zNv z)8yYL;5P-jI#7d$271?xk5Ph{L~LOK@;}Pw>?g5S)*JO2_WCIqbV8bOO8X zATVHfPtM{NXg!VpX2Xg2JTY0T2=@#87qQFN1zg>Ob5bs&N!N2|N2jvpu50CTkXJdI zyes91fe@+f{&_ZFZCEfO8EaOaCZqo~>3|#Gk#8AU%IKNuao`XicHWOERtrstdux$#(%3rs^@=ub)z zNwCZYbr0!w;jcSeP2ABFxegPMe+ZquCs_BS`p9q)43I%U?pmC~v2#M_SB7+a+^96P0SVALNU0}&E*LoNlzRzZg`Zg03DC#nd@0poH=$1g-g#Kww6lW;Zz z;gR%P4jOOwXMv4IE55bisWWiiB3DSFmRr0suYXbB=+G1pY1Kf9z`^__r2YW8SGe1VXGXxinV3QvJRfk*)_ z0auffXHsksYoB27Smkv=`#0KZ{aV$g*z{bJtUd+;XA;_x%27eC_IHHd;vyC>(fEha z*>g04@nR1)kO#pI8AK!S*d-c&gVEWVr~2DQtU>>?0Qt(apR);B&VAsk(D^9Is9X7u z-DZ$I;0O6n!}lQY!j+m7n|o68)AHBzE0;@dIm-3D=WUG!9OV{b*? z-4R~);eh9(yYGaEHB3PMVRZH$kb6^rJP5AHARu=w&*9iPqw{OU<7YAXZP0ySrH5}^L5HTA6%|2x6zPcC8)6OMoQoV|zR z-V`7Yf-y1($6X6_fQrseD<1y@$63hVz_Hd*FSH$c#H%8G&VqTvHRtOXb@b9I*l8ur z_8hR3D>EEWw$cr?D$81LM1B(V8gR`~QX@_VEag(&sWbc@D3j1KwXV~vt#p*t8gCh2 zDbE9@IT-XPGZ>3UrckFq(;QuRD|jp9=LlN2>_;|QJEB#@vTWVOosM%%s$CzCgHuI5 z%@GCfXpX+22MDecafS)UKWxt4!*Op4kO#pN8HD3** z{NgEhd7GykN6hcbbAUmsSlm{QM>2`N%UADQhe_rz)BhoJ_8yOWQ-3@N2FM^DcdO4~ zrr#-<^Vj<02V+DA3>VNh2iw4=t=n5pTrhM9SBNiBEHPLxbj>F@SDg~$WZfC6M|F}L zE>?(Tnt(tjO%|BrF-bi46?CzZTz9e3ViqH#SXi*?TW{{r1)4iD-+etkn(rDq7vyc* z(yz?q*RWB4G%(jz3M*(XsJb*Bw-F!@EuNl2SWKENM0pNZfWU#M3ZL~-{kvZ7Rr9*}!ee>?~#$RHqhtI%Pl-#MT2KQh+eX@6Ay zpY4zJT9lwd=NX{T0X3|SchcKYEI^&a$ru@iq06MM!ZgtlJ9cKES6FR@>0e%+f zq*mJ?>k5dJ*inojjs-pKz43LG#7OKJZnVo#EVIOHGeGJ1%|Z32TBB%jZ?qdykGQNP zHL$HdL?6I)y&Yuyksp}Zu_e%9Ofb)Rl+*c!J+lm)*%1fM>|lgI=B23k$KytcK_g`5 zD&_eYm31TJqfcpc5Os>`ZPB-kkez+%&mH4-2{F=&8ycLzl31_?jF2-*lK9$Ufe|{k z>JBQy;$nq}Uc@3MFazWtN@vdj2^PrrpaOXijF3SDx=NCZ!Gztk1J2jt#VAXyK9KnDcmZUs8b3_Is^{wZUX4*RmaJ}F=a{y8=ZfmdDD9yAfI zK?4+~KD=_zp?~(z{y9qifMrgmiW+>f34ljI=;gsNmG^X7@Z$UmeJJEvB&N{D**8ySjoFO|Szp)?=~zNVhU)qvtAI2$F~k ztN_XIhtk=5Jnl^i@*sF2gLnjXk-L)UFf;6&()ksSzxF_`Pqo@+zFMt}foeUdK?XEI zf^&3IBb6%>R0`z}Urhn$=xmI9Or`jWz4op$*FiV*df6KuzUdXgnv$6T0pjq8qRlxv zWD@v@R_`{NAfrdIKt>15SN&Ah8J$C>h;49fFJ_;^Z*3rfe09?cIX)d2+%Yx?wj?V{ zx??sJa3d_0(0uo^3QrgDfQiRHjLzQUac^pn2f+*(#3S(7B_4Om==@c{+5xtBxHhQt zt3Hh<8@53fZo`}ZaQ`WBuO2_BV2#M>(vwUYiYB`)GY|A6W2~j!khOOTB?RDjw<-(W zm2Oc$7TVicr=25(nhPjcS2(AL-Rg2UFEm(urOs(zW~WuTGY;6xNzm8%UaLPB$@K*O z8D=EmKqCGu^P=)VtqC~R%IJ_OIsnJa;pa#ShZK-qQb;`p;)$Xsh+27u;-Z0cRlS?$ z!$LeuL+;l?KD$om`cGn-4l19;#lFG^8o*QpFf;t&bM_vMdsBft2xiD28h0zu0TmBB z73loBecayP0gPb%ow-&s5%S{>kk%DCw=aF7u3x}%a_zHNx6t_} zLX`#1?pSu_m?kdOHgr`eBc{KfNsY28nN2buLNTRLxBjc)~x3rSR)q5PK98sfifO9ADPwXZpZIY+JM!5nJG1JSxukfyQ?o zO5IHLMGZ_|KtHnD3T?Grt?K(&LSuAcqG#VMYd-c$C-ICABZfVOttV&v!{+Qg826_3 zco6)M0VZen>Kw+MvpK(P9)ZzT2n^WXlS34Pg*x0(33asKXsaiOTs&T&A)&V~phW4? z+~U_SwXW9<{rp{>LkUjrKoc-!uJ7BdJ~E3C_hqYL^w9w6DllrU3`kcCR7$_S6T3e^ zyV(FK0W?73_y5K6kzmvE5gD+2G#mQ4+VNeT6E$SK;6qx(0Ze{u={^dPC8IM1%yYon z<7uB-nC<|~jDNVCy@%tTlpYxmf*Udj$6af4n0CtLz$kTqaCA+`x@S<~z!NR zbBM*%hd1UvnlT)*8ti10u(=0FXO#Oy#DU&9 z<_n|cYl|Gvkwos&&)HC8Vq1-@yB)x=fM8vDlBxL7I51UhB?K#vjX?L~MyaD4@dXlK z*3s(l0U;iq&V#EL;c`@o=BIPVTo%tVIqFTU+pk*JN8@+Sec}IdqJ}UpYQxFO4L-~f zwh(~n50$g`Xxx*+BjZ6ZLk7{fYhe!4&Z(SVf}_k&RL)DV*-GfAW~;N#>Sx!Rt$gcC z03pDAANh(&fygWRrMtvyjP`{?W6^)tl|q?6{U>}>d$XkSsl~iDo4{Z|<%Xrj~ilH@%&0BU6O~%*hejGH0J70lFM`u(5;FS#oGII(Dz? za)v-+^$`|-CQ}4~IS)~>2_ReTf)DP1Ed*ft!{h8d9QUN|$aoN}kU=;CT+Z%fIZQj} zaX5bAaejhh&3a#lE6~@0GA05Tudb{cuc}#D(Hd>rIF3pYeBU^JZ|g9+!&`--hVe=r z7&EtQ*-Ks;Z|Eq;+hwR|R1jpT;l5ty0A=KowC7sa;h5>ZAtP6RZ=nUhO-5e-Lq`5~ zjA(0ehhwIlyZG}2>z3SJHKJvc%UbzcT^(V#uvGv|e~6sDN8_H99T^XT4>E{G;IT_I z?wZJv`5BElI}VQENaRfy-ahbjkp4i{7v8!74g3{ULJp9*%obbYwgTF32DpcP+|c-Z_!;Ymwt;IKm2!o4Km-E1jvc zCH`ojDY+mv;a}j0v~HWT9gX)vG_I_pF$_dw-!HLIWrwlx2O8CgJ&WU?6YTiFb zGkf#Jrsd z`KLjWzkE-0@Ox&$X}}6t%sbuSvM~LWP*e3YD$&CU9*&BYJgL&d!bZVz{yfWhlJhhq z3_O=w+aR57wat~4Re}}g6R3jG;et|e^I#r+`)2Z=PU&AAzOkwjT3OZE*t~W4x48K* z55Lp>#J@T`aN^L)N(i)Eeb0@UCmVfiJe}?-U=Ha*JN_%$pRn4`{<&BMPotuXb9K=n6b$FJYhRc6- z_O+14a^Rz{Y!u!+dotX|Fb}^yIPKZlH`i7|p|x$zm78~duoi9=%){?=efn2t4{a{5 zgw~crAPSpj{}eYH=HYj`l>Mv2S3w|c(B{fE$mX3N#P~NCe_vL;s;ctx#;Rs$oA@U1 zivH%-+n-er3aP5Bg_gG|ZC-pA+@~-v{=TewmCXR~JE4`Gn-@P=5w{ZN;rC_LYp!am zYA%OVHg4YeK_s}3U><&7R=r9{C-4*0c6M&zz6|#T%){@?s@L3HTV7S!+14nv`Pm!d zX2Lo=>%OddRh`X^ZH=9^wOhEifxYIl?#rqN?X0YAZfk^AZUtOk+;W&_zvET!XPxvv zXFCvRGqkZ50+IWE?VU1l?O+~#UlzSiNMmI!q^+uQ>!UY?4SUvoS@bG_6}J(Hc|XFv zD(p3vbzc^}T42R#gSJ&|MV#RCxFs+z{=O`Fz@1lB4z21e-(2*9+HrGW9)4dIz1m9P z+E)TA-`0|E{Wq}Rmqo9$va_+OwyGSmwdO|t&8@dDi(V%bI6AZv3fY1^DQ+38i_f+% ziyn~dK+A!UU$wR5ap$1s#n_r#2!vZ`TW9lTrsw1ad&y_pmqia! zUJHRj%bRPrK6+-{448M`{w#Wp5FpioR#j~Vyr9c}bNGE(^r|4`jm_od=-g)L7VOht-+4Qp1p2RT{Mu$*1qcOjPLjB=2JkZPc;+I@zxmvO>>k+M zw>58O8cyN3u;w>0bL`842dxA`JrM1Fu&G$MDX<{Vu`gL(Eu<6D1{{C$u5$|go0H#{ z^$yt8Hv-$6$}J{4s1tS-W5?sf{?$znz`e1uysD~pE7B9dCe%3gWxcBfP93Ntl>b=o zCSaG4c09f5U!6U`CDv9!n>(vE7rdbBu(!4x`?BCwRYIzOc+>V{dvg&t9mb6h%6NBX zjq|V09sqnfu)At2--LY-1#TM5!~f4LPs#DR9toZ7RbxdPGc-CG5*B(iI#DAlYa0?K zb`~@`DLr!o8$%LCM&_S230-Pt)*Y-ks}tJKdT68K#f!`Ool3If*z4Y#cd^ImXBHGB z3AgD>hnx&Cja{DC^hl+q%4txz*WAP|)JF2uVQLH=pGuyj+(Q-dRE`n}KOq7R^`%4) z90~!%`w?F7Z;{~9m2iA5JSc0X@Z=?iVr@sA^Aej`QJP>-$hR1a7|ICLrh_90J1`QwL&37ANzD|jxO;vEs4 zs!Ena3q3)1Dpl^nT`#4@UW8PEZyKIC`KQ?uj|UQ*x?3qB==J<0ielrbHxkHdADw;Y zj=PA%-@?X(_$8g{p`t%kA&Dva)eT+L2p%o!Z2oD%7tM)s@GWI3Co|;pFU*J^o|qZU zTIgd_jpK57j>X6NVGKeY~zWT#o&8u=xQx#@59Ijk@BVhhyPYhae~!(o?Mwz5=Z4YJQAnqU=u!TV-F=Vqx{#+|;B z?Dj=62V?GLt6SV+8udt{^G#6#r%&gaZ5Cn{{M`CGh#!=lWxF!vx72+9k)&*sb&y46 z)ZoRF=lt`g-0mdU_CcvRE@U00svypJ2~qH?zjnyafBN$mzvK+6Q;93Wb3AJpg2hAL zw_aeH5O%XBo9T9>y)e>iR6cBW|EV&X$+q7}qJ>DS@Zf{6yBd{WU>BQ+@GWL&B@f4w z)zEt->Q`o6kXaygDAY%7ELrS5)Hhi(z+G)&(v}V`6?>kI?&In>t$$VfsBc$~pn8?zUb7patbCm9e&^#I$*m*U66m7Y~ou2!Rn-; za{U|l>casx04x`R@8yJ`1PmROKRqWzuhlZ2EI6Wn=JeVic6TxL<1`JeDnruDGz~mi zKB>o~uOY-ih;i2M&WtBozeFtI5-5X=)aZ}+285N{6pNEPhE+8c$G)CTecZ*ENyvRV zn{={Un$bN}bk-&o6IJvEtui4_rwtL8XO z?_Yc#>UyQe)9~iQYiVwI!LOP+5d?OgL~n&%VjRwjF=AcgoQ-I{g)JtGB4M>EC(iS1 zvZpL4IKMaf+|oIgqo}K&L$2Bd7;#1>kA@vLl=|#^;q8(B6)+ZvYdj_tb}JmSU++>~ShBg8M3t7p&e-sBpOt3} zrAn%?clr21MEy8ImZc{7P>0TFteX~1vcB^D5XqQ)%7)Q}d%Zy?+E0w5mcY{>VJ5z( zP4vNftX~kDDiP)jJb0iSh*qS?e*?rdIn548@z|qq>F-@40+7 z%VnEK!>S;?*u^Y)M`vP|EGxT!&0AtTlw)vQbA(sfih8+-xII!faJofSFrT@~Jmyr7 z?TJ$qq?w6No@N^31sxfsbTRoPOZ1dgXF&wB=1rk)P#gv7{UUUTbTX-F!k9$}`7odA z-3a8AoGTH%@BOnVp;-PJop2`i#TJ&#%TY>C^i{ zo*O5MaF;(;3YB}CYw+F;6+K+nOOmVhz6-NPAh7^m$|1zGB!pwoxLJ)4N852II%<_) zaHN~kC}(!Miys?&LB?6moPFCx^^Ugq=FXTz0eCLhkq_B$#{t90x@@F52N6a#s zS*g5wm-!*sv%4<*h?j>E->0)KkL{iR0 zyNM{T_%0x=pis6aF#4;tsI>3k(-SOs&(y`F^@x4pJ45t4(@m*-pWUH9Rqx%Y@Ifeg zfG}F`Wi*RPG|}Q<1#$QQ1?t7_kO79*PnbL1<)twO>V;PGBuni-2`-#JZOk;?`%<`L z*>{zhpidOVUUlu1upG{j7iPT34DMs|s}ZO=_&u%ypRXOmc4$L2;t)Evc-FVHJO9pG zu2NT#>fmU16yA=eF_qG^B91WF7Hr^xFC=d{e~acC@9~I!X{DFl>c_&agzHX` zKBJB9_h(o3I^Q=PoGQxf5Eg2QAEx_(o!~H{!F9~zhd$w$pC=432!aop_9Q~STCD%> zDQ)nZaa?Ka8^L#_4tr)dlNnZN<_kQEofh@RMPwN{75}n2P4Eg1YsgyxWlUuf%SOJB zcAg4n)*{k;k2Wbi4kzG3cTMExxPbdyLZhYX>o?67k24J6lt=>eL<+Ut5_cO~^x;y}GwBE~-B;${O%1tcqA_uwaJ>+C>)|UGJ8M_1 z+8PU)OoJf{Kkp?>?J_5`TYLlw`1*^3IFi~*tN1C~|{7rP$5TCgBU5s~j+DY@tG ztLUFdvO2REV-a{O%b-c5pf8urt)P!3RxUtC?%R`=)vrw-h+i#PE!jsJymHX+mwi2% zo%7~y+pFLVUH-j1Med%2VPkaw6YEPg}t+NL^&#@7%2T(X}+kz^df&LV{eoH$r90bcM%nfZJ0;$ znuar&AKeNcX8oXQVs`}7ZqSY^vg}rjc|HEX5HVR3UsAfI*h_-!QAuAXoha0kUG**W#bd|#M6;wQ@GV&xO2E#-(6$U_V0FQIVDp; zqpeK#HG#j}OMv_MiJKQ{j<=y93|zPFQlnO=zKtqmT#w5?LoSVNY+KmP(4P>9?vi` z=3s%~1%oWy0qO0Zt*5SAZrDZh96hGo#RGV^%tVo7`{5VR4~VOYq%AkAcBZ~$r<+x zlTE9R@|e#om?txB`I1(S+2-#ffv#(2Zf{D4tarx~Nrcz`KB2~RLba|6CxjkhnIS~Mx<1^rC&11u;^ZeRg02* zUl(_z>hi~0wYt$zRFsy*I&4|&146g;bzS5#U<~?VUCc{$U zNYr>cKdVN3p$XAA6%~xA7sf!m7drsb#XUV^1 zPNIIu>^U!qg;Wj!?sAKHVwNppZqfqfoMYmGBNo{NV#QFaIboqEMVTC7=u7h(a&1`H zYDTrKMj1&o)Fx&hi&~F4aV4E~ggZ3Y%pr?gVoIGAm#28g50T0zQTSec1JQZL z@KSBLI{9%EH`D{FsTMNX*v@R~gh`qd&% zQ4{0PHS`4EmL8Z<{(thJ{}AO_n72iF4(7i^dBXoI>@0)gV77HlaJS$V+?|0y2=2il z*x=6K8YH+o!2-c81b4T=3GQxz2|ls{}9s=J-w zuQAe>)Qvam9x33@hKpu&#w|5Nf|J7W#bE|7wp(dqNtbq9@oXEmlajJ`TVrOBQcZ&x z;c$j4;xBy82)C;$lpOYzI*Heku4ML;ro`5C_mTXOLJ=Ep+HX2b-h!D`7P-2gXQq$x zag-v_M?EH?k$bm~@*p%AQHG?0C7(6PPoGa@Ulx6E$i5U`Vl*~3GV51`^2y?(x%-pSvy#=y#M0o6%3jfq zAQpL$Y2?I&TqGdGA6_QNrV7_erzrK4DO4*}-0P1rzPYS#P?{Z%4_6uu!K@v1A2XJm zj}0Z@Os(?cEk~Gon5Y>MU-{xY`g0xGjLZ~2`r5EpDNQd27ITFT<>MFee|mzkOxA*f zK&sb%59MN@ttP$36FBJeVz;kYer}Hw>AslB%b$J#xMiE9)YmISJ%9P`$662n%R5jY zyu}CpiO;x+`c~PNO7{2UD4s+P;QaY{XZ!T1=<{Xbd!G>=uw!8R{Y+kNvu*9PxD8Dn z#+^U}@?G6@6UDC~XoCj0w}o_!)V@jF7jmMF`j)Gle`kBG@%rd`^=(!EZa#A^;|EDW zOm&M1{}&%$5ksS$FwQC3$p8uSp1Xz<;+>idX^@-|sMt90=@TDV+_)=mN|f**#2B{W zq-4F1dg3gOZycoW8T4}d=SsqC^QY3azmSB(LAqXcRA8$4XBVOkY5S_TeejqA--K3WSRh95r_2$$kDF!i1}YF9z~>hnoK&RNO|e~eL%GzSZOF}io#))Th~ zOGJx`XUmmmSfUfxwa`)D8u?MGF;LP7x!k7~bWnc9U}o&cltvjk7O%Sz2 zdLvak%T7g~^M-0k96w$Rc@sVK$PT~D>CT*|d}X534(0aZfzkESV!oGzY7VMrP(mpi zb&(X{Ks#_BXFQM(b9yFV*x-9f_WFE%zH599rgTWN+wFH+@)N?{N6g)rb;;yYU)7`nf*3NZ}^Xd zAm?vyrUcnUcfn#Ml$tS?Sm!?57L#iAel@2~Gx*1=r2wrWf*?g4H|p)73?7s|-_~xP zq!C7RV{5O$j3}eu-;E}TX<{LF>5VvNzSHGDlGzi&CF&%uESSpXjfjF=3nqw!*!5}= zlI1@LH<o1>v?e)`KbHyft#3speavBW z+PYv7Fn}Y3`wn`$nW44e_g-rBfzDUaJZgi}ugU4A40G#MQCE0)k`3@9G)L6pH z>o>{3#H-{AeR0W8?=0#IOn-Vga%Z*`hK@e#Ohm*wRGqRzsH9CFo-Incikx5A6{fr~ z-V{kian_~H{Txv{Xd5RO-PAh}=OHnzDfmQs8U$8hX@vitxMPSX6}BmIaPFt+>FD%tXtPXuwDVU*R|9V9z#?HLP&nvIhJfu zbWA75yugrn>&V?}KhkC_gtobn+I$ViXX zxC|k8sx*vt%#rsIZW8(8@rp4Wk&MAx3|nXX1?pnudWLmnQF6Way}!Ol#&o@FCJ9aicR zgGC=lsokJFfvnqq6b=7t7xVuo8vfl)5#SXO`VY}C33TwFlp}dMGo5`?*z*1u7FN`- zr+{4^t3-mff^sGGl{rx|*~m|FqV{0pn2{EnecEtrun z4Nmm&VHs#%Ojzg;AvS)MVVe5prLW=EM@34AGMbZypUSb{R2*tEMPb*ABV$@oKY^t> zKz$9==o4@eBSyU5D#9zl?*GDsj8(y|NTNv1M1-}~iy$q~*N$Puore5dn>XUu2kp^9 zE9~@N$Y;DN=3F6ktV(K$!H$?)_!@W|itdR5BusKl!n@-<)2J?aG|ED46g83a@PXA| zw-<#*{W=uSPj`;4#@u>0_Q%WTEPLmBySGLDdfa2H=wkCkhE8N+2I6W_>dV)&*`xNr zhD8hGJh9L6FY|5LaK{L1`M6PteUEVE7MMIxa$N5Ax>he~59%yzm}ffm!?H;|3QxIo z8kKZhQ^Zip_XG%Mc|NGbH5== z|LQN4oBVig8$A5fWoaXmDT#*sm3HDn{4B%8ERqY7$qKGlE9-v0C#`^pUQ0T<>vMNi z#U8|p=>a@Z<0)%*M}e(9ri;&hZmLgqYQFL=F8ik4Z9UZD4SjKZoV*5NI*Z=w%4IJW zcg`lh$Lm+-4MtpfE4HK%cmN!}`fJg`h?}_)?QYd(k_U|EYK}+)+>eRd-dov5cY>4$y9RtXdYWi6S#F2u%V4=qRb>?sRRa-!((lw80#K+!T~do^vRf6ax` zcZ(VN(vp3^UqfQUT{C9OwQF83p(nti3l6N~@9&N+R{f~&BVcFW6#F*$l(zua z(vr6^IdeFAl0xkvR5@$2ToswogEk>J1~KJT82;}pAkv6Mti=R5R5GV+h%WCv3rVA0 zwMeZ_RDhiRpi3MCd-wx#nUj*4nHn2lDFTS2XN^q`C&9M@ae2cZI}b*vnAMO>vTq z;{#=QsE9p7lL{^;Dk7`O5k;y@-|#`COMLAPcYoBDBPoW)>E;A&cY_l?Iw}9xZT$TB zMA2{eHSdy51?D4RRT9bf;c0^Pl?<8ZMn7{N0lP>GQ8=emtBQTqau@XN2b0Wo`HvH` z8@8Prt<#7vACK2dL?l_zK%*oL+lZES{3M;sb-O~oQfr$yu1c4fTe9wS2y0c`Wz0|= z66v?(3sPKjO#D^|B&^P&2;a++4_&5y<>24rh_6>aky zAA1WJaOy3Bz*(nz_%5EF)mt_D4nM1*HWw#5p+u`H1~JlqlwBMzwqKrp+MFB_mG@L) z%~Xne2HrKglYq}`r{E}JWMa=UNrGa`H)OMr<&}p}8Ueqm!}@}e92$tQBatCXy%!0K z{!qv9tryj2wWJKUuR8~$xGf{NHsiRZ%eW+c<`0~gNMc*_kRx=qqf3|Q2UWP6&gO8F z6@(?0`4Eci4C%gN!s9F!0dBnxlo}(5v~%J8t*KtfD~n=XpsR6py-P2e<4Is6*iT}iJTRI=zEjC z5=^3NjD1}-LS6?pn%I;ZXy=Y;cc`Jh0B_RK#9lvm9wB0O0c`-Cj31LJ<@Lt(2F z=~q_zfg(-?;+isCNV)r->h4gdW_#+(=w?T>do9De@f=)3?lh+eL))IUQSTiqv*ZFUA(E=B;@Xl_Odjg>*oN*F4604)HIp5m;Xr4uGz? zmuhg?%DV_oLG5Xb!FnD9oYWL)c$4Zb79PFGTsWSn3K@UJ18+A|!=x3hY(OV1CnSm34ObU81X0XDQ z(O~41LGgChXynnoP!fs3aKzS-!LXa7${%{IJA+~w(@z|VA5~4eSMJ$i$8=XXoj+R% z^lr5?&Z9d6v^1m2In3P`vHGWSwL2zQirG|ZV5Nj0Byrbp<&?OI@osOLsM{|a`S?Yx?eXI|wR1aG%L$5WPVPB*hZtb5^s=LH zx)L$9i>b{86YN`#)ZPvW+wC35AaI;))0zhLTG4{7>WZ_2FZ)nneF=s0yg@U7K+5#( zdrywJ(f!n=BSdfnR920Cyi(TgKqtkPcFLK&$AN#jy1QT2fabv0qSRu(5aD=j08Es_&X# zfjM@z?OqA=K6_UTr$&2dLnc2SRhpgydN{JSI<5+)g(hCjK1h%s=2U6>sJcsk$kFM3 zCOEk>QBuEJF6JWQ$GY80b2PL&kza~rSA2Fp6N#VC`t&*`&ohW#6&AUPYFb#Qmt47l zQ@kk7g9D_)E$als>$&4sUaAf2MbNtk3chH%S^p zdA!<(PvRWNdz>K#*4GVnrryWVU15UD=26dC4IkpJJLgs3+%!+;3-(XoO~4#2(@RM) z-S1nuv61^Fhl*JQad4sAX>XSg?2 z?Dakl`Q3_Rs9WfajRDPpS*6vo?zfK~z~NyYqohcc92{xQRN!{Pr-_z4z04ZR^jvGlryWlb_Ggbo`{Ethi>sJ3<@r?I9KnH!DoJ1{Pmt} zgJ+jrPpWM5vk{fli=TrXSr)M&tkAQ+e8TM3gqj)*oAG4(;T>j>6MGkXz*d*vd%&bF=NuibUQBZX~k z{L#vVfNPxAEAo1IHPuF%=B0s&CX~`zA;{GlY$mJ>)K2+SkMektQS@ZgKS%8Esj?qN zR46dM!--yZw%cc0t}Z$;rn=m@&nyBCFo43dChF)VtNfTbV|xG z>!k^b=hJ&I1@<7MDb(tve?0sDo151L`C0#k_1C6<*1fs;Z3`AasU^9GKR8CGAScUd4?xT^D+&z>ekCQv zDEFnPNH8-t0s+WcK(9lDLxw}+Qz+Rb89GKjQzVshzP$Z>J<78UyPM30*=$vrlMSbH z;L31Qpb{S!fB?Dg%Hul9qx{N~9zemUpy)_YxI8G{W=2?bhEcGbDUx8;z?eX*&u2IL&h$X|_-CF!-V-Djd-USRNr z(n9SPyVAbSx&x&+K*ZG~M`{VCG7fT6TR)U?g;D*hyt;+68ljie)Y^g|{1M7>Y7o)L ztj;Hg2T|o67*^&>%)?+{b;P?tgD&M%K$cqWu4DPkhTP^Z)Z}~2-%YFMu$azl@YMXm z0iq42-^K>WEk9BMFy_9rB?3T%B;LOr>%=$UjdCTS zNdi-TL7SR;dAX*k*W1*ZonRNQQf7ElFv%SKrPulVlEo!8S)msO7jclPQ7ZrC+t&4B zxagQ5+YjR1AW<)H`tD1?^4V*BKb2H=4A05g4j`f-%X+mG%rt#AUsc)BTDIwHhX zSy*G+p@O=!dF3*5AAh~*Qp)mS>{=^q*6SBDEqZ}>XWcUr=2kYF(qFQ73i4MYh(A~F zzlv!}l6AMQbOKx;8if#r$|1m#Itw!ShS7X@;E|h2#8Ut5>hz9j!DRl zTT-i%hn_xXjew*rB!1YWq{Wvm5UY;1Aw8zl!x-OpXm}{|Ck9!vT)HU(M$_(}+JUx8 z{?C?nPl(qs`R!%CEsPU8pHebK6jQ0Pl&=}<|Ag+tQ|#1F^+FhNYZp5-QhL(w&_~g} zI%vtpfiSqfTcTxuN9KBWdPpVNtt2i%Y(`R3+hM!MHzq!1K@)tAZ!>E z%3Q9*m8H~ZCp1~u4oKRcM+7Ry+3|4|es7BZI*$odsP=?`Yy5NkRqdnS@ar~7WzR+{mheNde- z`zPftnlpZ#P}K*=$^p^>7O#6sH?DBh|Oop^m)+OE^s_gnsLqz9Ss!Z&Azh%k?q zH!M3W#1{xX2Kzr;`gk7t!X_^&@qR7)7*5J?U34B@T<~0==h}Ti(lO zgT=Ab9mB!tz1wL0+M+v0Nx#}pc6`sKP;x%+%hl*?i(L@H_VTeV8c0p*!Pyq%4(33_ zQpo!zBjcHb^m_lN!XNOf+ht{(2s!GhlWrtN$ocH87^1aDQ%Pe2WkDrV!d;Yd|$qs0vXZaHwZkDxebn z?fZa6^)Br!WErRQyw`kLYYTEwdBpAW_qU}Nq@`%)SmGAvLj{rb{mMfjA4{auNQRR` z65)!ht3U-kEoiP_X^wk@3;XwzofV5Uj1l5FFIRt>p?L?@Uz@7E*EY?rI)-iDZw+rm zg!z<~dkuFz1#^gsh3l&g2Ru=7pv69~tJgQu)Q8eMJIJ=q3hop2tBv5ge@vUtPD2FR v*BbG9 Date: Sun, 27 Jul 2025 11:07:37 +0200 Subject: [PATCH 022/109] build on windows-latest --- .github/workflows/makefile.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 741cfef..622a868 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -59,7 +59,7 @@ jobs: path: build windows-build: - runs-on: windows-2019 + runs-on: windows-latest strategy: matrix: floatsize: [32, 64] From bc5a711659055f123f262ff0ccb50302ffda7feb Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Sat, 2 Aug 2025 20:31:05 +0200 Subject: [PATCH 023/109] use clock_getlogicaltime to avoid deprecation warning --- pdlua.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua.c b/pdlua.c index 562340d..932508f 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1886,7 +1886,7 @@ static int pdlua_clock_free(lua_State *L) static int pdlua_systime(lua_State *L) { - lua_pushnumber(L, clock_getsystime()); + lua_pushnumber(L, clock_getlogicaltime()); return 1; } From 567d61823c6a1e273aabee28cc4a478d0baa521e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 18 Aug 2025 16:03:52 +0200 Subject: [PATCH 024/109] Fix (and simplify) installation tutorials & examples pd-lib-builder has means to install entire directories, so we should probably use them, rather than build our own (and broken) install replacement. Closes: https://github.com/agraef/pd-lua/issues/81 --- Makefile | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 7f71a2c..3b199a1 100644 --- a/Makefile +++ b/Makefile @@ -47,17 +47,15 @@ endif pdlua.class.sources := pdlua.c $(luasrc) pdlua.class.ldlibs := $(lualibs) -datafiles = pd.lua $(wildcard pdlua*-help.pd) +datafiles = \ + pd.lua $(wildcard pdlua*-help.pd) \ + $(addprefix pdlua/tutorial/examples/, pdx.lua pd-remote.el pd-remote.pd) \ + pdlua-meta.pd -PDLIBBUILDER_DIR=. -include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder - -install: installplus +# the 'pdlua' directory contains subdirectories (with subdirs), +# so we need to list all of them +datadirs = $(shell find pdlua -type d) -pdx_files = $(addprefix ./pdlua/tutorial/examples/, pdx.lua pd-remote.el pd-remote.pd) -installplus: - $(INSTALL_DIR) -v "$(installpath)" - cp -r ./pdlua/ "${installpath}"/pdlua - cp pdlua-meta.pd "${installpath}" - cp $(pdx_files) "${installpath}" +PDLIBBUILDER_DIR=. +include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder From 998baa0e99db01f5ab26ae4c36df42a16ce4da61 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 29 Aug 2025 20:05:08 +0200 Subject: [PATCH 025/109] Fix multi-instance crash when pure-data instances clean up symbols --- pdlua.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/pdlua.c b/pdlua.c index 0177864..df3d0a5 100644 --- a/pdlua.c +++ b/pdlua.c @@ -136,6 +136,19 @@ void initialise_lua_state() #endif +// class_new class names need to use gensym of the global pure-data instance +t_symbol* global_gensym(char* s) +{ +#ifdef PDINSTANCE + t_pdinstance* last_instance = pd_get_instance(); + pd_set_instance(&pd_maininstance); +#endif + t_symbol* sym = gensym(s); +#ifdef PDINSTANCE + pd_set_instance(last_instance); +#endif + return sym; +} #if PD_MAJOR_VERSION == 0 # if PD_MINOR_VERSION >= 41 @@ -418,7 +431,7 @@ static void pdlua_proxyinlet_init /** Register the proxy inlet class with Pd. */ static void pdlua_proxyinlet_setup(void) { - pdlua_proxyinlet_class = class_new(gensym("pdlua proxy inlet"), 0, 0, sizeof(t_pdlua_proxyinlet), 0, 0); + pdlua_proxyinlet_class = class_new(global_gensym("pdlua proxy inlet"), 0, 0, sizeof(t_pdlua_proxyinlet), 0, 0); if (pdlua_proxyinlet_class) { class_addanything(pdlua_proxyinlet_class, pdlua_proxyinlet_anything); class_addmethod(pdlua_proxyinlet_class, (t_method)pdlua_proxyinlet_fwd, gensym("fwd"), A_GIMME, 0); @@ -464,7 +477,7 @@ static void pdlua_proxyreceive_free(t_pdlua_proxyreceive *r /**< The proxy recei /** Register the proxy receive class with Pd. */ static void pdlua_proxyreceive_setup() { - pdlua_proxyreceive_class = class_new(gensym("pdlua proxy receive"), 0, 0, sizeof(t_pdlua_proxyreceive), 0, 0); + pdlua_proxyreceive_class = class_new(global_gensym("pdlua proxy receive"), 0, 0, sizeof(t_pdlua_proxyreceive), 0, 0); if (pdlua_proxyreceive_class) class_addanything(pdlua_proxyreceive_class, pdlua_proxyreceive_anything); } @@ -491,7 +504,7 @@ static t_pdlua_proxyclock *pdlua_proxyclock_new /** Register the proxy clock class with Pd. */ static void pdlua_proxyclock_setup(void) { - pdlua_proxyclock_class = class_new(gensym("pdlua proxy clock"), 0, 0, sizeof(t_pdlua_proxyclock), 0, 0); + pdlua_proxyclock_class = class_new(global_gensym("pdlua proxy clock"), 0, 0, sizeof(t_pdlua_proxyclock), 0, 0); } /** Dump an array of atoms into a Lua table. */ @@ -1353,16 +1366,17 @@ static int pdlua_class_new(lua_State *L) // fail silently, return nothing return 0; } + snprintf(name_gfx, MAXPDSTRING-1, "%s:gfx", name); PDLUA_DEBUG3("pdlua_class_new: L is %p, name is %s stack top is %d", L, name, lua_gettop(L)); - c = class_new(gensym((char *) name), (t_newmethod) pdlua_new, + c = class_new(global_gensym((char *) name), (t_newmethod) pdlua_new, (t_method) pdlua_free, sizeof(t_pdlua), CLASS_NOINLET | CLASS_MULTICHANNEL, A_GIMME, 0); if (strcmp(name, "pdlua") && strcmp(name, "pdluax")) { // Shadow class for graphics objects. This is an exact clone of the // regular (non-gui) class, except that it has a different // widgetbehavior. We only need this for the regular Lua objects, the // pdlua and pdluax built-ins don't have this. - c_gfx = class_new(gensym((char *) name_gfx), (t_newmethod) pdlua_new, + c_gfx = class_new(global_gensym((char *) name_gfx), (t_newmethod) pdlua_new, (t_method) pdlua_free, sizeof(t_pdlua), CLASS_NOINLET | CLASS_MULTICHANNEL, A_GIMME, 0); class_sethelpsymbol(c_gfx, gensym((char *) name)); } @@ -1746,7 +1760,7 @@ static int pdlua_receive_new(lua_State *L) const char *name = luaL_checkstring(L, 2); if (name) { - t_pdlua_proxyreceive *r = pdlua_proxyreceive_new(o, gensym((char *) name)); /* const cast */ + t_pdlua_proxyreceive *r = pdlua_proxyreceive_new(o, global_gensym((char *) name)); /* const cast */ lua_pushlightuserdata(L, r); PDLUA_DEBUG("pdlua_receive_new: success end. stack top is %d", lua_gettop(L)); return 1; From a71223f7549faf8f2ee8308235b55e1d0b82c3e2 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 4 Sep 2025 14:19:51 +0200 Subject: [PATCH 026/109] Fix potential startup crash --- pdlua.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pdlua.c b/pdlua.c index df3d0a5..9f04494 100644 --- a/pdlua.c +++ b/pdlua.c @@ -112,10 +112,15 @@ void initialise_lua_state() iter = iter->next; } + lua_checkstack(lua_threads->state, 1); + iter->next = t_getbytes(sizeof(lua_Instance)); iter->next->pd_instance = pd_this; iter->next->state = lua_newthread(lua_threads->state); iter->next->next = NULL; + + // TODO: lua state will leak, we should clean it up somewhere + //axluaL_ref(lua_threads->state, LUA_REGISTRYINDEX); } #else @@ -634,7 +639,7 @@ static t_pdlua *pdlua_new return NULL; } } - + PDLUA_DEBUG("pdlua_new: start with stack top %d", lua_gettop(__L())); lua_getglobal(__L(), "pd"); lua_getfield(__L(), -1, "_checkbase"); From 473bce98f93e72b7e1d0f642bb79aa8afcf20cc3 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 8 Sep 2025 16:05:00 +0200 Subject: [PATCH 027/109] Fix another multi-instance fix --- pdlua.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdlua.c b/pdlua.c index 9f04494..182b142 100644 --- a/pdlua.c +++ b/pdlua.c @@ -672,7 +672,7 @@ static t_pdlua *pdlua_new PDLUA_DEBUG("pdlua_new (basename load) path is %s", buf); //pdlua_setpathname(o, buf);/* change the scriptname to include its path pdlua_setrequirepath(__L(), buf); - class_set_extern_dir(gensym(buf)); + class_set_extern_dir(global_gensym(buf)); strncpy(buf, s->s_name, MAXPDSTRING - 8); strcat(buf, ".pd_lua"); reader.fd = fd; @@ -2850,7 +2850,7 @@ static int pdlua_loader_fromfd t_pdlua_readerdata reader; PDLUA_DEBUG("pdlua_loader: stack top %d", lua_gettop(__L())); - class_set_extern_dir(gensym(dirbuf)); + class_set_extern_dir(global_gensym(dirbuf)); pdlua_setrequirepath(__L(), dirbuf); reader.fd = fd; // we want to have the filename with extension as the name of the chunk From 2bd1efb69532cca3dc7a7e2b465adf4e8ce2c695 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 12 Sep 2025 13:58:47 +0200 Subject: [PATCH 028/109] Multi-instance pd fix --- onelua_multi.c | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 onelua_multi.c diff --git a/onelua_multi.c b/onelua_multi.c new file mode 100644 index 0000000..a87bd6c --- /dev/null +++ b/onelua_multi.c @@ -0,0 +1,8 @@ +#include + +pthread_mutex_t lua_global_lock = PTHREAD_MUTEX_INITIALIZER; + +#define lua_lock(L) pthread_mutex_lock(&lua_global_lock) +#define lua_unlock(L) pthread_mutex_unlock(&lua_global_lock) + +#include "lua/onelua.c" From fa4803ec885ecc807d4bf0d6e5e0256930f5411d Mon Sep 17 00:00:00 2001 From: KottV Date: Sun, 14 Sep 2025 19:57:17 -0700 Subject: [PATCH 029/109] Fix missing return. --- pdlua_gfx.h | 1 + 1 file changed, 1 insertion(+) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index a58a10d..468d541 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -477,6 +477,7 @@ static int draw_svg(lua_State* L) { SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_svg"), 3, args); + return 0; } static int stroke_path(lua_State* L) { From dc7454281572d6f2d8b6da30c4040c189b366cea Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 10 Feb 2026 18:06:25 +0100 Subject: [PATCH 030/109] Helpfile fix, fix potential threading issue in plugin --- pdlua-help.pd | 2 +- pdlua_gfx.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pdlua-help.pd b/pdlua-help.pd index 75bd044..6139dbe 100644 --- a/pdlua-help.pd +++ b/pdlua-help.pd @@ -193,7 +193,7 @@ #X text 8 323 Graphics mode is enabled automatically by defining the paint method \, see below. You can also set the size in the constructor (or in any other function) \, like this:; #X text 23 394 self:set_size(100 \, 100); #X text 814 1537  ; -#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width) \; \; g:draw_line(x1 \, y1 \, x2 \, y2) \; g:draw_text(text \, x \, y \, w \, fontsize) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close_path() \; \; g:stroke_path(p \, line_width) \; g:fill_path(p) \; \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 53; +#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width) \; \; g:draw_line(x1 \, y1 \, x2 \, y2\, line_width) \; g:draw_text(text \, x \, y \, w \, fontsize) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close_path() \; \; g:stroke_path(p \, line_width) \; g:fill_path(p) \; \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 53; #X text 326 816 \; -- Mouse down callback \, called when the mouse is clicked \; -- Mouse up callback \, called when the mouse button is released \; -- Mouse move callback \, called when the mouse is moved while not being down \; -- Mouse drag callback \, called when the mouse is moved while also being down \; \; \; \; -- Request a repaint for specified layer (or all layers if no parameter is set or if layer is 0). after this \, the "paint" or "paint_layer_n" callback will occur \; \; -- Paint callback \, passes a graphics context object (commonly called g) for main layer or layer n (n > 1) that you can call these drawing functions on: \; \; -- Sets the size of the object \; -- Gets the size of the object \; \; -- Sets the color for the next drawing operation \; \; -- Draws a filled ellipse at the specified position and size \; -- Draws the outline of an ellipse at the specified position and size \; \; -- Draws a filled rectangle at the specified position and size \; -- Draws the outline of a rectangle at the specified position and size \; \; -- Draws a filled rounded rectangle at the specified position and size \; -- Draws the outline of a rounded rectangle at the specified position and size \; \; \; -- Draws a line between two points \; -- Draws text at the specified position and size \; \; -- Fills the entire drawing area with the current color. Also will draw an object outline in the style of the host (ie. pure-data or plugdata) \; -- Translates the coordinate system by the specified amounts \; -- Scales the coordinate system by the specified factors. This will always happen after the translation \; -- Resets current scale and translation \; \; -- Initiates a new path at the specified point \; -- Adds a line segment to the path \; -- Adds a quadratic Bezier curve to the path \; -- Adds a cubic Bezier curve to the path \; -- Closes the path \; \; -- Draws the outline of the path with the specified line width \; -- Fills the current path \; \; \; \; -- Called when DSP is activated and whenever the DSP graph is updated \; -- Called for every audio block \, passing tables of samples per inlet and expecting tables of samples per outlet \; -- Used in dsp function to achieve multichannel output for specific outlets \; \; \; \; -- Expand dollar symbols in patch canvas context \; -- Set the object arguments to be saved in the patch file \; -- Get the object arguments \;, f 82; #X restore 446 409 pd graphics; #X text 324 384 Details on how to create GUI objects ------->, f 18; diff --git a/pdlua_gfx.h b/pdlua_gfx.h index a58a10d..3e5fffe 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -266,7 +266,7 @@ static int get_size(lua_State* L) // we make this global because paths are disconnected from object, but still need to send messages to plugdata // it really doesn't matter since all these function callbacks point to the same function anyway -static void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*) = NULL; +static PERTHREAD void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*) = NULL; // Wrapper around draw callback to plugdata static inline void plugdata_draw(t_pdlua *obj, int layer, t_symbol* sym, int argc, t_atom* argv) From 4fbe18f318028ab0ab14b3c0e6e4f9b927cf07ca Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sun, 22 Feb 2026 13:14:59 +0100 Subject: [PATCH 031/109] Fix broken multi-out in plugin --- pdlua.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pdlua.c b/pdlua.c index 182b142..3983a4f 100644 --- a/pdlua.c +++ b/pdlua.c @@ -3061,6 +3061,9 @@ void pdlua_setup(void) post(luaversionStr); // multichannel handling copied from https://github.com/Spacechild1/vstplugin/blob/3f0ed8a800ea238bf204a2ead940b2d1324ac909/pd/src/vstplugin~.cpp#L4122-L4136 +#if PLUGDATA + g_signal_setmultiout = &signal_setmultiout; +#else #ifdef _WIN32 // get a handle to the module containing the Pd API functions. // NB: GetModuleHandle("pd.dll") does not cover all cases. @@ -3076,7 +3079,7 @@ void pdlua_setup(void) g_signal_setmultiout = (t_signal_setmultiout)dlsym( dlopen(NULL, RTLD_NOW), "signal_setmultiout"); #endif - +#endif pdlua_proxyinlet_setup(); PDLUA_DEBUG("pdlua pdlua_proxyinlet_setup done", 0); pdlua_proxyreceive_setup(); From dcb89c1f543e7297906679f52f2eafea929d906b Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sun, 15 Feb 2026 11:38:38 +0100 Subject: [PATCH 032/109] Fix pd 0.56 compat --- pdlua.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pdlua.c b/pdlua.c index 3983a4f..e4a6cf7 100644 --- a/pdlua.c +++ b/pdlua.c @@ -63,12 +63,12 @@ typedef void (*t_signal_setmultiout)(t_signal **, int); static t_signal_setmultiout g_signal_setmultiout; // This used to be in s_stuff.h, but not anymore since 0.55.1test1. -int sys_trytoopenone(const char *dir, const char *name, const char* ext, +int open_via_path(const char *dir, const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin); // Check for absolute filenames in the second argument. Otherwise, // sys_trytoopenone will happily prepend the given path anyway. -#define trytoopenone(dir, name, ...) sys_trytoopenone(sys_isabsolutepath(name) ? "" : dir, name, __VA_ARGS__) +#define trytoopenone(dir, name, ...) open_via_path(sys_isabsolutepath(name) ? "" : dir, name, __VA_ARGS__) #ifdef PDINSTANCE @@ -1332,7 +1332,7 @@ static int pdlua_set_arguments(lua_State *L) if (redraw) { // update the text in the object box; this makes sure that // the arguments in the display are what we just set - t_rtext *y = glist_findrtext(o->canvas, x); + t_rtext *y = glist_getrtext(o->canvas, x, 0); rtext_retext(y); // redraw the object and its iolets (including incident // cord lines), in case the object box size has changed From 3fa78896ec9749d540792cef8783b2f06708c7b6 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 11 Mar 2026 14:53:43 +0100 Subject: [PATCH 033/109] Fix for plugdata API change --- pdlua.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdlua.c b/pdlua.c index e4a6cf7..b8d15f4 100644 --- a/pdlua.c +++ b/pdlua.c @@ -989,7 +989,7 @@ static void (*nw_gui_vmess)(const char *sel, char *fmt, ...) = NULL; This allows opening an in-gui text editor instead of opening another app */ #if PLUGDATA -void plugdata_forward_message(void* x, t_symbol *s, int argc, t_atom *argv); +void plugdata_forward_message(int type, void* x, t_symbol *s, int argc, t_atom *argv); #endif /** a handler for the open item in the right-click menu (mrpeach 20111025) */ /** Here we find the lua code for the object and open it in an editor */ @@ -1063,7 +1063,7 @@ static void pdlua_menu_open(t_pdlua *o) #if PLUGDATA t_atom arg; SETSYMBOL(&arg, gensym(pathname)); - plugdata_forward_message(o, gensym("open_textfile"), 1, &arg); + plugdata_forward_message(0, o, gensym("open_textfile"), 1, &arg); #else if (nw_gui_vmess) nw_gui_vmess("open_textfile", "s", pathname); From d4ef78b9be68a330433fcff36bf10748702bf72c Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 10:24:30 +0100 Subject: [PATCH 034/109] Properly document path:close function --- pdlua-help.pd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua-help.pd b/pdlua-help.pd index 6139dbe..cfa0200 100644 --- a/pdlua-help.pd +++ b/pdlua-help.pd @@ -193,7 +193,7 @@ #X text 8 323 Graphics mode is enabled automatically by defining the paint method \, see below. You can also set the size in the constructor (or in any other function) \, like this:; #X text 23 394 self:set_size(100 \, 100); #X text 814 1537  ; -#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width) \; \; g:draw_line(x1 \, y1 \, x2 \, y2\, line_width) \; g:draw_text(text \, x \, y \, w \, fontsize) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close_path() \; \; g:stroke_path(p \, line_width) \; g:fill_path(p) \; \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 53; +#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width) \; \; g:draw_line(x1 \, y1 \, x2 \, y2\, line_width) \; g:draw_text(text \, x \, y \, w \, fontsize) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close() \; \; g:stroke_path(p \, line_width) \; g:fill_path(p) \; \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 53; #X text 326 816 \; -- Mouse down callback \, called when the mouse is clicked \; -- Mouse up callback \, called when the mouse button is released \; -- Mouse move callback \, called when the mouse is moved while not being down \; -- Mouse drag callback \, called when the mouse is moved while also being down \; \; \; \; -- Request a repaint for specified layer (or all layers if no parameter is set or if layer is 0). after this \, the "paint" or "paint_layer_n" callback will occur \; \; -- Paint callback \, passes a graphics context object (commonly called g) for main layer or layer n (n > 1) that you can call these drawing functions on: \; \; -- Sets the size of the object \; -- Gets the size of the object \; \; -- Sets the color for the next drawing operation \; \; -- Draws a filled ellipse at the specified position and size \; -- Draws the outline of an ellipse at the specified position and size \; \; -- Draws a filled rectangle at the specified position and size \; -- Draws the outline of a rectangle at the specified position and size \; \; -- Draws a filled rounded rectangle at the specified position and size \; -- Draws the outline of a rounded rectangle at the specified position and size \; \; \; -- Draws a line between two points \; -- Draws text at the specified position and size \; \; -- Fills the entire drawing area with the current color. Also will draw an object outline in the style of the host (ie. pure-data or plugdata) \; -- Translates the coordinate system by the specified amounts \; -- Scales the coordinate system by the specified factors. This will always happen after the translation \; -- Resets current scale and translation \; \; -- Initiates a new path at the specified point \; -- Adds a line segment to the path \; -- Adds a quadratic Bezier curve to the path \; -- Adds a cubic Bezier curve to the path \; -- Closes the path \; \; -- Draws the outline of the path with the specified line width \; -- Fills the current path \; \; \; \; -- Called when DSP is activated and whenever the DSP graph is updated \; -- Called for every audio block \, passing tables of samples per inlet and expecting tables of samples per outlet \; -- Used in dsp function to achieve multichannel output for specific outlets \; \; \; \; -- Expand dollar symbols in patch canvas context \; -- Set the object arguments to be saved in the patch file \; -- Get the object arguments \;, f 82; #X restore 446 409 pd graphics; #X text 324 384 Details on how to create GUI objects ------->, f 18; From 37f046612243e020cde8f37a8b92b8e1ca5524d6 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 11:03:20 +0100 Subject: [PATCH 035/109] Fix init and text align for plugdata --- pdlua.c | 2 ++ pdlua_gfx.h | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pdlua.c b/pdlua.c index 46f15de..8e5b61c 100644 --- a/pdlua.c +++ b/pdlua.c @@ -604,6 +604,8 @@ static void pdlua_proxycanvas_setup(void) 0); if (pdlua_proxycanvas_class) class_addanything(pdlua_proxycanvas_class, (t_method)pdlua_proxycanvas_anything); +#else + pdlua_proxycanvas_class = 1; #endif } diff --git a/pdlua_gfx.h b/pdlua_gfx.h index b2047aa..9676810 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -460,8 +460,7 @@ static int draw_text(lua_State* L) { SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y SETFLOAT(args + 3, luaL_checknumber(L, 4)); // w SETFLOAT(args + 4, luaL_optnumber(L, 5, 12.0f)); // font size - // FIXME: default font size of 12 seems arbitrary here. how can we get plugdata's fontsize? - // FIXME: ignoring the optional alignment parameter for plugdata for now + SETFLOAT(args + 5, luaL_optinteger(L, 6, 0)); // alignment plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_text"), 5, args); return 0; } From 70d4aba93833565cf1f366d075d56ab10dbad056 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 13:32:48 +0100 Subject: [PATCH 036/109] Move properties to own file, clean up implementation, implement properties for plugdata --- pdlua.c | 10 +- pdlua.h | 11 +- pdlua_gfx.h | 464 +--------------------------------------- pdlua_properties.h | 511 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 525 insertions(+), 471 deletions(-) create mode 100644 pdlua_properties.h diff --git a/pdlua.c b/pdlua.c index 8361e0f..86f60a4 100644 --- a/pdlua.c +++ b/pdlua.c @@ -29,6 +29,7 @@ #include #include #include +#include #include // for open #include // for open #ifdef _MSC_VER @@ -58,6 +59,7 @@ /* BAD: support for Pd < 0.41 */ #include "pdlua_gfx.h" +#include "pdlua_properties.h" typedef void (*t_signal_setmultiout)(t_signal **, int); static t_signal_setmultiout g_signal_setmultiout; @@ -1530,6 +1532,9 @@ static int pdlua_class_new(lua_State *L) /* a class with a "menu-open" method will have the "Open" item highlighted in the right-click menu */ class_addmethod(c, (t_method)pdlua_menu_open, gensym("menu-open"), A_NULL);/* (mrpeach 20111025) */ class_addmethod(c, (t_method)pdlua_dsp, gensym("dsp"), A_CANT, 0); /* timschoen 20240226 */ + + class_setpropertiesfn(c, pdlua_properties); + class_addmethod(c, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); } if (c_gfx) { @@ -1556,7 +1561,6 @@ static int pdlua_class_new(lua_State *L) pdlua_widgetbehavior.w_activatefn = pdlua_activate; class_setwidget(c_gfx, &pdlua_widgetbehavior); - // NOTE: It is possible to do this just for the object, not all gui objects class_setpropertiesfn(c_gfx, pdlua_properties); class_addmethod(c_gfx, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); @@ -2961,10 +2965,6 @@ static void pdlua_init(lua_State *L) lua_settable(L, -3); // properties - lua_pushstring(L, "_properties_add"); - lua_pushcfunction(L, pdlua_properties_add); - lua_settable(L, -3); - lua_pushstring(L, "_properties_newframe"); lua_pushcfunction(L, pdlua_properties_newframe); lua_settable(L, -3); diff --git a/pdlua.h b/pdlua.h index 8a4989b..5adccdc 100644 --- a/pdlua.h +++ b/pdlua.h @@ -25,8 +25,9 @@ typedef struct _gfx_transform float x, y; } gfx_transform; -typedef struct _gfx_properties +typedef struct _pdlua_properties { +#ifndef PLUGDATA t_symbol *current_frame; t_symbol *properties_receiver; int frame_count; @@ -36,8 +37,10 @@ typedef struct _gfx_properties int checkbox_count; int numberbox_count; int colorpicker_count; -} gfx_properties; - +#else + void(*plugdata_properties_callback)(void*, t_symbol*, int, t_atom*); // Callback to add properties in plugdata +#endif +} t_pdlua_properties; typedef struct _pdlua_gfx { @@ -64,7 +67,6 @@ typedef struct _pdlua_gfx int num_images; #endif struct pdlua_proxycanvas *proxycanvas; - gfx_properties properties_panel; #else int current_layer; void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*); // Callback to perform drawing in plugdata @@ -89,6 +91,7 @@ typedef struct pdlua t_canvas *canvas; // The canvas that the object was created on. int has_gui; // True if graphics are enabled. t_pdlua_gfx gfx; // Holds state for graphics. + t_pdlua_properties properties; // Holds state for properties panel t_class *pdlua_class; // Holds our class pointer. t_class *pdlua_class_gfx; // Holds our gfx class pointer. t_signal **sp; // Array of signal pointers for multichannel audio. diff --git a/pdlua_gfx.h b/pdlua_gfx.h index fb71c55..e202bc0 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -554,6 +554,7 @@ static int reset_transform(lua_State* L) { plugdata_draw(obj, gfx->current_layer, gensym("lua_reset_transform"), 0, NULL); return 0; } + #else static unsigned long long custom_rand() { @@ -1688,6 +1689,7 @@ static int reset_transform(lua_State* L) { return 0; } #endif + static void add_path_segment(t_path_state* path, float x, float y) { int path_segment_space = (path->num_path_segments + 1) * 2; @@ -1804,465 +1806,3 @@ static int free_path(lua_State* L) freebytes(path->path_segments, path->num_path_segments_allocated * sizeof(int)); return 0; } - -// ╭─────────────────────────────────────╮ -// │ PROPERTIES │ -// ╰─────────────────────────────────────╯ -#ifndef PURR_DATA - -static void pdlua_properties_createdialog(t_pdlua_gfx *o) -{ - pdgui_vmess(0, "ssss", "toplevel", o->properties_panel.properties_receiver->s_name, "-class", "DialogWindow"); - pdgui_vmess(0, "ssss", "wm", "title", o->properties_panel.properties_receiver->s_name, "{[mydialog] Properties}"); - pdgui_vmess(0, "sss", "wm", "group", o->properties_panel.properties_receiver->s_name, "."); - pdgui_vmess(0, "sssii", "wm", "resizable", o->properties_panel.properties_receiver->s_name, 0, 0); - - pdgui_vmess(0, "sss", "wm", "transient", o->properties_panel.properties_receiver->s_name, "$::focused_window"); - pdgui_vmess(0, "ssss", o->properties_panel.properties_receiver->s_name, "configure", "-menu", "$::dialog_menubar"); - pdgui_vmess(0, "sssfsf", o->properties_panel.properties_receiver->s_name, "configure", "-padx", 0.0f, "-pady", 0.0f); -} - -static void pdlua_properties_updaterow(t_pdlua_gfx *o) -{ - o->properties_panel.current_col++; - if (o->properties_panel.current_col == o->properties_panel.max_col) { - o->properties_panel.current_row++; - o->properties_panel.current_col = 0; // not used for now - } -} - -static void pdlua_properties_setupbuttons(t_pdlua_gfx *o) { - char buttonsId[MAXPDSTRING]; - snprintf(buttonsId, MAXPDSTRING, ".%p.buttons", (void *)o); - - char buttonCancelId[MAXPDSTRING]; - char buttonApplyId[MAXPDSTRING]; - char buttonOkId[MAXPDSTRING]; - snprintf(buttonCancelId, MAXPDSTRING, ".%p.buttons.cancel", (void *)o); - snprintf(buttonApplyId, MAXPDSTRING, ".%p.buttons.apply", (void *)o); - snprintf(buttonOkId, MAXPDSTRING, ".%p.buttons.ok", (void *)o); - - char destroyCommand[MAXPDSTRING]; - snprintf(destroyCommand, MAXPDSTRING, "destroy .%p", (void *)o); - - // Criando o frame dos botões - pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); - pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); - - - // Cancel (Close window) - pdgui_vmess(0, "ssssss", "button", buttonCancelId, "-text", "Cancel", "-command", - destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); - - // Apply (send all data to pd and lua obj) for this must be necessary to save all the variables used in the object in a char [128][MAXPDSTRING], - // I don't think that this is good, or there is better solution? - // TODO: Need to dev the apply command - pdgui_vmess(0, "ssss", "button", buttonApplyId, "-text", "Apply"); - // pdgui_vmess(0, "ssssss", "button", buttonApplyId, "-text", "Apply", "-command", command); - pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); - - // Ok - pdgui_vmess(0, "ssssss", "button", buttonOkId, "-text", "OK", "-command", destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); -} - -static int pdlua_properties_newframe(lua_State *L) -{ - - t_pdlua *pdlua; - const char *s; - - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) - { - pdlua = lua_touserdata(L, 1); - const char *title = lua_tostring(L, 2); - int col = lua_tonumber(L, 3); - t_pdlua_gfx *o = &pdlua->gfx; - if (o) - { - o->properties_panel.frame_count++; - char current_frameid[MAXPDSTRING]; - snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)o, o->properties_panel.frame_count); - o->properties_panel.current_frame = gensym(current_frameid); - - // raised, sunken, flat, ridge, solid, and groove. - // Create main frame for set of configurations - pdgui_vmess(0, "sssssi", "frame", current_frameid, "-relief", "groove", "-borderwidth", 1); - pdgui_vmess(0, "sssssssisi", "pack", current_frameid, "-side", "top", "-fill", "x", "-padx", 10, - "-pady", 10); - - // Title of the Frame - char labelid[MAXPDSTRING]; - snprintf(labelid, MAXPDSTRING, "%s.title", current_frameid); - pdgui_vmess(0, "ssss", "label", labelid, "-text", title); - pdgui_vmess(0, "sssssf", "pack", labelid, "-side", "top", "-pady", 5.f); - - // Create content frame with grid layout - char content_frameid[MAXPDSTRING]; - snprintf(content_frameid, MAXPDSTRING, "%s.content", current_frameid); - pdgui_vmess(0, "ss", "frame", content_frameid); - pdgui_vmess(0, "ssss", "pack", content_frameid, "-side", "top", "-fill", "x"); - - // Configure grid with 2 equal columns - for (int i = 0; i < col; i++) { - pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frameid, i, "-weight", 1); - } - o->properties_panel.current_frame = gensym(content_frameid); - o->properties_panel.max_col = col; - o->properties_panel.current_col = 0; - o->properties_panel.current_row = 0; - } else{ - mylua_error(__L(), pdlua, "properties"); - } - } else{ - mylua_error(__L(), pdlua, "properties"); - - } - return 0; -} - -static int pdlua_properties_addcheckbox(lua_State *L) -{ - t_pdlua *pdlua; - const char *s; - - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) - { - pdlua = lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - int init_value = lua_tonumber(L, 4); - if (pdlua == NULL){ - return 0 ; - } - - t_pdlua_gfx *o = &pdlua->gfx; - if (o) - { - char pdsend[MAXPDSTRING]; - char checkid[MAXPDSTRING]; - char checkvariable[MAXPDSTRING]; - char sanitized_frame[MAXPDSTRING]; - o->properties_panel.checkbox_count++; - - // Sanitize frame name (replace '.' with '_') - snprintf(sanitized_frame, MAXPDSTRING, "%s", o->properties_panel.current_frame->s_name); - for (char *p = sanitized_frame; *p != '\0'; p++) { - if (*p == '.') { - *p = '_'; - } - } - - // Generate unique variable name - snprintf(checkvariable, MAXPDSTRING, "::checkbox%d_%s_state", o->properties_panel.checkbox_count, - sanitized_frame); - - // Initialize the Tcl variable to 0 (unchecked) - pdgui_vmess(0, "ssi", "set", checkvariable, init_value); - - // Build the pdsend command - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties checkbox %s $%s]", - o->properties_panel.properties_receiver->s_name, method, checkvariable); - - // Create the checkbox - snprintf(checkid, MAXPDSTRING, "%s.check%d", o->properties_panel.current_frame->s_name, o->properties_panel.checkbox_count); - pdgui_vmess(0, "ssssssss", "checkbutton", checkid, "-text", text, "-variable", checkvariable, - "-command", pdsend); - - pdgui_vmess(0, "sssisi", "grid", checkid, "-row", o->properties_panel.current_row, "-column", o->properties_panel.current_col, - "-sticky", "we"); - pdlua_properties_updaterow(o); - } else { - mylua_error(__L(), pdlua, "addcheckbox"); - } - } else { - mylua_error(__L(), pdlua, "addcheckbox"); - } - return 0; -} - - -static int pdlua_properties_addtextinput(lua_State *L) -{ - t_pdlua *pdlua; - const char *s; - - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) - { - pdlua = lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - const char *init_value = lua_tostring(L, 4); - int width = lua_tonumber(L, 5); - if (pdlua == NULL){ - mylua_error(__L(), pdlua, "pdlua is NULL"); - return 0 ; - } - - t_pdlua_gfx *o = &pdlua->gfx; - if (o) - { - char pdsend[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char buttonid[MAXPDSTRING]; - char entryid[MAXPDSTRING]; - - char numvariable[MAXPDSTRING]; - - char sanitized_frame[MAXPDSTRING]; - o->properties_panel.numberbox_count++; - - // Sanitize frame name (replace '.' with '_') - snprintf(sanitized_frame, MAXPDSTRING, "%s", o->properties_panel.current_frame->s_name); - for (char *p = sanitized_frame; *p != '\0'; p++) { - if (*p == '.') { - *p = '_'; - } - } - - // Variable save the value of gui obj - snprintf(numvariable, MAXPDSTRING, "::numberbox%d_%s_value", o->properties_panel.numberbox_count, - sanitized_frame); - pdgui_vmess(0, "sss", "set", numvariable, init_value); - - // Command to send it to pd - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", - o->properties_panel.properties_receiver->s_name, method, numvariable); - - // container for button to set and text input - char text_button_frame[MAXPDSTRING]; - snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", o->properties_panel.current_frame->s_name, - o->properties_panel.numberbox_count); - pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 1, - "-padx", 5, "-pady", 5); - - // create text for identification - snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, o->properties_panel.numberbox_count); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); - - // Create the number entry box - snprintf(entryid, MAXPDSTRING, "%s.numberbox%d", text_button_frame, o->properties_panel.numberbox_count); - pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", numvariable, "-width", width); - - // Create the set button - snprintf(buttonid, MAXPDSTRING, "%s.setbutton%d", text_button_frame, o->properties_panel.numberbox_count); - pdgui_vmess(0, "sssssssisi", "button", buttonid, "-text", "Set", "-command", pdsend, "-padx", - 10, "-pady", 0); - - // Pack the entry and button side by side - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", entryid, "-side", "left"); - pdgui_vmess(0, "ssss", "pack", buttonid, "-side", "right"); - pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", o->properties_panel.current_row, "-column", - o->properties_panel.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); - pdlua_properties_updaterow(o); - } else{ - mylua_error(__L(), pdlua, "pdlua_gfx is NULL"); - } - } else { - mylua_error(__L(), pdlua, "Types checks failed"); - } - return 0; -} - -// static int pdlua_dialog_createcolorpicker(t_pdlua *x, const char *text, const char *method) { -static int pdlua_properties_addcolorpicker(lua_State *L) { - t_pdlua *pdlua; - const char *s; - - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) - { - pdlua = lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - // const char *init_value = lua_tostring(L, 4); // TODO: set color here with table maybe? - if (pdlua == NULL){ - return 0 ; - } - - t_pdlua_gfx *o = &pdlua->gfx; - if (o) - { - - char pdsend[MAXPDSTRING]; - char buttonid[MAXPDSTRING]; - char colorvariable[MAXPDSTRING]; - char sanitized_frame[MAXPDSTRING]; - o->properties_panel.colorpicker_count++; - - // Sanitize frame name (replace '.' with '_') - snprintf(sanitized_frame, MAXPDSTRING, "%s", o->properties_panel.current_frame->s_name); - for (char *p = sanitized_frame; *p != '\0'; p++) { - if (*p == '.') { - *p = '_'; - } - } - - // Generate unique variable name - snprintf(colorvariable, MAXPDSTRING, "::colorpicker%d_%s_value", o->properties_panel.colorpicker_count, - sanitized_frame); - - // Initialize the Tcl variable to a default color - pdgui_vmess(0, "sss", "set", colorvariable, "#ffffff"); - - // Build the pdsend command to trigger color picker and send result - snprintf(pdsend, MAXPDSTRING, - "eval pdsend [concat %s _properties colorpicker %s [tk_chooseColor -initialcolor {#ffffff} -title {Choose color}]]", - o->properties_panel.properties_receiver->s_name, method); - - // Create the color picker button with the constructed command - snprintf(buttonid, MAXPDSTRING, "%s.colorpicker%d", o->properties_panel.current_frame->s_name, - o->properties_panel.colorpicker_count); - pdgui_vmess(0, "ssssss", "button", buttonid, "-text", text, "-command", pdsend); - - pdgui_vmess(0, "sssisi", "grid", buttonid, "-row", o->properties_panel.current_row, "-column", o->properties_panel.current_col, - "-sticky", "we"); - pdlua_properties_updaterow(o); - - } else { - mylua_error(__L(), pdlua, "addcolorpicker"); - } - } else { - mylua_error(__L(), pdlua, "addcolorpicker"); - } -} - - -static void pdlua_properties(t_gobj *z, t_glist *owner) { - t_pdlua *pdlua = (t_pdlua *)z; - t_pdlua_gfx *o = &pdlua->gfx; - - char receiver[MAXPDSTRING]; - snprintf(receiver, MAXPDSTRING, ".%p", o); - o->properties_panel.properties_receiver = gensym(receiver); - o->properties_panel.current_frame = NULL; - pd_bind(&pdlua->pd.ob_pd, o->properties_panel.properties_receiver); // new to unbind - - pdlua_properties_createdialog(o); // <-- create hidden window - - // main window - char frameId[MAXPDSTRING]; - snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)o); - pdgui_vmess(0, "sss", "wm", "deiconify", o->properties_panel.properties_receiver->s_name); // <- on sucess show the window - pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); - pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); - pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); - - // call _properties - lua_getglobal(__L(), "pd"); - lua_getfield (__L(), -1, "_properties"); - lua_pushlightuserdata(__L(), pdlua); - if (lua_pcall(__L(), 1, 1, 0)) - { - mylua_error(__L(), pdlua, "properties"); - pdgui_vmess(0, "ss", "destroy", o->properties_panel.properties_receiver->s_name); - return; - } - - // Get the return value (Lua pushes it onto the stack) - int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) - lua_pop(__L(), 1); // Remove the result from the stack - if (!result) - { - pdgui_vmess(0, "ss", "destroy", o->properties_panel.properties_receiver->s_name); - return; - } - pdlua_properties_setupbuttons(o); // <- this is independed of all previous containers - -} - -#include - -static void pdlua_properties_receiver(t_pdlua *o, t_symbol *s, int argc, t_atom *argv) -{ - if (argc < 2) - return; - - lua_getglobal(__L(), "pd"); - lua_getfield(__L(), -1, "_set_properties"); - lua_remove(__L(), -2); - - lua_pushlightuserdata(__L(), o); - lua_pushstring(__L(), atom_getsymbol(argv + 1)->s_name); - lua_newtable(__L()); // Criando a tabela - - const char *guitype = atom_getsymbol(argv)->s_name; - if (strcmp(guitype, "colorpicker") == 0) - { - const char *hexcolor = atom_getsymbol(argv + 2)->s_name; - int isvalid = 1; - - if (hexcolor == NULL || hexcolor[0] != '#' || strlen(hexcolor) != 7) { - isvalid = 0; - } else { - for (int i = 1; i < 7; i++) { - if (!isxdigit(hexcolor[i])) isvalid = 0; - } - } - - if (!isvalid) { - pd_error(o, "Invalid color string"); - return; - } - - int r, g, b; - if (sscanf(hexcolor + 1, "%2x%2x%2x", &r, &g, &b) == 3) { - lua_newtable(__L()); - lua_pushinteger(__L(), r); - lua_rawseti(__L(), -2, 1); - lua_pushinteger(__L(), g); - lua_rawseti(__L(), -2, 2); - lua_pushinteger(__L(), b); - lua_rawseti(__L(), -2, 3); - lua_rawseti(__L(), -2, 1); - } else { - pd_error(o, "Invalid color format in sscanf"); - return; - } - } else{ - for (int i = 2; i < argc; i++) - { - if (argv[i].a_type == A_FLOAT) - { - lua_pushnumber(__L(), atom_getfloat(argv + i)); - lua_rawseti(__L(), -2, i - 1); // Store at index (1-based in Lua) - } - else if (argv[i].a_type == A_SYMBOL) - { - lua_pushstring(__L(), atom_getsymbol(argv + i)->s_name); - lua_rawseti(__L(), -2, i - 1); - } - } - } - - if (lua_pcall(__L(), 3, 0, 0)) - { - mylua_error(__L(), o, "_set_properties"); // Handle error - lua_pop(__L(), 1); // Pop error message - return; - } -} - -static int pdlua_properties_add(lua_State *L) -{ - t_pdlua *lua_class; - const char *s; - if (lua_islightuserdata(L, 1)) - { - lua_class = lua_touserdata(L, 1); - if (lua_class) - { - // NOTE: Something like this would be nice - // class_setpropertiesfn((t_class *)lua_class->pd.te_g.g_pd, pdlua_properties); - // return 1; - } - } - return 0; -} - - -#endif diff --git a/pdlua_properties.h b/pdlua_properties.h new file mode 100644 index 0000000..c56de15 --- /dev/null +++ b/pdlua_properties.h @@ -0,0 +1,511 @@ +/** @file pdlua_properties.h + * @brief pdlpdlua_propertiesua_gfx -- an extension to pdlua that spawning properties windowds + * @author Charles K. Neimog + * @date 2023 + * + * Copyright (C) 2026 Charles K. Neimog and Timothy Schoen + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifdef PLUGDATA + +static void pdlua_properties(t_gobj *z, t_glist *owner) { + t_pdlua *pdlua = (t_pdlua *)z; + + // call _properties + lua_getglobal(__L(), "pd"); + lua_getfield (__L(), -1, "_properties"); + lua_pushlightuserdata(__L(), pdlua); + if (lua_pcall(__L(), 1, 1, 0)) + { + mylua_error(__L(), pdlua, "properties"); + return; + } +} + +static int pdlua_properties_newframe(lua_State *L) +{ + t_pdlua *pdlua = NULL; + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) + { + pdlua = lua_touserdata(L, 1); + const char *title = lua_tostring(L, 2); + int col = lua_tonumber(L, 3); + + t_atom atoms[1]; + SETSYMBOL(&atoms[0], gensym(title)); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_frame_property"), 1, atoms); + } else { + mylua_error(__L(), NULL, "properties"); + } + return 0; +} + +static int pdlua_properties_addcheckbox(lua_State *L) +{ + t_pdlua *pdlua = NULL; + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) + { + pdlua = lua_touserdata(L, 1); + + t_atom atoms[3]; + SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); + SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); + SETFLOAT (&atoms[2], (t_float)lua_tonumber(L, 4)); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_checkbox_property"), 3, atoms); + } else { + mylua_error(__L(), NULL, "addcheckbox"); + } + return 0; +} + +static int pdlua_properties_addtextinput(lua_State *L) +{ + t_pdlua *pdlua = NULL; + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) + { + pdlua = lua_touserdata(L, 1); + + t_atom atoms[4]; + SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); + SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); + SETSYMBOL(&atoms[2], gensym(lua_tostring(L, 4))); + SETFLOAT (&atoms[3], (t_float)lua_tonumber(L, 5)); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_text_property"), 4, atoms); + } else { + mylua_error(__L(), NULL, "Types checks failed"); + } + return 0; +} + +static int pdlua_properties_addcolorpicker(lua_State *L) +{ + t_pdlua *pdlua = NULL; + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) + { + pdlua = lua_touserdata(L, 1); + + t_atom atoms[2]; + SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); + SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_color_property"), 2, atoms); + } else { + mylua_error(__L(), NULL, "addcolorpicker"); + } + return 0; +} + +#else + +static void pdlua_properties_createdialog(t_pdlua_properties *p) +{ + pdgui_vmess(0, "ssss", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); + pdgui_vmess(0, "ssss", "wm", "title", p->properties_receiver->s_name, "{[mydialog] Properties}"); + pdgui_vmess(0, "sss", "wm", "group", p->properties_receiver->s_name, "."); + pdgui_vmess(0, "sssii", "wm", "resizable", p->properties_receiver->s_name, 0, 0); + + pdgui_vmess(0, "sss", "wm", "transient", p->properties_receiver->s_name, "$::focused_window"); + pdgui_vmess(0, "ssss", p->properties_receiver->s_name, "configure", "-menu", "$::dialog_menubar"); + pdgui_vmess(0, "sssfsf", p->properties_receiver->s_name, "configure", "-padx", 0.0f, "-pady", 0.0f); +} + +static void pdlua_properties_updaterow(t_pdlua_properties *p) +{ + p->current_col++; + if (p->current_col == p->max_col) { + p->current_row++; + p->current_col = 0; // not used for now + } +} + +static void pdlua_properties_setupbuttons(t_pdlua_properties *p) { + char buttonsId[MAXPDSTRING]; + snprintf(buttonsId, MAXPDSTRING, ".%p.buttons", (void *)p); + + char buttonCancelId[MAXPDSTRING]; + char buttonApplyId[MAXPDSTRING]; + char buttonOkId[MAXPDSTRING]; + snprintf(buttonCancelId, MAXPDSTRING, ".%p.buttons.cancel", (void *)p); + snprintf(buttonApplyId, MAXPDSTRING, ".%p.buttons.apply", (void *)p); + snprintf(buttonOkId, MAXPDSTRING, ".%p.buttons.ok", (void *)p); + + char destroyCommand[MAXPDSTRING]; + snprintf(destroyCommand, MAXPDSTRING, "destroy .%p", (void *)p); + + // Criando o frame dos botões + pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); + pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); + + // Cancel (Close window) + pdgui_vmess(0, "ssssss", "button", buttonCancelId, "-text", "Cancel", "-command", + destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); + + // Apply (send all data to pd and lua obj) for this must be necessary to save all the variables used in the object in a char [128][MAXPDSTRING], + // I don't think that this is good, or there is better solution? + // TODO: Need to dev the apply command + pdgui_vmess(0, "ssss", "button", buttonApplyId, "-text", "Apply"); + // pdgui_vmess(0, "ssssss", "button", buttonApplyId, "-text", "Apply", "-command", command); + pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); + + // Ok + pdgui_vmess(0, "ssssss", "button", buttonOkId, "-text", "OK", "-command", destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); +} + +static int pdlua_properties_newframe(lua_State *L) +{ + t_pdlua *pdlua = NULL; + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) + { + pdlua = lua_touserdata(L, 1); + const char *title = lua_tostring(L, 2); + int col = lua_tonumber(L, 3); + + pdlua->properties.frame_count++; + char current_frameid[MAXPDSTRING]; + snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); + pdlua->properties.current_frame = gensym(current_frameid); + + // raised, sunken, flat, ridge, solid, and groove. + // Create main frame for set of configurations + pdgui_vmess(0, "sssssi", "frame", current_frameid, "-relief", "groove", "-borderwidth", 1); + pdgui_vmess(0, "sssssssisi", "pack", current_frameid, "-side", "top", "-fill", "x", "-padx", 10, + "-pady", 10); + + // Title of the Frame + char labelid[MAXPDSTRING]; + snprintf(labelid, MAXPDSTRING, "%s.title", current_frameid); + pdgui_vmess(0, "ssss", "label", labelid, "-text", title); + pdgui_vmess(0, "sssssf", "pack", labelid, "-side", "top", "-pady", 5.f); + + // Create content frame with grid layout + char content_frameid[MAXPDSTRING]; + snprintf(content_frameid, MAXPDSTRING, "%s.content", current_frameid); + pdgui_vmess(0, "ss", "frame", content_frameid); + pdgui_vmess(0, "ssss", "pack", content_frameid, "-side", "top", "-fill", "x"); + + // Configure grid with 2 equal columns + for (int i = 0; i < col; i++) { + pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frameid, i, "-weight", 1); + } + pdlua->properties.current_frame = gensym(content_frameid); + pdlua->properties.max_col = col; + pdlua->properties.current_col = 0; + pdlua->properties.current_row = 0; + } else{ + mylua_error(__L(), NULL, "properties"); + + } + return 0; +} + +static int pdlua_properties_addcheckbox(lua_State *L) +{ + t_pdlua *pdlua = NULL; + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) + { + pdlua = lua_touserdata(L, 1); + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + int init_value = lua_tonumber(L, 4); + if (pdlua == NULL){ + return 0 ; + } + + char pdsend[MAXPDSTRING]; + char checkid[MAXPDSTRING]; + char checkvariable[MAXPDSTRING]; + char sanitized_frame[MAXPDSTRING]; + pdlua->properties.checkbox_count++; + + // Sanitize frame name (replace '.' with '_') + snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); + for (char *p = sanitized_frame; *p != '\0'; p++) { + if (*p == '.') { + *p = '_'; + } + } + + // Generate unique variable name + snprintf(checkvariable, MAXPDSTRING, "::checkbox%d_%s_state", pdlua->properties.checkbox_count, + sanitized_frame); + + // Initialize the Tcl variable to 0 (unchecked) + pdgui_vmess(0, "ssi", "set", checkvariable, init_value); + + // Build the pdsend command + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties checkbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, checkvariable); + + // Create the checkbox + snprintf(checkid, MAXPDSTRING, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.checkbox_count); + pdgui_vmess(0, "ssssssss", "checkbutton", checkid, "-text", text, "-variable", checkvariable, + "-command", pdsend); + + pdgui_vmess(0, "sssisi", "grid", checkid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, + "-sticky", "we"); + pdlua_properties_updaterow(&pdlua->properties); + } else { + mylua_error(__L(), NULL, "addcheckbox"); + } + return 0; +} + + +static int pdlua_properties_addtextinput(lua_State *L) +{ + t_pdlua *pdlua = NULL; + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) + { + pdlua = lua_touserdata(L, 1); + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + const char *init_value = lua_tostring(L, 4); + int width = lua_tonumber(L, 5); + if (pdlua == NULL){ + mylua_error(__L(), pdlua, "pdlua is NULL"); + return 0 ; + } + + char pdsend[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char buttonid[MAXPDSTRING]; + char entryid[MAXPDSTRING]; + + char numvariable[MAXPDSTRING]; + + char sanitized_frame[MAXPDSTRING]; + pdlua->properties.numberbox_count++; + + // Sanitize frame name (replace '.' with '_') + snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); + for (char *p = sanitized_frame; *p != '\0'; p++) { + if (*p == '.') { + *p = '_'; + } + } + + // Variable save the value of gui obj + snprintf(numvariable, MAXPDSTRING, "::numberbox%d_%s_value", pdlua->properties.numberbox_count, + sanitized_frame); + pdgui_vmess(0, "sss", "set", numvariable, init_value); + + // Command to send it to pd + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, numvariable); + + // container for button to set and text input + char text_button_frame[MAXPDSTRING]; + snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, + pdlua->properties.numberbox_count); + pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 1, + "-padx", 5, "-pady", 5); + + // create text for identification + snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, pdlua->properties.numberbox_count); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); + + // Create the number entry box + snprintf(entryid, MAXPDSTRING, "%s.numberbox%d", text_button_frame, pdlua->properties.numberbox_count); + pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", numvariable, "-width", width); + + // Create the set button + snprintf(buttonid, MAXPDSTRING, "%s.setbutton%d", text_button_frame, pdlua->properties.numberbox_count); + pdgui_vmess(0, "sssssssisi", "button", buttonid, "-text", "Set", "-command", pdsend, "-padx", + 10, "-pady", 0); + + // Pack the entry and button side by side + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", entryid, "-side", "left"); + pdgui_vmess(0, "ssss", "pack", buttonid, "-side", "right"); + pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", pdlua->properties.current_row, "-column", + pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); + pdlua_properties_updaterow(&pdlua->properties); + } else { + mylua_error(__L(), NULL, "Types checks failed"); + } + return 0; +} + +// static int pdlua_dialog_createcolorpicker(t_pdlua *x, const char *text, const char *method) { +static int pdlua_properties_addcolorpicker(lua_State *L) { + t_pdlua *pdlua = NULL; + + if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) + { + pdlua = lua_touserdata(L, 1); + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + + char pdsend[MAXPDSTRING]; + char buttonid[MAXPDSTRING]; + char colorvariable[MAXPDSTRING]; + char sanitized_frame[MAXPDSTRING]; + pdlua->properties.colorpicker_count++; + + // Sanitize frame name (replace '.' with '_') + snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); + for (char *p = sanitized_frame; *p != '\0'; p++) { + if (*p == '.') { + *p = '_'; + } + } + + // Generate unique variable name + snprintf(colorvariable, MAXPDSTRING, "::colorpicker%d_%s_value", pdlua->properties.colorpicker_count, + sanitized_frame); + + // Initialize the Tcl variable to a default color + pdgui_vmess(0, "sss", "set", colorvariable, "#ffffff"); + + // Build the pdsend command to trigger color picker and send result + snprintf(pdsend, MAXPDSTRING, + "eval pdsend [concat %s _properties colorpicker %s [tk_chooseColor -initialcolor {#ffffff} -title {Choose color}]]", + pdlua->properties.properties_receiver->s_name, method); + + // Create the color picker button with the constructed command + snprintf(buttonid, MAXPDSTRING, "%s.colorpicker%d", pdlua->properties.current_frame->s_name, + pdlua->properties.colorpicker_count); + pdgui_vmess(0, "ssssss", "button", buttonid, "-text", text, "-command", pdsend); + + pdgui_vmess(0, "sssisi", "grid", buttonid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, + "-sticky", "we"); + pdlua_properties_updaterow(&pdlua->properties); + } else { + mylua_error(__L(), pdlua, "addcolorpicker"); + } +} + + +static void pdlua_properties(t_gobj *z, t_glist *owner) { + t_pdlua *pdlua = (t_pdlua *)z; + t_pdlua_properties *p = &pdlua->properties; + + char receiver[MAXPDSTRING]; + snprintf(receiver, MAXPDSTRING, ".%p", p); + pdlua->properties.properties_receiver = gensym(receiver); + pdlua->properties.current_frame = NULL; + pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); // new to unbind + + pdlua_properties_createdialog(p); // <-- create hidden window + + // main window + char frameId[MAXPDSTRING]; + snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)p); + pdgui_vmess(0, "sss", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window + pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); + pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); + pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); + + // call _properties + lua_getglobal(__L(), "pd"); + lua_getfield (__L(), -1, "_properties"); + lua_pushlightuserdata(__L(), pdlua); + if (lua_pcall(__L(), 1, 1, 0)) + { + mylua_error(__L(), pdlua, "properties"); + pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); + return; + } + + // Get the return value (Lua pushes it onto the stack) + int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) + lua_pop(__L(), 1); // Remove the result from the stack + if (!result) + { + pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); + return; + } + pdlua_properties_setupbuttons(p); // <- this is independed of all previous containers + +} + +#endif + +static void pdlua_properties_receiver(t_pdlua *o, t_symbol *s, int argc, t_atom *argv) +{ + if (argc < 2) + return; + + lua_getglobal(__L(), "pd"); + lua_getfield(__L(), -1, "_set_properties"); + lua_remove(__L(), -2); + + lua_pushlightuserdata(__L(), o); + lua_pushstring(__L(), atom_getsymbol(argv + 1)->s_name); + lua_newtable(__L()); // Criando a tabela + + const char *guitype = atom_getsymbol(argv)->s_name; + if (strcmp(guitype, "colorpicker") == 0) + { + const char *hexcolor = atom_getsymbol(argv + 2)->s_name; + int isvalid = 1; + + if (hexcolor == NULL || hexcolor[0] != '#' || strlen(hexcolor) != 7) { + isvalid = 0; + } else { + for (int i = 1; i < 7; i++) { + if (!isxdigit(hexcolor[i])) isvalid = 0; + } + } + + if (!isvalid) { + pd_error(o, "Invalid color string"); + return; + } + + int r, g, b; + if (sscanf(hexcolor + 1, "%2x%2x%2x", &r, &g, &b) == 3) { + lua_newtable(__L()); + lua_pushinteger(__L(), r); + lua_rawseti(__L(), -2, 1); + lua_pushinteger(__L(), g); + lua_rawseti(__L(), -2, 2); + lua_pushinteger(__L(), b); + lua_rawseti(__L(), -2, 3); + lua_rawseti(__L(), -2, 1); + } else { + pd_error(o, "Invalid color format in sscanf"); + return; + } + } else{ + for (int i = 2; i < argc; i++) + { + if (argv[i].a_type == A_FLOAT) + { + lua_pushnumber(__L(), atom_getfloat(argv + i)); + lua_rawseti(__L(), -2, i - 1); // Store at index (1-based in Lua) + } + else if (argv[i].a_type == A_SYMBOL) + { + lua_pushstring(__L(), atom_getsymbol(argv + i)->s_name); + lua_rawseti(__L(), -2, i - 1); + } + } + } + + if (lua_pcall(__L(), 3, 0, 0)) + { + mylua_error(__L(), o, "_set_properties"); // Handle error + lua_pop(__L(), 1); // Pop error message + return; + } +} From 961d8ec88f809bfbc770eb83fbd3028600c51d75 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 14:09:35 +0100 Subject: [PATCH 037/109] Github actions: update Pd version --- .github/workflows/makefile.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 622a868..73a0347 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -21,7 +21,7 @@ jobs: fetch-depth: 0 - name: install dependencies - run: git clone --branch=0.55-0 --depth=1 https://github.com/pure-data/pure-data.git + run: git clone --branch=0.56-2 --depth=1 https://github.com/pure-data/pure-data.git - name: make run: make install PDDIR=./pure-data objectsdir=./build floatsize=${{ matrix.floatsize }} extension=linux-amd64-${{ matrix.floatsize }}.so @@ -46,11 +46,11 @@ jobs: - name: install dependencies run: | - wget https://github.com/pure-data/pure-data/archive/refs/tags/0.55-0.zip - unzip 0.55-0.zip + wget https://github.com/pure-data/pure-data/archive/refs/tags/0.56-2.zip + unzip 0.56-2.zip - name: make - run: make install objectsdir=./build PDDIR=./pure-data-0.55-0 arch="arm64 x86_64" floatsize=${{ matrix.floatsize }} extension=darwin-fat-${{ matrix.floatsize }}.so + run: make install objectsdir=./build PDDIR=./pure-data-0.56-2 arch="arm64 x86_64" floatsize=${{ matrix.floatsize }} extension=darwin-fat-${{ matrix.floatsize }}.so - name: upload uses: actions/upload-artifact@v4 @@ -75,18 +75,18 @@ jobs: - name: install dependencies for 32-bit if: matrix.floatsize == 32 run: | - C:\msys64\usr\bin\wget.exe http://msp.ucsd.edu/Software/pd-0.55-0.msw.zip - unzip pd-0.55-0.msw.zip + C:\msys64\usr\bin\wget.exe http://msp.ucsd.edu/Software/pd-0.56-2.msw.zip + unzip pd-0.56-2.msw.zip - name: install dependencies for 64-bit if: matrix.floatsize == 64 run: | # unfortunately, the folder name convention is slightly different here - C:\msys64\usr\bin\wget.exe https://puredata.info/downloads/pure-data/releases/0.55-0-pd64/Pd64-0.55-0.msw.zip - unzip Pd64-0.55-0.msw.zip - ren Pd-0.55.0 pd-0.55-0 + C:\msys64\usr\bin\wget.exe https://puredata.info/downloads/pure-data/releases/0.56-2-pd64/Pd64-0.56-2.msw.zip + unzip Pd64-0.56-2.msw.zip + ren Pd-0.56.2 pd-0.56-2 - name: make 32-bit - run: make install objectsdir=./build PDDIR=./pd-0.55-0 PDINCLUDEDIR=./pd-0.55-0/src PDBINDIR=./pd-0.55-0/bin floatsize=${{ matrix.floatsize }} extension=windows-amd64-${{ matrix.floatsize }}.dll + run: make install objectsdir=./build PDDIR=./pd-0.56-2 PDINCLUDEDIR=./pd-0.56-2/src PDBINDIR=./pd-0.56-2/bin floatsize=${{ matrix.floatsize }} extension=windows-amd64-${{ matrix.floatsize }}.dll - name: upload uses: actions/upload-artifact@v4 From 1b2f14590b3a6e1e5bfcc16ebe59917e3b3b0f0f Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 15:53:57 +0100 Subject: [PATCH 038/109] Make sure properties function can only be called from properties callback --- pd.lua | 20 ----- pdlua.c | 3 +- pdlua_properties.h | 195 +++++++++++++++++++++++++-------------------- 3 files changed, 111 insertions(+), 107 deletions(-) diff --git a/pd.lua b/pd.lua index 5bd4e07..ce40be3 100644 --- a/pd.lua +++ b/pd.lua @@ -486,26 +486,6 @@ function pd.Class:set_args(args) pd._set_args(self._object, args) end -function pd.Class:addproperties() - pd._properties_add(self._object) -end - -function pd.Class:newframe(title, max_col) - pd._properties_newframe(self._object, title, max_col) -end - -function pd.Class:addcheckbox(text, method, init_value) - pd._properties_addcheckbox(self._object, text, method, init_value) -end - -function pd.Class:addtextinput(text, method, init_value, width) - pd._properties_addtextinput(self._object, text, method, init_value, width) -end - -function pd.Class:addcolorpicker(text, method) - pd._properties_addcolorpicker(self._object, text, method) -end - function pd.Class:canvas_realizedollar(s) return pd._canvas_realizedollar(self._object, s) end diff --git a/pdlua.c b/pdlua.c index 86f60a4..c6530f5 100644 --- a/pdlua.c +++ b/pdlua.c @@ -3336,7 +3336,8 @@ void pdlua_setup(void) } pdlua_gfx_setup(__L()); - + pdlua_properties_setup(__L()); + PDLUA_DEBUG("pdlua_setup: end. stack top %d", lua_gettop(__L())); #ifndef PLUGDATA /* nw.js support. */ diff --git a/pdlua_properties.h b/pdlua_properties.h index c56de15..c67b49e 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -1,7 +1,7 @@ /** @file pdlua_properties.h * @brief pdlpdlua_propertiesua_gfx -- an extension to pdlua that spawning properties windowds * @author Charles K. Neimog - * @date 2023 + * @date 2026 * * Copyright (C) 2026 Charles K. Neimog and Timothy Schoen * @@ -21,28 +21,56 @@ * */ +static int pdlua_properties_newframe(lua_State *L); +static int pdlua_properties_addcheckbox(lua_State *L); +static int pdlua_properties_addtextinput(lua_State *L); +static int pdlua_properties_addcolorpicker(lua_State *L); + +static int pdlua_properties_setup(lua_State* L) +{ + static const luaL_Reg properties_methods[] = { + {"new_frame", pdlua_properties_newframe}, + {"add_checkbox", pdlua_properties_addcheckbox}, + {"add_textinput", pdlua_properties_addtextinput}, + {"add_colorpicker", pdlua_properties_addcolorpicker}, + {NULL, NULL} // Sentinel to end the list + }; + + luaL_newmetatable(L, "PropertiesContext"); + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + luaL_setfuncs(L, properties_methods, 0); +} + #ifdef PLUGDATA -static void pdlua_properties(t_gobj *z, t_glist *owner) { +static void pdlua_properties(t_gobj *z, t_glist *owner) +{ t_pdlua *pdlua = (t_pdlua *)z; + lua_State *L = __L(); - // call _properties - lua_getglobal(__L(), "pd"); - lua_getfield (__L(), -1, "_properties"); - lua_pushlightuserdata(__L(), pdlua); - if (lua_pcall(__L(), 1, 1, 0)) + lua_getglobal(L, "pd"); + lua_getfield(L, -1, "_properties"); + + lua_pushlightuserdata(L, pdlua); + t_pdlua **ctx = lua_newuserdata(L, sizeof(t_pdlua*)); + *ctx = pdlua; + + luaL_getmetatable(L, "PropertiesContext"); + lua_setmetatable(L, -2); + + if (lua_pcall(L, 2, 1, 0)) { - mylua_error(__L(), pdlua, "properties"); + mylua_error(L, pdlua, "properties"); return; } } static int pdlua_properties_newframe(lua_State *L) { - t_pdlua *pdlua = NULL; - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *title = lua_tostring(L, 2); int col = lua_tonumber(L, 3); @@ -50,17 +78,16 @@ static int pdlua_properties_newframe(lua_State *L) SETSYMBOL(&atoms[0], gensym(title)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_frame_property"), 1, atoms); } else { - mylua_error(__L(), NULL, "properties"); + mylua_error(__L(), NULL, "new_frame: invalid args"); } return 0; } static int pdlua_properties_addcheckbox(lua_State *L) { - t_pdlua *pdlua = NULL; - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); t_atom atoms[3]; SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); @@ -68,17 +95,16 @@ static int pdlua_properties_addcheckbox(lua_State *L) SETFLOAT (&atoms[2], (t_float)lua_tonumber(L, 4)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_checkbox_property"), 3, atoms); } else { - mylua_error(__L(), NULL, "addcheckbox"); + mylua_error(__L(), NULL, "add_checkbox: invalid args"); } return 0; } static int pdlua_properties_addtextinput(lua_State *L) { - t_pdlua *pdlua = NULL; - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); t_atom atoms[4]; SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); @@ -87,30 +113,77 @@ static int pdlua_properties_addtextinput(lua_State *L) SETFLOAT (&atoms[3], (t_float)lua_tonumber(L, 5)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_text_property"), 4, atoms); } else { - mylua_error(__L(), NULL, "Types checks failed"); + mylua_error(__L(), NULL, "add_textinput: invalid args"); } return 0; } static int pdlua_properties_addcolorpicker(lua_State *L) { - t_pdlua *pdlua = NULL; - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); t_atom atoms[2]; SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_color_property"), 2, atoms); } else { - mylua_error(__L(), NULL, "addcolorpicker"); + mylua_error(__L(), NULL, "add_colorpicker: invalid args"); } return 0; } #else +static void pdlua_properties(t_gobj *z, t_glist *owner) { + t_pdlua *pdlua = (t_pdlua *)z; + t_pdlua_properties *p = &pdlua->properties; + + char receiver[MAXPDSTRING]; + snprintf(receiver, MAXPDSTRING, ".%p", p); + pdlua->properties.properties_receiver = gensym(receiver); + pdlua->properties.current_frame = NULL; + pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); // new to unbind + + pdlua_properties_createdialog(p); // <-- create hidden window + + // main window + char frameId[MAXPDSTRING]; + snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)p); + pdgui_vmess(0, "sss", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window + pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); + pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); + pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); + + // call _properties + lua_getglobal(L, "pd"); + lua_getfield(L, -1, "_properties"); + + t_pdlua **ctx = lua_newuserdata(L, sizeof(t_pdlua*)); + *ctx = pdlua; + + lua_pushlightuserdata(L, pdlua); + luaL_getmetatable(L, "PropertiesContext"); + lua_setmetatable(L, -2); + + if (lua_pcall(L, 2, 1, 0)) + { + mylua_error(L, pdlua, "properties"); + return; + } + + // Get the return value (Lua pushes it onto the stack) + int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) + lua_pop(__L(), 1); // Remove the result from the stack + if (!result) + { + pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); + return; + } + pdlua_properties_setupbuttons(p); // <- this is independed of all previous containers +} + static void pdlua_properties_createdialog(t_pdlua_properties *p) { pdgui_vmess(0, "ssss", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); @@ -172,10 +245,9 @@ static void pdlua_properties_setupbuttons(t_pdlua_properties *p) { static int pdlua_properties_newframe(lua_State *L) { - t_pdlua *pdlua = NULL; - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *title = lua_tostring(L, 2); int col = lua_tonumber(L, 3); @@ -211,7 +283,7 @@ static int pdlua_properties_newframe(lua_State *L) pdlua->properties.current_col = 0; pdlua->properties.current_row = 0; } else{ - mylua_error(__L(), NULL, "properties"); + mylua_error(__L(), NULL, "new_frame: invalid args"); } return 0; @@ -219,10 +291,9 @@ static int pdlua_properties_newframe(lua_State *L) static int pdlua_properties_addcheckbox(lua_State *L) { - t_pdlua *pdlua = NULL; - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); int init_value = lua_tonumber(L, 4); @@ -264,7 +335,7 @@ static int pdlua_properties_addcheckbox(lua_State *L) "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "addcheckbox"); + mylua_error(__L(), NULL, "add_checkbox: invalid args"); } return 0; } @@ -272,10 +343,9 @@ static int pdlua_properties_addcheckbox(lua_State *L) static int pdlua_properties_addtextinput(lua_State *L) { - t_pdlua *pdlua = NULL; - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); const char *init_value = lua_tostring(L, 4); @@ -340,18 +410,16 @@ static int pdlua_properties_addtextinput(lua_State *L) pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "Types checks failed"); + mylua_error(__L(), NULL, "add_textinput: invalid args"); } return 0; } // static int pdlua_dialog_createcolorpicker(t_pdlua *x, const char *text, const char *method) { static int pdlua_properties_addcolorpicker(lua_State *L) { - t_pdlua *pdlua = NULL; - - if (lua_islightuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) { - pdlua = lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); @@ -390,54 +458,9 @@ static int pdlua_properties_addcolorpicker(lua_State *L) { "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), pdlua, "addcolorpicker"); - } -} - - -static void pdlua_properties(t_gobj *z, t_glist *owner) { - t_pdlua *pdlua = (t_pdlua *)z; - t_pdlua_properties *p = &pdlua->properties; - - char receiver[MAXPDSTRING]; - snprintf(receiver, MAXPDSTRING, ".%p", p); - pdlua->properties.properties_receiver = gensym(receiver); - pdlua->properties.current_frame = NULL; - pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); // new to unbind - - pdlua_properties_createdialog(p); // <-- create hidden window - - // main window - char frameId[MAXPDSTRING]; - snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)p); - pdgui_vmess(0, "sss", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window - pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); - pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); - pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); - - // call _properties - lua_getglobal(__L(), "pd"); - lua_getfield (__L(), -1, "_properties"); - lua_pushlightuserdata(__L(), pdlua); - if (lua_pcall(__L(), 1, 1, 0)) - { - mylua_error(__L(), pdlua, "properties"); - pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); - return; + mylua_error(__L(), NULL, "add_colorpicker: invalid args"); } - - // Get the return value (Lua pushes it onto the stack) - int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) - lua_pop(__L(), 1); // Remove the result from the stack - if (!result) - { - pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); - return; - } - pdlua_properties_setupbuttons(p); // <- this is independed of all previous containers - } - #endif static void pdlua_properties_receiver(t_pdlua *o, t_symbol *s, int argc, t_atom *argv) From 76a3fe0e8cdecfdad9968e3c77853211b5513431 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 17:14:26 +0100 Subject: [PATCH 039/109] Add number and combo properties, clean up properties system --- pdlua.h | 5 +- pdlua/tutorial/examples/properties-help.pd | 2 +- pdlua/tutorial/examples/properties.pd_lua | 64 ---- pdlua/tutorial/examples/props.pd_lua | 100 +++++ pdlua_properties.h | 401 ++++++++++++++++----- 5 files changed, 405 insertions(+), 167 deletions(-) delete mode 100644 pdlua/tutorial/examples/properties.pd_lua create mode 100644 pdlua/tutorial/examples/props.pd_lua diff --git a/pdlua.h b/pdlua.h index 7ae78b4..e9aec77 100644 --- a/pdlua.h +++ b/pdlua.h @@ -32,12 +32,9 @@ typedef struct _pdlua_properties t_symbol *current_frame; t_symbol *properties_receiver; int frame_count; + int property_count; int max_col, max_row; int current_col, current_row; - - int checkbox_count; - int numberbox_count; - int colorpicker_count; #else void(*plugdata_properties_callback)(void*, t_symbol*, int, t_atom*); // Callback to add properties in plugdata #endif diff --git a/pdlua/tutorial/examples/properties-help.pd b/pdlua/tutorial/examples/properties-help.pd index 13fa5c7..2da2fa8 100644 --- a/pdlua/tutorial/examples/properties-help.pd +++ b/pdlua/tutorial/examples/properties-help.pd @@ -2,4 +2,4 @@ #X declare -lib pdlua; #X obj 5 7 declare -lib pdlua; #X obj 254 59 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; -#X obj 66 69 properties; +#X obj 66 69 props; diff --git a/pdlua/tutorial/examples/properties.pd_lua b/pdlua/tutorial/examples/properties.pd_lua deleted file mode 100644 index 4860ad5..0000000 --- a/pdlua/tutorial/examples/properties.pd_lua +++ /dev/null @@ -1,64 +0,0 @@ -local properties = pd.Class:new():register("properties") - -function properties:initialize(sel, atoms) - self.inlets = 1 - self.outlets = 1 - self.phase = 0 - self:addproperties() - self:set_size(127, 127) - - self.checkbox1 = 1 - self.checkbox2 = 1 - self.color = {155,155,155} - - self.textinput1 = "Hello" - self.textinput2 = 40 - self.bigstring = "Uidsja hasd asdhj asdy asdhjasd" - - return true -end - -function properties:properties() - self:newframe("First CheckBox", 2) - self:addcheckbox("Check Box 1", "updatecheckbox1", self.checkbox1) - self:addcheckbox("Check Box 2", "updatecheckbox2", self.checkbox2) - - self:newframe("First textinput", 2) - self:addtextinput("Check textinput 1", "updatetext1", self.textinput1, 5) - self:addtextinput("Check textinput 2", "updatetext2", self.textinput2, 5) - - self:newframe("My Color Picker", 1) - self:addcolorpicker("Background", "updatecolorbg"); -end - -function properties:updatecolorbg(args) - self.color[1] = args[1][1] - self.color[2] = args[1][2] - self.color[3] = args[1][3] - self:repaint(1) -end - -function properties:updatetext1(args) - self.textinput1 = args[1] - pd.post("textinput1 is now " .. self.textinput1); -end - -function properties:updatetext2(args) - self.textinput2 = args[1] - pd.post("textinput2 is now " .. self.textinput2); -end - -function properties:updatecheckbox1(args) - self.checkbox1 = args[1] - pd.post("checkbox1 is now " .. self.checkbox1); -end - -function properties:updatecheckbox2(args) - self.checkbox2 = args[1] - pd.post("checkbox2 is now " .. self.checkbox2); -end - -function properties:paint(g) - g:set_color(table.unpack(self.color)) - g:fill_all() -end diff --git a/pdlua/tutorial/examples/props.pd_lua b/pdlua/tutorial/examples/props.pd_lua new file mode 100644 index 0000000..e2314e0 --- /dev/null +++ b/pdlua/tutorial/examples/props.pd_lua @@ -0,0 +1,100 @@ +local properties = pd.Class:new():register("props") + +function properties:initialize(sel, atoms) + self.inlets = 1 + self.outlets = 1 + self.phase = 0 + self:set_size(127, 127) + + self.checkbox1 = 1 + self.checkbox2 = 0 + self.color = {155,155,155} + + self.textinput1 = "Hello" + self.textinput2 = "World" + + self.float = 0.5 + self.int = 4 + self.combo = 1 + + return true +end + +function properties:properties(p) + -- Checkboxes + p:new_frame("First CheckBox", 2) + p:add_check("Check Box 1", "updatecheckbox1", self.checkbox1) + p:add_check("Check Box 2", "updatecheckbox2", self.checkbox2) + + -- Text inputs + p:new_frame("First textinput", 2) + p:add_text("Check text 1", "updatetext1", self.textinput1, 5) + p:add_text("Check text 2", "updatetext2", self.textinput2, 5) + + -- Color picker + p:new_frame("My Color Picker", 1) + p:add_color("Background", "updatecolorbg", self.color) + + -- Number boxes + p:new_frame("Numbers", 2) + p:add_number("Float", "updatefloat", self.float, 0, 0, 1) + p:add_number("Int", "updateint", self.int, 1, 1, 16) + + -- Combobox + p:new_frame("Combo", 1) + p:add_combo("Waveform", "updatecombo", self.combo, { "Sine", "Square", "Saw", "Triangle" }) +end + +function properties:updatecolorbg(args) + self.color[1] = args[1][1] + self.color[2] = args[1][2] + self.color[3] = args[1][3] + self:repaint(1) +end + +function properties:updatetext1(args) + self.textinput1 = args[1] + pd.post("textinput1 is now " .. self.textinput1); +end + +function properties:updatetext2(args) + self.textinput2 = args[1] + pd.post("textinput2 is now " .. self.textinput2); +end + +function properties:updatecheckbox1(args) + self.checkbox1 = args[1] + pd.post("checkbox1 is now " .. self.checkbox1); +end + +function properties:updatecheckbox2(args) + self.checkbox2 = args[1] + pd.post("checkbox2 is now " .. self.checkbox2); +end + + +function properties:updatefloat(args) + self.float = args[1] + pd.post("float is now " .. self.float); +end + +function properties:updateint(args) + self.int = args[1] + pd.post("int is now " .. self.int); +end + +function properties:updatecombo(args) + self.combo = args[1] + pd.post("combo is now " .. self.combo); +end + +function properties:updatecheckbox2(args) + self.checkbox2 = args[1] + pd.post("checkbox2 is now " .. self.checkbox2); +end + + +function properties:paint(g) + g:set_color(table.unpack(self.color)) + g:fill_all() +end diff --git a/pdlua_properties.h b/pdlua_properties.h index c67b49e..de94cfa 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -25,14 +25,18 @@ static int pdlua_properties_newframe(lua_State *L); static int pdlua_properties_addcheckbox(lua_State *L); static int pdlua_properties_addtextinput(lua_State *L); static int pdlua_properties_addcolorpicker(lua_State *L); +static int pdlua_properties_addnumberbox(lua_State *L); +static int pdlua_properties_addcombobox(lua_State *L); static int pdlua_properties_setup(lua_State* L) { static const luaL_Reg properties_methods[] = { {"new_frame", pdlua_properties_newframe}, - {"add_checkbox", pdlua_properties_addcheckbox}, - {"add_textinput", pdlua_properties_addtextinput}, - {"add_colorpicker", pdlua_properties_addcolorpicker}, + {"add_check", pdlua_properties_addcheckbox}, + {"add_text", pdlua_properties_addtextinput}, + {"add_color", pdlua_properties_addcolorpicker}, + {"add_combo", pdlua_properties_addcombobox}, + {"add_number", pdlua_properties_addnumberbox}, {NULL, NULL} // Sentinel to end the list }; @@ -93,9 +97,9 @@ static int pdlua_properties_addcheckbox(lua_State *L) SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); SETFLOAT (&atoms[2], (t_float)lua_tonumber(L, 4)); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_checkbox_property"), 3, atoms); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_check_property"), 3, atoms); } else { - mylua_error(__L(), NULL, "add_checkbox: invalid args"); + mylua_error(__L(), NULL, "add_check: invalid args"); } return 0; } @@ -113,7 +117,7 @@ static int pdlua_properties_addtextinput(lua_State *L) SETFLOAT (&atoms[3], (t_float)lua_tonumber(L, 5)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_text_property"), 4, atoms); } else { - mylua_error(__L(), NULL, "add_textinput: invalid args"); + mylua_error(__L(), NULL, "add_text: invalid args"); } return 0; } @@ -129,61 +133,83 @@ static int pdlua_properties_addcolorpicker(lua_State *L) SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_color_property"), 2, atoms); } else { - mylua_error(__L(), NULL, "add_colorpicker: invalid args"); + mylua_error(__L(), NULL, "add_color: invalid args"); } return 0; } -#else +static int pdlua_properties_addnumberbox(lua_State *L) +{ + if (lua_isuserdata(L, 1) && + lua_isstring(L, 2) && + lua_isstring(L, 3) && + lua_isnumber(L, 4) && + lua_isnumber(L, 5) && + lua_isnumber(L, 6) && + lua_isnumber(L, 7)) + { + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + t_atom atoms[6]; -static void pdlua_properties(t_gobj *z, t_glist *owner) { - t_pdlua *pdlua = (t_pdlua *)z; - t_pdlua_properties *p = &pdlua->properties; + SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); + SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); + SETFLOAT(&atoms[2], lua_tonumber(L, 4)); + SETFLOAT(&atoms[3], lua_tonumber(L, 5)); + SETFLOAT(&atoms[4], lua_tonumber(L, 6)); + SETFLOAT(&atoms[5], lua_tonumber(L, 7)); - char receiver[MAXPDSTRING]; - snprintf(receiver, MAXPDSTRING, ".%p", p); - pdlua->properties.properties_receiver = gensym(receiver); - pdlua->properties.current_frame = NULL; - pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); // new to unbind + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 6, atoms); + } + else + { + mylua_error(__L(), NULL, "add_number: invalid args"); + } - pdlua_properties_createdialog(p); // <-- create hidden window + return 0; +} - // main window - char frameId[MAXPDSTRING]; - snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)p); - pdgui_vmess(0, "sss", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window - pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); - pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); - pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); - // call _properties - lua_getglobal(L, "pd"); - lua_getfield(L, -1, "_properties"); +static int pdlua_properties_addcombobox(lua_State *L) +{ + if (lua_isuserdata(L, 1) && + lua_isstring(L, 2) && + lua_isstring(L, 3) && + lua_isnumber(L, 4) && + lua_istable(L, 5)) + { + int num_options = lua_rawlen(L, 5); + int argc = 3 + num_options; + t_atom *atoms = (t_atom *)getbytes(sizeof(t_atom) * argc); - t_pdlua **ctx = lua_newuserdata(L, sizeof(t_pdlua*)); - *ctx = pdlua; + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); + SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); + SETFLOAT(&atoms[2], lua_tonumber(L, 4)); - lua_pushlightuserdata(L, pdlua); - luaL_getmetatable(L, "PropertiesContext"); - lua_setmetatable(L, -2); + for (int i = 0; i < num_options; i++) + { + lua_rawgeti(L, 5, i + 1); + if (lua_isstring(L, -1)) + SETSYMBOL(&atoms[3 + i], gensym(lua_tostring(L, -1))); + else + SETSYMBOL(&atoms[3 + i], gensym("")); + lua_pop(L, 1); + } - if (lua_pcall(L, 2, 1, 0)) - { - mylua_error(L, pdlua, "properties"); - return; + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_combo_property"), argc, atoms); + freebytes(atoms, sizeof(t_atom) * argc); } - - // Get the return value (Lua pushes it onto the stack) - int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) - lua_pop(__L(), 1); // Remove the result from the stack - if (!result) + else { - pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); - return; + mylua_error(__L(), NULL, "add_combo: invalid args"); } - pdlua_properties_setupbuttons(p); // <- this is independed of all previous containers + + return 0; } + +#else + static void pdlua_properties_createdialog(t_pdlua_properties *p) { pdgui_vmess(0, "ssss", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); @@ -243,6 +269,69 @@ static void pdlua_properties_setupbuttons(t_pdlua_properties *p) { "-ipadx", 10); } +static void pdlua_properties(t_gobj *z, t_glist *owner) { + t_pdlua *pdlua = (t_pdlua *)z; + t_pdlua_properties *p = &pdlua->properties; + + lua_State *L = __L(); + + char receiver[MAXPDSTRING]; + snprintf(receiver, MAXPDSTRING, ".%p", p); + pdlua->properties.properties_receiver = gensym(receiver); + pdlua->properties.current_frame = NULL; + pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); + + pdlua_properties_createdialog(p); // <-- create hidden window + + // main window + char frameId[MAXPDSTRING]; + snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)p); + pdgui_vmess(0, "sss", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window + pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); + pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); + pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); + + // call _properties + lua_getglobal(L, "pd"); + lua_getfield(L, -1, "_properties"); + + lua_pushlightuserdata(L, pdlua); + t_pdlua **ctx = lua_newuserdata(L, sizeof(t_pdlua*)); + *ctx = pdlua; + + luaL_getmetatable(L, "PropertiesContext"); + lua_setmetatable(L, -2); + + if (lua_pcall(L, 2, 1, 0)) + { + mylua_error(L, pdlua, "properties"); + return; + } + + // Get the return value (Lua pushes it onto the stack) + int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) + lua_pop(__L(), 1); // Remove the result from the stack + if (!result) + { + pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); + return; + } + pdlua_properties_setupbuttons(p); // <- this is independed of all previous containers +} + +static void pdlua_properties_buildvar(t_pdlua *pdlua, char *out) +{ + char sanitized_frame[MAXPDSTRING]; + snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); + + /* replace '.' because Tcl variable names don't like them */ + for (char *p = sanitized_frame; *p; p++) + if (*p == '.') + *p = '_'; + + snprintf(out, MAXPDSTRING, "::%s%d_%s_value", "pdlua_property", ++pdlua->properties.property_count, sanitized_frame); +} + static int pdlua_properties_newframe(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) @@ -304,20 +393,8 @@ static int pdlua_properties_addcheckbox(lua_State *L) char pdsend[MAXPDSTRING]; char checkid[MAXPDSTRING]; char checkvariable[MAXPDSTRING]; - char sanitized_frame[MAXPDSTRING]; - pdlua->properties.checkbox_count++; - - // Sanitize frame name (replace '.' with '_') - snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); - for (char *p = sanitized_frame; *p != '\0'; p++) { - if (*p == '.') { - *p = '_'; - } - } - // Generate unique variable name - snprintf(checkvariable, MAXPDSTRING, "::checkbox%d_%s_state", pdlua->properties.checkbox_count, - sanitized_frame); + pdlua_properties_buildvar(pdlua, checkvariable); // Initialize the Tcl variable to 0 (unchecked) pdgui_vmess(0, "ssi", "set", checkvariable, init_value); @@ -327,7 +404,7 @@ static int pdlua_properties_addcheckbox(lua_State *L) pdlua->properties.properties_receiver->s_name, method, checkvariable); // Create the checkbox - snprintf(checkid, MAXPDSTRING, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.checkbox_count); + snprintf(checkid, MAXPDSTRING, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); pdgui_vmess(0, "ssssssss", "checkbutton", checkid, "-text", text, "-variable", checkvariable, "-command", pdsend); @@ -335,7 +412,7 @@ static int pdlua_properties_addcheckbox(lua_State *L) "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "add_checkbox: invalid args"); + mylua_error(__L(), NULL, "add_check: invalid args"); } return 0; } @@ -360,45 +437,33 @@ static int pdlua_properties_addtextinput(lua_State *L) char buttonid[MAXPDSTRING]; char entryid[MAXPDSTRING]; - char numvariable[MAXPDSTRING]; - - char sanitized_frame[MAXPDSTRING]; - pdlua->properties.numberbox_count++; + char textvariable[MAXPDSTRING]; - // Sanitize frame name (replace '.' with '_') - snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); - for (char *p = sanitized_frame; *p != '\0'; p++) { - if (*p == '.') { - *p = '_'; - } - } + pdlua_properties_buildvar(pdlua, textvariable); - // Variable save the value of gui obj - snprintf(numvariable, MAXPDSTRING, "::numberbox%d_%s_value", pdlua->properties.numberbox_count, - sanitized_frame); - pdgui_vmess(0, "sss", "set", numvariable, init_value); + pdgui_vmess(0, "sss", "set", textvariable, init_value); // Command to send it to pd - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, numvariable); + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties textbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, textvariable); // container for button to set and text input char text_button_frame[MAXPDSTRING]; snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, - pdlua->properties.numberbox_count); + pdlua->properties.property_count); pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 1, "-padx", 5, "-pady", 5); // create text for identification - snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, pdlua->properties.numberbox_count); + snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, pdlua->properties.property_count); pdgui_vmess(0, "ssss", "label", textid, "-text", text); // Create the number entry box - snprintf(entryid, MAXPDSTRING, "%s.numberbox%d", text_button_frame, pdlua->properties.numberbox_count); - pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", numvariable, "-width", width); + snprintf(entryid, MAXPDSTRING, "%s.textbox%d", text_button_frame, pdlua->properties.property_count); + pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", width); // Create the set button - snprintf(buttonid, MAXPDSTRING, "%s.setbutton%d", text_button_frame, pdlua->properties.numberbox_count); + snprintf(buttonid, MAXPDSTRING, "%s.setbutton%d", text_button_frame, pdlua->properties.property_count); pdgui_vmess(0, "sssssssisi", "button", buttonid, "-text", "Set", "-command", pdsend, "-padx", 10, "-pady", 0); @@ -410,7 +475,7 @@ static int pdlua_properties_addtextinput(lua_State *L) pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "add_textinput: invalid args"); + mylua_error(__L(), NULL, "add_text: invalid args"); } return 0; } @@ -426,20 +491,8 @@ static int pdlua_properties_addcolorpicker(lua_State *L) { char pdsend[MAXPDSTRING]; char buttonid[MAXPDSTRING]; char colorvariable[MAXPDSTRING]; - char sanitized_frame[MAXPDSTRING]; - pdlua->properties.colorpicker_count++; - - // Sanitize frame name (replace '.' with '_') - snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); - for (char *p = sanitized_frame; *p != '\0'; p++) { - if (*p == '.') { - *p = '_'; - } - } - // Generate unique variable name - snprintf(colorvariable, MAXPDSTRING, "::colorpicker%d_%s_value", pdlua->properties.colorpicker_count, - sanitized_frame); + pdlua_properties_buildvar(pdlua, colorvariable); // Initialize the Tcl variable to a default color pdgui_vmess(0, "sss", "set", colorvariable, "#ffffff"); @@ -451,15 +504,167 @@ static int pdlua_properties_addcolorpicker(lua_State *L) { // Create the color picker button with the constructed command snprintf(buttonid, MAXPDSTRING, "%s.colorpicker%d", pdlua->properties.current_frame->s_name, - pdlua->properties.colorpicker_count); + pdlua->properties.property_count); pdgui_vmess(0, "ssssss", "button", buttonid, "-text", text, "-command", pdsend); pdgui_vmess(0, "sssisi", "grid", buttonid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "add_colorpicker: invalid args"); + mylua_error(__L(), NULL, "add_color: invalid args"); + } + + return 0; +} + +static int pdlua_properties_addnumberbox(lua_State *L) +{ + if (lua_isuserdata(L, 1) && + lua_isstring(L, 2) && + lua_isstring(L, 3) && + lua_isnumber(L, 4) && + lua_isstring(L, 5) && + lua_isnumber(L, 6) && + lua_isnumber(L, 7)) + { + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + double init = lua_tonumber(L, 4); + int type = lua_tonumber(L, 5); + double min = lua_tonumber(L, 6); + double max = lua_tonumber(L, 7); + + char pdsend[MAXPDSTRING]; + char spinboxid[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char numvariable[MAXPDSTRING]; + char container[MAXPDSTRING]; + + pdlua_properties_buildvar(pdlua, numvariable); + + pdgui_vmess(0, "ssf", "set", numvariable, init); + + float increment = type ? 1.0f : 0.001f; + + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, numvariable); + + snprintf(container, MAXPDSTRING, "%s.numberbox%d", + pdlua->properties.current_frame->s_name, + pdlua->properties.property_count); + + pdgui_vmess(0, "ss", "frame", container); + + snprintf(textid, MAXPDSTRING, "%s.label", container); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); + + snprintf(spinboxid, MAXPDSTRING, "%s.spin", container); + + if (type) { + pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinboxid, + "-from", min, "-to", max, + "-increment", increment, + "-textvariable", numvariable, + "-width", 8, + "-validate", "key", + "-validatecommand", "string is integer %P", + "-command", pdsend); + } else { + pdgui_vmess(0, "sssfsfsfsssiss", "ttk::spinbox", spinboxid, + "-from", min, "-to", max, + "-increment", increment, + "-textvariable", numvariable, + "-width", 8, + "-command", pdsend); + } + pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); + + pdgui_vmess(0, "ssss", "bind", spinboxid, "<>", pdsend); + pdgui_vmess(0, "ssss", "bind", spinboxid, "<>", pdsend); + pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); + + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", spinboxid, "-side", "top"); + pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + + pdlua_properties_updaterow(&pdlua->properties); + } + else { + mylua_error(__L(), NULL, "add_number: invalid args"); + } + + return 0; +} + +static int pdlua_properties_addcombobox(lua_State *L) +{ + if (lua_isuserdata(L,1) && + lua_isstring(L,2) && + lua_isstring(L,3) && + lua_isnumber(L,4) && + lua_istable(L,5)) + { + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L,1); + + const char *label = lua_tostring(L,2); + const char *method = lua_tostring(L,3); + int init = lua_tonumber(L,4) - 1; + + int options_count = lua_rawlen(L,5); + + char pdsend[MAXPDSTRING]; + char comboid[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char combovar[MAXPDSTRING]; + + pdlua_properties_buildvar(pdlua, combovar); + + const char **opts = calloc(options_count, sizeof(char*)); + for (int i = 0; i < options_count; i++) + { + lua_rawgeti(L, 5, i+1); + opts[i] = lua_isstring(L, -1) ? lua_tostring(L, -1) : ""; + lua_pop(L, 1); + } + + if(init < options_count) { + pdgui_vmess(0,"sss","set", combovar, opts[init]); + } + + snprintf(pdsend, MAXPDSTRING, + "eval pdsend [concat %s _properties combobox %s [expr {[%%W current] + 1}]]", + pdlua->properties.properties_receiver->s_name, method); + + char container[MAXPDSTRING]; + snprintf(container, MAXPDSTRING, "%s.combo%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); + + pdgui_vmess(0,"ss", "frame", container); + + snprintf(textid, MAXPDSTRING, "%s.label", container); + pdgui_vmess(0,"ssss", "label", textid, "-text", label); + + snprintf(comboid, MAXPDSTRING,"%s.widget",container); + + pdgui_vmess(0,"sssssSss", "ttk::combobox", comboid, "-textvariable",combovar, "-values", options_count, opts, "-state", "readonly"); + + pdgui_vmess(0,"ssss", "bind", comboid, "<>", pdsend); + + pdgui_vmess(0,"ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0,"ssss", "pack", comboid, "-side", "top"); + + pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + + pdlua_properties_updaterow(&pdlua->properties); + free(opts); } + else + { + mylua_error(__L(), NULL, "add_combo: invalid args"); + } + + return 0; } #endif @@ -509,7 +714,7 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol *s, int argc, t_atom pd_error(o, "Invalid color format in sscanf"); return; } - } else{ + } else { for (int i = 2; i < argc; i++) { if (argv[i].a_type == A_FLOAT) From 50472beab2da34f87911c1b9ec185a9a57d4fb26 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 19:02:31 +0100 Subject: [PATCH 040/109] Fix duplicate message, update textbox on return/focusout, remove button --- pdlua_properties.h | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index de94cfa..991a637 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -278,7 +278,18 @@ static void pdlua_properties(t_gobj *z, t_glist *owner) { char receiver[MAXPDSTRING]; snprintf(receiver, MAXPDSTRING, ".%p", p); pdlua->properties.properties_receiver = gensym(receiver); + + pdgui_vmess(0, "ss", "destroy", pdlua->properties.properties_receiver->s_name); + + if(pdlua->properties.frame_count != 0) + pd_unbind(&pdlua->pd.ob_pd, p->properties_receiver); + pdlua->properties.current_frame = NULL; + pdlua->properties.frame_count = 0; + pdlua->properties.property_count = 0; + pdlua->properties.current_row = 0; + pdlua->properties.current_col = 0; + pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); pdlua_properties_createdialog(p); // <-- create hidden window @@ -451,26 +462,21 @@ static int pdlua_properties_addtextinput(lua_State *L) char text_button_frame[MAXPDSTRING]; snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 1, + pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 0, "-padx", 5, "-pady", 5); // create text for identification snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, pdlua->properties.property_count); pdgui_vmess(0, "ssss", "label", textid, "-text", text); - // Create the number entry box snprintf(entryid, MAXPDSTRING, "%s.textbox%d", text_button_frame, pdlua->properties.property_count); pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", width); + pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); - // Create the set button - snprintf(buttonid, MAXPDSTRING, "%s.setbutton%d", text_button_frame, pdlua->properties.property_count); - pdgui_vmess(0, "sssssssisi", "button", buttonid, "-text", "Set", "-command", pdsend, "-padx", - 10, "-pady", 0); - - // Pack the entry and button side by side + // Pack the entry pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); pdgui_vmess(0, "ssss", "pack", entryid, "-side", "left"); - pdgui_vmess(0, "ssss", "pack", buttonid, "-side", "right"); pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); @@ -580,10 +586,7 @@ static int pdlua_properties_addnumberbox(lua_State *L) "-command", pdsend); } pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); - - pdgui_vmess(0, "ssss", "bind", spinboxid, "<>", pdsend); - pdgui_vmess(0, "ssss", "bind", spinboxid, "<>", pdsend); - pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); pdgui_vmess(0, "ssss", "pack", spinboxid, "-side", "top"); From 61ab9e7aea4a860254f7ace9a60701c0c95e1067 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 19:58:08 +0100 Subject: [PATCH 041/109] Add error checking, replace add_number with add_int/add_float for clarity --- pd.lua | 5 +- pdlua.c | 14 -- pdlua/tutorial/examples/props.pd_lua | 4 +- pdlua_properties.h | 263 ++++++++++++++++++++------- 4 files changed, 204 insertions(+), 82 deletions(-) diff --git a/pd.lua b/pd.lua index ce40be3..3948219 100644 --- a/pd.lua +++ b/pd.lua @@ -92,13 +92,12 @@ pd._perform_dsp = function (object, ...) end -- draw properties -pd._properties = function (object) +pd._properties = function (object, p) local obj = pd._objects[object] if nil ~= obj and type(obj.properties) == "function" then - obj:properties() + obj:properties(p) return true else - pd.post("not found") return false end end diff --git a/pdlua.c b/pdlua.c index c6530f5..b6b82c9 100644 --- a/pdlua.c +++ b/pdlua.c @@ -2964,20 +2964,6 @@ static void pdlua_init(lua_State *L) lua_pushcfunction(L, pdlua_error); lua_settable(L, -3); - // properties - lua_pushstring(L, "_properties_newframe"); - lua_pushcfunction(L, pdlua_properties_newframe); - lua_settable(L, -3); - lua_pushstring(L, "_properties_addcheckbox"); - lua_pushcfunction(L, pdlua_properties_addcheckbox); - lua_settable(L, -3); - lua_pushstring(L, "_properties_addtextinput"); - lua_pushcfunction(L, pdlua_properties_addtextinput); - lua_settable(L, -3); - lua_pushstring(L, "_properties_addcolorpicker"); - lua_pushcfunction(L, pdlua_properties_addcolorpicker); - lua_settable(L, -3); - /* 20240906 ag: Added TIMEUNITPERMSEC, systime and timesince, to make clock_set useable. NOTE: TIMEUNITPERMSEC is the time unit for systime, timesince, and clock_set and is from m_sched.c. It isn't in the Pd diff --git a/pdlua/tutorial/examples/props.pd_lua b/pdlua/tutorial/examples/props.pd_lua index e2314e0..c6fad14 100644 --- a/pdlua/tutorial/examples/props.pd_lua +++ b/pdlua/tutorial/examples/props.pd_lua @@ -37,8 +37,8 @@ function properties:properties(p) -- Number boxes p:new_frame("Numbers", 2) - p:add_number("Float", "updatefloat", self.float, 0, 0, 1) - p:add_number("Int", "updateint", self.int, 1, 1, 16) + p:add_float("Float", "updatefloat", self.float, 0, 1) + p:add_int("Int", "updateint", self.int, 1, 16) -- Combobox p:new_frame("Combo", 1) diff --git a/pdlua_properties.h b/pdlua_properties.h index 991a637..3ab6aa4 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -22,21 +22,23 @@ */ static int pdlua_properties_newframe(lua_State *L); -static int pdlua_properties_addcheckbox(lua_State *L); -static int pdlua_properties_addtextinput(lua_State *L); -static int pdlua_properties_addcolorpicker(lua_State *L); -static int pdlua_properties_addnumberbox(lua_State *L); -static int pdlua_properties_addcombobox(lua_State *L); +static int pdlua_properties_addcheck(lua_State *L); +static int pdlua_properties_addtext(lua_State *L); +static int pdlua_properties_addcolor(lua_State *L); +static int pdlua_properties_addint(lua_State *L); +static int pdlua_properties_addfloat(lua_State *L); +static int pdlua_properties_addcombo(lua_State *L); static int pdlua_properties_setup(lua_State* L) { static const luaL_Reg properties_methods[] = { {"new_frame", pdlua_properties_newframe}, - {"add_check", pdlua_properties_addcheckbox}, - {"add_text", pdlua_properties_addtextinput}, - {"add_color", pdlua_properties_addcolorpicker}, - {"add_combo", pdlua_properties_addcombobox}, - {"add_number", pdlua_properties_addnumberbox}, + {"add_check", pdlua_properties_addcheck}, + {"add_text", pdlua_properties_addtext}, + {"add_color", pdlua_properties_addcolor}, + {"add_combo", pdlua_properties_addcombo}, + {"add_int", pdlua_properties_addint}, + {"add_float", pdlua_properties_addfloat}, {NULL, NULL} // Sentinel to end the list }; @@ -82,12 +84,12 @@ static int pdlua_properties_newframe(lua_State *L) SETSYMBOL(&atoms[0], gensym(title)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_frame_property"), 1, atoms); } else { - mylua_error(__L(), NULL, "new_frame: invalid args"); + pd_error(NULL, "[pdlua] new_frame: invalid args"); } return 0; } -static int pdlua_properties_addcheckbox(lua_State *L) +static int pdlua_properties_addcheck(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) { @@ -99,12 +101,12 @@ static int pdlua_properties_addcheckbox(lua_State *L) SETFLOAT (&atoms[2], (t_float)lua_tonumber(L, 4)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_check_property"), 3, atoms); } else { - mylua_error(__L(), NULL, "add_check: invalid args"); + pd_error(NULL, "[pdlua] add_check: invalid args"); } return 0; } -static int pdlua_properties_addtextinput(lua_State *L) +static int pdlua_properties_addtext(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) { @@ -117,12 +119,12 @@ static int pdlua_properties_addtextinput(lua_State *L) SETFLOAT (&atoms[3], (t_float)lua_tonumber(L, 5)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_text_property"), 4, atoms); } else { - mylua_error(__L(), NULL, "add_text: invalid args"); + pd_error(NULL, "[pdlua] add_text: invalid args"); } return 0; } -static int pdlua_properties_addcolorpicker(lua_State *L) +static int pdlua_properties_addcolor(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) { @@ -133,43 +135,68 @@ static int pdlua_properties_addcolorpicker(lua_State *L) SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_color_property"), 2, atoms); } else { - mylua_error(__L(), NULL, "add_color: invalid args"); + pd_error(NULL, "[pdlua] add_color: invalid args"); } return 0; } -static int pdlua_properties_addnumberbox(lua_State *L) +static int pdlua_properties_addint(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4) && lua_isnumber(L, 5) && - lua_isnumber(L, 6) && - lua_isnumber(L, 7)) + lua_isnumber(L, 6)) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - t_atom atoms[6]; + t_atom atoms[5]; SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); SETFLOAT(&atoms[2], lua_tonumber(L, 4)); SETFLOAT(&atoms[3], lua_tonumber(L, 5)); SETFLOAT(&atoms[4], lua_tonumber(L, 6)); - SETFLOAT(&atoms[5], lua_tonumber(L, 7)); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 6, atoms); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 5, atoms); } else { - mylua_error(__L(), NULL, "add_number: invalid args"); + pd_error(NULL, "[pdlua] add_int: invalid args"); } return 0; } +static int pdlua_properties_addfloat(lua_State *L) +{ + if (lua_isuserdata(L, 1) && + lua_isstring(L, 2) && + lua_isstring(L, 3) && + lua_isnumber(L, 4) && + lua_isnumber(L, 5) && + lua_isnumber(L, 6)) + { + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + t_atom atoms[5]; -static int pdlua_properties_addcombobox(lua_State *L) + SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); + SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); + SETFLOAT(&atoms[2], lua_tonumber(L, 4)); + SETFLOAT(&atoms[3], lua_tonumber(L, 5)); + SETFLOAT(&atoms[4], lua_tonumber(L, 6)); + + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 5, atoms); + } + else + { + pd_error(NULL, "[pdlua] add_number: invalid args"); + } + + return 0; +} + +static int pdlua_properties_addcombo(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && @@ -201,7 +228,7 @@ static int pdlua_properties_addcombobox(lua_State *L) } else { - mylua_error(__L(), NULL, "add_combo: invalid args"); + pd_error(NULL, "[pdlua] add_combo: invalid args"); } return 0; @@ -383,13 +410,13 @@ static int pdlua_properties_newframe(lua_State *L) pdlua->properties.current_col = 0; pdlua->properties.current_row = 0; } else{ - mylua_error(__L(), NULL, "new_frame: invalid args"); + pd_error(NULL, "[pdlua] new_frame: invalid args"); } return 0; } -static int pdlua_properties_addcheckbox(lua_State *L) +static int pdlua_properties_addcheck(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) { @@ -401,6 +428,12 @@ static int pdlua_properties_addcheckbox(lua_State *L) return 0 ; } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_check: no active frame"); + return 0; + } + char pdsend[MAXPDSTRING]; char checkid[MAXPDSTRING]; char checkvariable[MAXPDSTRING]; @@ -423,13 +456,13 @@ static int pdlua_properties_addcheckbox(lua_State *L) "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "add_check: invalid args"); + pd_error(NULL, "[pdlua] add_check: invalid args"); } return 0; } -static int pdlua_properties_addtextinput(lua_State *L) +static int pdlua_properties_addtext(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) { @@ -443,6 +476,12 @@ static int pdlua_properties_addtextinput(lua_State *L) return 0 ; } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_text: no active frame"); + return 0; + } + char pdsend[MAXPDSTRING]; char textid[MAXPDSTRING]; char buttonid[MAXPDSTRING]; @@ -481,19 +520,25 @@ static int pdlua_properties_addtextinput(lua_State *L) pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "add_text: invalid args"); + pd_error(NULL, "[pdlua] add_text: invalid args"); } return 0; } // static int pdlua_dialog_createcolorpicker(t_pdlua *x, const char *text, const char *method) { -static int pdlua_properties_addcolorpicker(lua_State *L) { +static int pdlua_properties_addcolor(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_color: no active frame"); + return 0; + } + char pdsend[MAXPDSTRING]; char buttonid[MAXPDSTRING]; char colorvariable[MAXPDSTRING]; @@ -517,30 +562,32 @@ static int pdlua_properties_addcolorpicker(lua_State *L) { "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "add_color: invalid args"); + pd_error(NULL, "[pdlua] add_color: invalid args"); } return 0; } -static int pdlua_properties_addnumberbox(lua_State *L) +static int pdlua_properties_addint(lua_State *L) { if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && - lua_isnumber(L, 4) && - lua_isstring(L, 5) && - lua_isnumber(L, 6) && - lua_isnumber(L, 7)) + lua_isnumber(L, 4)) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); double init = lua_tonumber(L, 4); - int type = lua_tonumber(L, 5); - double min = lua_tonumber(L, 6); - double max = lua_tonumber(L, 7); + double min = luaL_optnumber(L, 5, -1e36); + double max = luaL_optnumber(L, 6, 1e36); + + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_int: no active frame"); + return 0; + } char pdsend[MAXPDSTRING]; char spinboxid[MAXPDSTRING]; @@ -552,8 +599,6 @@ static int pdlua_properties_addnumberbox(lua_State *L) pdgui_vmess(0, "ssf", "set", numvariable, init); - float increment = type ? 1.0f : 0.001f; - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, numvariable); @@ -568,23 +613,15 @@ static int pdlua_properties_addnumberbox(lua_State *L) snprintf(spinboxid, MAXPDSTRING, "%s.spin", container); - if (type) { - pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinboxid, - "-from", min, "-to", max, - "-increment", increment, - "-textvariable", numvariable, - "-width", 8, - "-validate", "key", - "-validatecommand", "string is integer %P", - "-command", pdsend); - } else { - pdgui_vmess(0, "sssfsfsfsssiss", "ttk::spinbox", spinboxid, - "-from", min, "-to", max, - "-increment", increment, - "-textvariable", numvariable, - "-width", 8, - "-command", pdsend); - } + pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinboxid, + "-from", min, "-to", max, + "-increment", 1.0f, + "-textvariable", numvariable, + "-width", 8, + "-validate", "key", + "-validatecommand", "string is integer %P", + "-command", pdsend); + pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); @@ -595,13 +632,107 @@ static int pdlua_properties_addnumberbox(lua_State *L) pdlua_properties_updaterow(&pdlua->properties); } else { - mylua_error(__L(), NULL, "add_number: invalid args"); + pd_error(NULL, "[pdlua] add_int: invalid args"); + } + + return 0; +} + +static int pdlua_properties_addfloat(lua_State *L) +{ + if (lua_isuserdata(L, 1) && + lua_isstring(L, 2) && + lua_isstring(L, 3) && + lua_isnumber(L, 4)) + { + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + + const char *text = lua_tostring(L, 2); + const char *method = lua_tostring(L, 3); + double init = lua_tonumber(L, 4); + double min = luaL_optnumber(L, 5, -1e36); + double max = luaL_optnumber(L, 6, 1e36); + + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_float: no active frame"); + return 0; + } + + char pdsend[MAXPDSTRING]; + char entryid[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char numvariable[MAXPDSTRING]; + char container[MAXPDSTRING]; + + pdlua_properties_buildvar(pdlua, numvariable); + + pdgui_vmess(0, "ssf", "set", numvariable, init); + + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties floatbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, numvariable); + + snprintf(container, MAXPDSTRING, "%s.floatbox%d", + pdlua->properties.current_frame->s_name, + pdlua->properties.property_count); + + pdgui_vmess(0, "ss", "frame", container); + + snprintf(textid, MAXPDSTRING, "%s.label", container); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); + + snprintf(entryid, MAXPDSTRING, "%s.entry", container); + + pdgui_vmess(0, "sssssissss", "entry", entryid, + "-textvariable", numvariable, + "-width", 8, + "-validate", "key", + "-validatecommand", "regexp {^-?[0-9]*\\.?[0-9]*$} %P"); + + + char returncmd[MAXPDSTRING * 4]; + snprintf(returncmd, sizeof(returncmd), + "bind %s {" + " set v $%s;" + " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" + " pdsend \"%s _properties floatbox %s $%s\"" + "}\n", + entryid, + numvariable, + min, numvariable, min, + max, numvariable, max, + pdlua->properties.properties_receiver->s_name, method, numvariable); + sys_gui(returncmd); + + char focusoutcmd[MAXPDSTRING * 4]; + snprintf(focusoutcmd, sizeof(focusoutcmd), + "bind %s {" + " set v $%s;" + " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" + " pdsend \"%s _properties floatbox %s $%s\"" + "}\n", + entryid, + numvariable, + min, numvariable, min, + max, numvariable, max, + pdlua->properties.properties_receiver->s_name, method, numvariable); + sys_gui(focusoutcmd); + + + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", entryid, "-side", "top"); + pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + + pdlua_properties_updaterow(&pdlua->properties); + } + else { + pd_error(NULL, "[pdlua] add_float: invalid args"); } return 0; } -static int pdlua_properties_addcombobox(lua_State *L) +static int pdlua_properties_addcombo(lua_State *L) { if (lua_isuserdata(L,1) && lua_isstring(L,2) && @@ -632,6 +763,12 @@ static int pdlua_properties_addcombobox(lua_State *L) lua_pop(L, 1); } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_combo: no active frame"); + return 0; + } + if(init < options_count) { pdgui_vmess(0,"sss","set", combovar, opts[init]); } @@ -664,7 +801,7 @@ static int pdlua_properties_addcombobox(lua_State *L) } else { - mylua_error(__L(), NULL, "add_combo: invalid args"); + pd_error(NULL, "[pdlua] add_combo: invalid args"); } return 0; From f1c7c3d84615f21b44a593ca241bb52bf42d8349 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 21:10:52 +0100 Subject: [PATCH 042/109] Fix properties dialog title --- pdlua_properties.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index 3ab6aa4..1d4eec0 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -237,10 +237,17 @@ static int pdlua_properties_addcombo(lua_State *L) #else -static void pdlua_properties_createdialog(t_pdlua_properties *p) +static void pdlua_properties_createdialog(t_pdlua_properties *p, const char* name) { pdgui_vmess(0, "ssss", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); - pdgui_vmess(0, "ssss", "wm", "title", p->properties_receiver->s_name, "{[mydialog] Properties}"); + + char title[MAXPDSTRING]; + snprintf(title, MAXPDSTRING, "%s", name); + char *suffix = strstr(title, ":gfx"); + if (suffix) *suffix = '\0'; + strncat(title, " Properties", MAXPDSTRING - strlen(title) - 1); + pdgui_vmess(0, "ssss", "wm", "title", p->properties_receiver->s_name, title); + pdgui_vmess(0, "sss", "wm", "group", p->properties_receiver->s_name, "."); pdgui_vmess(0, "sssii", "wm", "resizable", p->properties_receiver->s_name, 0, 0); @@ -319,7 +326,7 @@ static void pdlua_properties(t_gobj *z, t_glist *owner) { pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); - pdlua_properties_createdialog(p); // <-- create hidden window + pdlua_properties_createdialog(p, pdlua->pd.te_g.g_pd->c_name->s_name); // <-- create hidden window // main window char frameId[MAXPDSTRING]; From d9e7763cc7a40693a5d346d51a351061bf21b803 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 21:15:37 +0100 Subject: [PATCH 043/109] Fix int/float property default args for plugdata --- pdlua_properties.h | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index 1d4eec0..dd0910c 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -145,9 +145,7 @@ static int pdlua_properties_addint(lua_State *L) if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && - lua_isnumber(L, 4) && - lua_isnumber(L, 5) && - lua_isnumber(L, 6)) + lua_isnumber(L, 4)) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); t_atom atoms[5]; @@ -155,8 +153,8 @@ static int pdlua_properties_addint(lua_State *L) SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); SETFLOAT(&atoms[2], lua_tonumber(L, 4)); - SETFLOAT(&atoms[3], lua_tonumber(L, 5)); - SETFLOAT(&atoms[4], lua_tonumber(L, 6)); + SETFLOAT(&atoms[3], luaL_optnumber(L, 5, -1e36)); + SETFLOAT(&atoms[4], luaL_optnumber(L, 6, 1e36)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 5, atoms); } @@ -173,9 +171,7 @@ static int pdlua_properties_addfloat(lua_State *L) if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && - lua_isnumber(L, 4) && - lua_isnumber(L, 5) && - lua_isnumber(L, 6)) + lua_isnumber(L, 4)) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); t_atom atoms[5]; @@ -183,8 +179,8 @@ static int pdlua_properties_addfloat(lua_State *L) SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); SETFLOAT(&atoms[2], lua_tonumber(L, 4)); - SETFLOAT(&atoms[3], lua_tonumber(L, 5)); - SETFLOAT(&atoms[4], lua_tonumber(L, 6)); + SETFLOAT(&atoms[3], luaL_optnumber(L, 5, -1e36)); + SETFLOAT(&atoms[4], luaL_optnumber(L, 6, 1e36)); pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 5, atoms); } From 2d6c3d0117fa481b31f445f424adad012b1a15f9 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 16 Mar 2026 21:25:12 +0100 Subject: [PATCH 044/109] Only assign propertiesfn if a properties callback exists --- pd.lua | 3 +++ pdlua.c | 23 ++++++++++++++++------- pdlua_properties.h | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/pd.lua b/pd.lua index 3948219..fa6cdaa 100644 --- a/pd.lua +++ b/pd.lua @@ -391,6 +391,9 @@ function pd.Class:construct(sel, atoms) if type(self.paint) == "function" then pd._creategui(self._object) end + if(type(self.properties) == "function") then + pd._set_propertiesfn(self._object) + end self:postinitialize() return self else diff --git a/pdlua.c b/pdlua.c index b6b82c9..a210935 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1532,9 +1532,6 @@ static int pdlua_class_new(lua_State *L) /* a class with a "menu-open" method will have the "Open" item highlighted in the right-click menu */ class_addmethod(c, (t_method)pdlua_menu_open, gensym("menu-open"), A_NULL);/* (mrpeach 20111025) */ class_addmethod(c, (t_method)pdlua_dsp, gensym("dsp"), A_CANT, 0); /* timschoen 20240226 */ - - class_setpropertiesfn(c, pdlua_properties); - class_addmethod(c, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); } if (c_gfx) { @@ -1560,10 +1557,6 @@ static int pdlua_class_new(lua_State *L) pdlua_widgetbehavior.w_visfn = pdlua_vis; pdlua_widgetbehavior.w_activatefn = pdlua_activate; class_setwidget(c_gfx, &pdlua_widgetbehavior); - - class_setpropertiesfn(c_gfx, pdlua_properties); - class_addmethod(c_gfx, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); - } lua_pushlightuserdata(L, c); @@ -2813,6 +2806,19 @@ static int pdlua_canvas_realizedollar(lua_State *L) return 0; } +static int pdlua_setpropertiesfn(lua_State *L) +{ + t_pdlua *x = (t_pdlua *)lua_touserdata(L, 1); + if(x->pdlua_class) { + class_setpropertiesfn(x->pdlua_class, pdlua_properties); + class_addmethod(x->pdlua_class, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); + } + if(x->pdlua_class_gfx) { + class_setpropertiesfn(x->pdlua_class_gfx, pdlua_properties); + class_addmethod(x->pdlua_class_gfx, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); + } +} + static int pdlua_signal_setmultiout(lua_State *L) { char msg[MAXPDSTRING]; @@ -2963,6 +2969,9 @@ static void pdlua_init(lua_State *L) lua_pushstring(L, "_error"); lua_pushcfunction(L, pdlua_error); lua_settable(L, -3); + lua_pushstring(L, "_set_propertiesfn"); + lua_pushcfunction(L, pdlua_setpropertiesfn); + lua_settable(L, -3); /* 20240906 ag: Added TIMEUNITPERMSEC, systime and timesince, to make clock_set useable. NOTE: TIMEUNITPERMSEC is the time unit for systime, diff --git a/pdlua_properties.h b/pdlua_properties.h index dd0910c..6d3cac3 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -299,7 +299,7 @@ static void pdlua_properties_setupbuttons(t_pdlua_properties *p) { "-ipadx", 10); } -static void pdlua_properties(t_gobj *z, t_glist *owner) { +static void pdlua_properties(t_gobj *z, t_glist *) { t_pdlua *pdlua = (t_pdlua *)z; t_pdlua_properties *p = &pdlua->properties; From 1e464f6f6e1924952310ac0682af5bbd0adc4c48 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 10:41:02 +0100 Subject: [PATCH 045/109] Add image rendering support --- pdlua_gfx.h | 192 +- svg/stb_image.h | 7988 ++++++++++++++++++++++++++++ svg/stb_image_resize2.h | 10679 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 18854 insertions(+), 5 deletions(-) create mode 100644 svg/stb_image.h create mode 100644 svg/stb_image_resize2.h diff --git a/pdlua_gfx.h b/pdlua_gfx.h index e202bc0..5a32d22 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -26,8 +26,14 @@ #include "svg/nanosvg.h" #define NANOSVGRAST_IMPLEMENTATION #include "svg/nanosvgrast.h" + +#define STBI_NO_THREAD_LOCALS +#define STB_IMAGE_IMPLEMENTATION +#include "svg/stb_image.h" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "svg/stb_image_write.h" +#define STB_IMAGE_RESIZE_IMPLEMENTATION +#include "svg/stb_image_resize2.h" #endif #ifdef PURR_DATA @@ -74,6 +80,7 @@ static int stroke_rounded_rect(lua_State* L); static int draw_line(lua_State* L); static int draw_text(lua_State* L); static int draw_svg(lua_State* L); +static int draw_image(lua_State* L); static int start_path(lua_State* L); static int line_to(lua_State* L); @@ -227,6 +234,7 @@ static const luaL_Reg gfx_methods[] = { {"draw_line", draw_line}, {"draw_text", draw_text}, {"draw_svg", draw_svg}, + {"draw_image", draw_image}, {"stroke_path", stroke_path}, {"fill_path", fill_path}, {"fill_all", fill_all}, @@ -480,6 +488,21 @@ static int draw_svg(lua_State* L) { return 0; } +static int draw_image(lua_State* L) { + t_pdlua_gfx *gfx = pop_graphics_context(L); + t_pdlua *obj = gfx->object; + + t_canvas *cnv = glist_getcanvas(obj->canvas); + + t_atom args[3]; + SETSYMBOL(args, gensym(luaL_checkstring(L, 1))); + SETFLOAT(args + 1, luaL_checknumber(L, 2)); // x + SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y + + plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_image"), 3, args); + return 0; +} + static int stroke_path(lua_State* L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1487,14 +1510,14 @@ static int draw_svg(lua_State* L) { // First parse svg text with nanosvg struct NSVGimage* image = nsvgParse(svg_text, "px", 96); if (!image) { - pd_error(0, "[pdlua]: Failed to parse SVG data."); + pd_error(0, "[pdlua] draw_svg: Failed to parse SVG data."); return 0; } // Then rasterize to a bitmap image struct NSVGrasterizer* rast = nsvgCreateRasterizer(); if (!rast) { - pd_error(0, "[pdlua]: Failed to create rasterizer."); + pd_error(0, "[pdlua] draw_svg: Failed to create rasterizer."); return 0; } @@ -1507,7 +1530,7 @@ static int draw_svg(lua_State* L) { unsigned char* bitmap_data = getbytes(image_size); if (!bitmap_data) { - pd_error(0, "[pdlua]: Failed to allocate memory for bitmap."); + pd_error(0, "[pdlua] draw_svg: Failed to allocate memory for bitmap."); return 0; } @@ -1517,7 +1540,7 @@ static int draw_svg(lua_State* L) { int png_size; unsigned char* png_buf = stbi_write_png_to_mem(bitmap_data, w * channels, w, h, channels, &png_size); if (!png_buf || png_size <= 0) { - pd_error(0, "[pdlua]: Failed to encode PNG image."); + pd_error(0, "[pdlua] draw_svg: Failed to encode PNG image."); return 0; } @@ -1526,7 +1549,7 @@ static int draw_svg(lua_State* L) { free(png_buf); if (!encoded_png) { - pd_error(0, "[pdlua]: Failed to encode PNG to Base64."); + pd_error(0, "[pdlua] draw_svg: Failed to encode PNG to Base64."); return 0; } @@ -1557,6 +1580,165 @@ static int draw_svg(lua_State* L) { return 0; } +static int draw_image(lua_State* L) { + t_pdlua_gfx *gfx = pop_graphics_context(L); + t_pdlua *obj = gfx->object; + + t_canvas *cnv = glist_getcanvas(obj->canvas); + int canvas_zoom = glist_getzoom(cnv); + + float scale_x = canvas_zoom, scale_y = canvas_zoom; + transform_size_float(gfx, &scale_x, &scale_y); + float scale = (scale_x + scale_y) * 0.5f; + + const char *image_path = luaL_checkstring(L, 1); + int x = luaL_checknumber(L, 2); + int y = luaL_checknumber(L, 3); + + uint64_t image_hash = pdlua_image_hash((unsigned char*)image_path, scale); + + transform_point(gfx, &x, &y); + x += text_xpix((t_object*)obj, obj->canvas) / canvas_zoom; + y += text_ypix((t_object*)obj, obj->canvas) / canvas_zoom; + x *= canvas_zoom; + y *= canvas_zoom; + + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + + char image_name[64]; + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, image_hash); + +#ifndef PURR_DATA + // Fast path: scaled image already uploaded to Tk + for (int i = 0; i < gfx->num_images; i++) { + if (gfx->images[i] == image_hash) { + pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, + "-image", image_name, "-anchor", "nw", "-tags", 3, tags); + return 0; + } + } + + // Locate the file through Pd's search path + char dirresult[MAXPDSTRING]; + char *nameresult = NULL; + int fd = canvas_open(obj->canvas, image_path, "", + dirresult, &nameresult, MAXPDSTRING, 0); + if (fd < 0) { + pd_error(obj, "[pdlua] draw_image: cannot open '%s'", image_path); + return 0; + } + + FILE *fp = fdopen(fd, "rb"); + if (!fp) { + pd_error(obj, "[pdlua] draw_image: fdopen failed"); + sys_close(fd); + return 0; + } + + fseek(fp, 0, SEEK_END); + long file_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + + if (file_size <= 0) { + pd_error(obj, "[pdlua] draw_image: empty file '%s'", image_path); + fclose(fp); + return 0; + } + + unsigned char *file_data = getbytes((size_t)file_size); + if (!file_data) { + pd_error(obj, "[pdlua] draw_image: out of memory"); + fclose(fp); + return 0; + } + + if ((long)fread(file_data, 1, (size_t)file_size, fp) != file_size) { + pd_error(obj, "[pdlua] draw_image: read error for '%s'", image_path); + freebytes(file_data, (size_t)file_size); + fclose(fp); + return 0; + } + fclose(fp); + + // Decode image with stb_image (handles PNG, JPG, GIF, BMP, etc) + int src_w, src_h, channels; + unsigned char *src_pixels = stbi_load_from_memory(file_data, (int)file_size, + &src_w, &src_h, &channels, 4); + freebytes(file_data, (size_t)file_size); + + if (!src_pixels) { + pd_error(obj, "[pdlua] draw_image: stb_image decode failed for '%s': %s", + image_path, stbi_failure_reason()); + return 0; + } + + // Compute scaled dimensions + int dst_w = (int)(src_w * scale + 0.5f); + int dst_h = (int)(src_h * scale + 0.5f); + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + unsigned char *dst_pixels = NULL; + + if (dst_w == src_w && dst_h == src_h) { + // No resize needed, use source directly + dst_pixels = src_pixels; + } else { + dst_pixels = getbytes(dst_w * dst_h * 4); + if (!dst_pixels) { + pd_error(obj, "[pdlua] draw_image: out of memory for resized buffer"); + stbi_image_free(src_pixels); + return 0; + } + + // stbir_resize_uint8_linear gives a proper box/bilinear filtered result + stbir_resize_uint8_linear(src_pixels, src_w, src_h, 0, + dst_pixels, dst_w, dst_h, 0, STBIR_RGBA); + stbi_image_free(src_pixels); + } + + // Encode to PNG → Base64 → Tk photo image (same path as draw_svg) + int png_size; + unsigned char *png_buf = stbi_write_png_to_mem(dst_pixels, dst_w * 4, + dst_w, dst_h, 4, &png_size); + if (dst_pixels != src_pixels) + freebytes(dst_pixels, dst_w * dst_h * 4); + else + stbi_image_free(src_pixels); + + if (!png_buf || png_size <= 0) { + pd_error(obj, "[pdlua] draw_image: PNG encode failed"); + return 0; + } + + char *encoded = pdlua_base64_encode(png_buf, (size_t)png_size); + free(png_buf); + + if (!encoded) { + pd_error(obj, "[pdlua] draw_image: base64 encode failed"); + return 0; + } + + pdgui_vmess(0, "rrr s rs", "image", "create", "photo", image_name, "-data", encoded); + pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, + "-image", image_name, "-anchor", "nw", "-tags", 3, tags); + free(encoded); + + // Cache the scaled hash + if (gfx->num_images == 0) + gfx->images = getbytes(sizeof(uint64_t)); + else + gfx->images = resizebytes(gfx->images, + gfx->num_images * sizeof(uint64_t), + (gfx->num_images + 1) * sizeof(uint64_t)); + gfx->images[gfx->num_images++] = image_hash; + +#else + // TODO: purr-data +#endif + return 0; +} + static int stroke_path(lua_State* L) { t_pdlua_gfx *gfx = pop_graphics_context(L); diff --git a/svg/stb_image.h b/svg/stb_image.h new file mode 100644 index 0000000..9eedabe --- /dev/null +++ b/svg/stb_image.h @@ -0,0 +1,7988 @@ +/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.30 (2024-05-31) avoid erroneous gcc warning + 2.29 (2023-05-xx) optimizations + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two ints fits in a signed short, 0 on overflow. +static int stbi__mul2shorts_valid(int a, int b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) { + for (j=0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc) (i+1); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << j->succ_low)); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << shift)); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift)); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + stbi_uc x = stbi__get8(j->s); + while (x == 0xff) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); + } + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + int hit_zeof_once; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + if (!a->hit_zeof_once) { + // This is the first time we hit eof, insert 16 extra padding btis + // to allow us to keep going; if we actually consume any of them + // though, that is invalid data. This is caught later. + a->hit_zeof_once = 1; + a->num_bits += 16; // add 16 implicit zero bits + } else { + // We already inserted our extra 16 padding bits and are again + // out, this stream is actually prematurely terminated. + return -1; + } + } else { + stbi__fill_bits(a); + } + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + if (a->hit_zeof_once && a->num_bits < 16) { + // The first time we hit zeof, we inserted 16 extra zero bits into our bit + // buffer so the decoder can just do its speculative decoding. But if we + // actually consumed any of those bits (which is the case when num_bits < 16), + // the stream actually read past the end so it is malformed. + return stbi__err("unexpected end","Corrupt PNG"); + } + return 1; + } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (len > a->zout_end - zout) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + a->hit_zeof_once = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filter used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub +}; + +static int stbi__paeth(int a, int b, int c) +{ + // This formulation looks very different from the reference in the PNG spec, but is + // actually equivalent and has favorable data dependencies and admits straightforward + // generation of branch-free code, which helps performance significantly. + int thresh = c*3 - (a + b); + int lo = a < b ? a : b; + int hi = a < b ? b : a; + int t0 = (hi <= thresh) ? lo : c; + int t1 = (thresh <= lo) ? hi : t0; + return t1; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// adds an extra all-255 alpha channel +// dest == src is legal +// img_n must be 1 or 3 +static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) +{ + int i; + // must process data backwards since we allow dest==src + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + dest[i*2+1] = 255; + dest[i*2+0] = src[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + dest[i*4+3] = 255; + dest[i*4+2] = src[i*3+2]; + dest[i*4+1] = src[i*3+1]; + dest[i*4+0] = src[i*3+0]; + } + } +} + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16 ? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + stbi_uc *filter_buf; + int all_ok = 1; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + // note: error exits here don't need to clean up a->out individually, + // stbi__do_png always does on error. + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + // Allocate two scan lines worth of filter workspace buffer. + filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); + if (!filter_buf) return stbi__err("outofmem", "Out of memory"); + + // Filtering for low-bit-depth images + if (depth < 8) { + filter_bytes = 1; + width = img_width_bytes; + } + + for (j=0; j < y; ++j) { + // cur/prior filter buffers alternate + stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; + stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; + stbi_uc *dest = a->out + stride*j; + int nk = width * filter_bytes; + int filter = *raw++; + + // check filter type + if (filter > 4) { + all_ok = stbi__err("invalid filter","Corrupt PNG"); + break; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // perform actual filtering + switch (filter) { + case STBI__F_none: + memcpy(cur, raw, nk); + break; + case STBI__F_sub: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); + break; + case STBI__F_up: + for (k = 0; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); + break; + case STBI__F_paeth: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); + break; + case STBI__F_avg_first: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); + break; + } + + raw += nk; + + // expand decoded bits in cur to dest, also adding an extra alpha channel if desired + if (depth < 8) { + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + stbi_uc *in = cur; + stbi_uc *out = dest; + stbi_uc inb = 0; + stbi__uint32 nsmp = x*img_n; + + // expand bits to bytes first + if (depth == 4) { + for (i=0; i < nsmp; ++i) { + if ((i & 1) == 0) inb = *in++; + *out++ = scale * (inb >> 4); + inb <<= 4; + } + } else if (depth == 2) { + for (i=0; i < nsmp; ++i) { + if ((i & 3) == 0) inb = *in++; + *out++ = scale * (inb >> 6); + inb <<= 2; + } + } else { + STBI_ASSERT(depth == 1); + for (i=0; i < nsmp; ++i) { + if ((i & 7) == 0) inb = *in++; + *out++ = scale * (inb >> 7); + inb <<= 1; + } + } + + // insert alpha=255 values if desired + if (img_n != out_n) + stbi__create_png_alpha_expand8(dest, dest, x, img_n); + } else if (depth == 8) { + if (img_n == out_n) + memcpy(dest, cur, x*img_n); + else + stbi__create_png_alpha_expand8(dest, cur, x, img_n); + } else if (depth == 16) { + // convert the image data from big-endian to platform-native + stbi__uint16 *dest16 = (stbi__uint16*)dest; + stbi__uint32 nsmp = x*img_n; + + if (img_n == out_n) { + for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) + *dest16 = (cur[0] << 8) | cur[1]; + } else { + STBI_ASSERT(img_n+1 == out_n); + if (img_n == 1) { + for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = 0xffff; + } + } else { + STBI_ASSERT(img_n == 3); + for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = (cur[2] << 8) | cur[3]; + dest16[2] = (cur[4] << 8) | cur[5]; + dest16[3] = 0xffff; + } + } + } + } + } + + STBI_FREE(filter_buf); + if (!all_ok) return 0; + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } + if (z->depth == 16) { + for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning + tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n && k < 3; ++k) + tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + // V4/V5 header + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!g) return stbi__err("outofmem", "Out of memory"); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/svg/stb_image_resize2.h b/svg/stb_image_resize2.h new file mode 100644 index 0000000..0798976 --- /dev/null +++ b/svg/stb_image_resize2.h @@ -0,0 +1,10679 @@ +/* stb_image_resize2 - v2.18 - public domain image resizing + + by Jeff Roberts (v2) and Jorge L Rodriguez + http://github.com/nothings/stb + + Can be threaded with the extended API. SSE2, AVX, Neon and WASM SIMD support. Only + scaling and translation is supported, no rotations or shears. + + COMPILING & LINKING + In one C/C++ file that #includes this file, do this: + #define STB_IMAGE_RESIZE_IMPLEMENTATION + before the #include. That will create the implementation in that file. + + EASY API CALLS: + Easy API downsamples w/Mitchell filter, upsamples w/cubic interpolation, clamps to edge. + + stbir_resize_uint8_srgb( input_pixels, input_w, input_h, input_stride_in_bytes, + output_pixels, output_w, output_h, output_stride_in_bytes, + pixel_layout_enum ) + + stbir_resize_uint8_linear( input_pixels, input_w, input_h, input_stride_in_bytes, + output_pixels, output_w, output_h, output_stride_in_bytes, + pixel_layout_enum ) + + stbir_resize_float_linear( input_pixels, input_w, input_h, input_stride_in_bytes, + output_pixels, output_w, output_h, output_stride_in_bytes, + pixel_layout_enum ) + + If you pass NULL or zero for the output_pixels, we will allocate the output buffer + for you and return it from the function (free with free() or STBIR_FREE). + As a special case, XX_stride_in_bytes of 0 means packed continuously in memory. + + API LEVELS + There are three levels of API - easy-to-use, medium-complexity and extended-complexity. + + See the "header file" section of the source for API documentation. + + ADDITIONAL DOCUMENTATION + + MEMORY ALLOCATION + By default, we use malloc and free for memory allocation. To override the + memory allocation, before the implementation #include, add a: + + #define STBIR_MALLOC(size,user_data) ... + #define STBIR_FREE(ptr,user_data) ... + + Each resize makes exactly one call to malloc/free (unless you use the + extended API where you can do one allocation for many resizes). Under + address sanitizer, we do separate allocations to find overread/writes. + + PERFORMANCE + This library was written with an emphasis on performance. When testing + stb_image_resize with RGBA, the fastest mode is STBIR_4CHANNEL with + STBIR_TYPE_UINT8 pixels and CLAMPed edges (which is what many other resize + libs do by default). Also, make sure SIMD is turned on of course (default + for 64-bit targets). Avoid WRAP edge mode if you want the fastest speed. + + This library also comes with profiling built-in. If you define STBIR_PROFILE, + you can use the advanced API and get low-level profiling information by + calling stbir_resize_extended_profile_info() or stbir_resize_split_profile_info() + after a resize. + + SIMD + Most of the routines have optimized SSE2, AVX, NEON and WASM versions. + + On Microsoft compilers, we automatically turn on SIMD for 64-bit x64 and + ARM; for 32-bit x86 and ARM, you select SIMD mode by defining STBIR_SSE2 or + STBIR_NEON. For AVX and AVX2, we auto-select it by detecting the /arch:AVX + or /arch:AVX2 switches. You can also always manually turn SSE2, AVX or AVX2 + support on by defining STBIR_SSE2, STBIR_AVX or STBIR_AVX2. + + On Linux, SSE2 and Neon is on by default for 64-bit x64 or ARM64. For 32-bit, + we select x86 SIMD mode by whether you have -msse2, -mavx or -mavx2 enabled + on the command line. For 32-bit ARM, you must pass -mfpu=neon-vfpv4 for both + clang and GCC, but GCC also requires an additional -mfp16-format=ieee to + automatically enable NEON. + + On x86 platforms, you can also define STBIR_FP16C to turn on FP16C instructions + for converting back and forth to half-floats. This is autoselected when we + are using AVX2. Clang and GCC also require the -mf16c switch. ARM always uses + the built-in half float hardware NEON instructions. + + You can also tell us to use multiply-add instructions with STBIR_USE_FMA. + Because x86 doesn't always have fma, we turn it off by default to maintain + determinism across all platforms. If you don't care about non-FMA determinism + and are willing to restrict yourself to more recent x86 CPUs (around the AVX + timeframe), then fma will give you around a 15% speedup. + + You can force off SIMD in all cases by defining STBIR_NO_SIMD. You can turn + off AVX or AVX2 specifically with STBIR_NO_AVX or STBIR_NO_AVX2. AVX is 10% + to 40% faster, and AVX2 is generally another 12%. + + ALPHA CHANNEL + Most of the resizing functions provide the ability to control how the alpha + channel of an image is processed. + + When alpha represents transparency, it is important that when combining + colors with filtering, the pixels should not be treated equally; they + should use a weighted average based on their alpha values. For example, + if a pixel is 1% opaque bright green and another pixel is 99% opaque + black and you average them, the average will be 50% opaque, but the + unweighted average and will be a middling green color, while the weighted + average will be nearly black. This means the unweighted version introduced + green energy that didn't exist in the source image. + + (If you want to know why this makes sense, you can work out the math for + the following: consider what happens if you alpha composite a source image + over a fixed color and then average the output, vs. if you average the + source image pixels and then composite that over the same fixed color. + Only the weighted average produces the same result as the ground truth + composite-then-average result.) + + Therefore, it is in general best to "alpha weight" the pixels when applying + filters to them. This essentially means multiplying the colors by the alpha + values before combining them, and then dividing by the alpha value at the + end. + + The computer graphics industry introduced a technique called "premultiplied + alpha" or "associated alpha" in which image colors are stored in image files + already multiplied by their alpha. This saves some math when compositing, + and also avoids the need to divide by the alpha at the end (which is quite + inefficient). However, while premultiplied alpha is common in the movie CGI + industry, it is not commonplace in other industries like videogames, and most + consumer file formats are generally expected to contain not-premultiplied + colors. For example, Photoshop saves PNG files "unpremultiplied", and web + browsers like Chrome and Firefox expect PNG images to be unpremultiplied. + + Note that there are three possibilities that might describe your image + and resize expectation: + + 1. images are not premultiplied, alpha weighting is desired + 2. images are not premultiplied, alpha weighting is not desired + 3. images are premultiplied + + Both case #2 and case #3 require the exact same math: no alpha weighting + should be applied or removed. Only case 1 requires extra math operations; + the other two cases can be handled identically. + + stb_image_resize expects case #1 by default, applying alpha weighting to + images, expecting the input images to be unpremultiplied. This is what the + COLOR+ALPHA buffer types tell the resizer to do. + + When you use the pixel layouts STBIR_RGBA, STBIR_BGRA, STBIR_ARGB, + STBIR_ABGR, STBIR_RA, or STBIR_AR you are telling us that the pixels are + non-premultiplied. In these cases, the resizer will alpha weight the colors + (effectively creating the premultiplied image), do the filtering, and then + convert back to non-premult on exit. + + When you use the pixel layouts STBIR_RGBA_PM, STBIR_BGRA_PM, STBIR_ARGB_PM, + STBIR_ABGR_PM, STBIR_RA_PM or STBIR_AR_PM, you are telling that the pixels + ARE premultiplied. In this case, the resizer doesn't have to do the + premultipling - it can filter directly on the input. This about twice as + fast as the non-premultiplied case, so it's the right option if your data is + already setup correctly. + + When you use the pixel layout STBIR_4CHANNEL or STBIR_2CHANNEL, you are + telling us that there is no channel that represents transparency; it may be + RGB and some unrelated fourth channel that has been stored in the alpha + channel, but it is actually not alpha. No special processing will be + performed. + + The difference between the generic 4 or 2 channel layouts, and the + specialized _PM versions is with the _PM versions you are telling us that + the data *is* alpha, just don't premultiply it. That's important when + using SRGB pixel formats, we need to know where the alpha is, because + it is converted linearly (rather than with the SRGB converters). + + Because alpha weighting produces the same effect as premultiplying, you + even have the option with non-premultiplied inputs to let the resizer + produce a premultiplied output. Because the intially computed alpha-weighted + output image is effectively premultiplied, this is actually more performant + than the normal path which un-premultiplies the output image as a final step. + + Finally, when converting both in and out of non-premulitplied space (for + example, when using STBIR_RGBA), we go to somewhat heroic measures to + ensure that areas with zero alpha value pixels get something reasonable + in the RGB values. If you don't care about the RGB values of zero alpha + pixels, you can call the stbir_set_non_pm_alpha_speed_over_quality() + function - this runs a premultiplied resize about 25% faster. That said, + when you really care about speed, using premultiplied pixels for both in + and out (STBIR_RGBA_PM, etc) much faster than both of these premultiplied + options. + + PIXEL LAYOUT CONVERSION + The resizer can convert from some pixel layouts to others. When using the + stbir_set_pixel_layouts(), you can, for example, specify STBIR_RGBA + on input, and STBIR_ARGB on output, and it will re-organize the channels + during the resize. Currently, you can only convert between two pixel + layouts with the same number of channels. + + DETERMINISM + We commit to being deterministic (from x64 to ARM to scalar to SIMD, etc). + This requires compiling with fast-math off (using at least /fp:precise). + Also, you must turn off fp-contracting (which turns mult+adds into fmas)! + We attempt to do this with pragmas, but with Clang, you usually want to add + -ffp-contract=off to the command line as well. + + For 32-bit x86, you must use SSE and SSE2 codegen for determinism. That is, + if the scalar x87 unit gets used at all, we immediately lose determinism. + On Microsoft Visual Studio 2008 and earlier, from what we can tell there is + no way to be deterministic in 32-bit x86 (some x87 always leaks in, even + with fp:strict). On 32-bit x86 GCC, determinism requires both -msse2 and + -fpmath=sse. + + Note that we will not be deterministic with float data containing NaNs - + the NaNs will propagate differently on different SIMD and platforms. + + If you turn on STBIR_USE_FMA, then we will be deterministic with other + fma targets, but we will differ from non-fma targets (this is unavoidable, + because a fma isn't simply an add with a mult - it also introduces a + rounding difference compared to non-fma instruction sequences. + + FLOAT PIXEL FORMAT RANGE + Any range of values can be used for the non-alpha float data that you pass + in (0 to 1, -1 to 1, whatever). However, if you are inputting float values + but *outputting* bytes or shorts, you must use a range of 0 to 1 so that we + scale back properly. The alpha channel must also be 0 to 1 for any format + that does premultiplication prior to resizing. + + Note also that with float output, using filters with negative lobes, the + output filtered values might go slightly out of range. You can define + STBIR_FLOAT_LOW_CLAMP and/or STBIR_FLOAT_HIGH_CLAMP to specify the range + to clamp to on output, if that's important. + + MAX/MIN SCALE FACTORS + The input pixel resolutions are in integers, and we do the internal pointer + resolution in size_t sized integers. However, the scale ratio from input + resolution to output resolution is calculated in float form. This means + the effective possible scale ratio is limited to 24 bits (or 16 million + to 1). As you get close to the size of the float resolution (again, 16 + million pixels wide or high), you might start seeing float inaccuracy + issues in general in the pipeline. If you have to do extreme resizes, + you can usually do this is multiple stages (using float intermediate + buffers). + + FLIPPED IMAGES + Stride is just the delta from one scanline to the next. This means you can + use a negative stride to handle inverted images (point to the final + scanline and use a negative stride). You can invert the input or output, + using negative strides. + + DEFAULT FILTERS + For functions which don't provide explicit control over what filters to + use, you can change the compile-time defaults with: + + #define STBIR_DEFAULT_FILTER_UPSAMPLE STBIR_FILTER_something + #define STBIR_DEFAULT_FILTER_DOWNSAMPLE STBIR_FILTER_something + + See stbir_filter in the header-file section for the list of filters. + + NEW FILTERS + A number of 1D filter kernels are supplied. For a list of supported + filters, see the stbir_filter enum. You can install your own filters by + using the stbir_set_filter_callbacks function. + + PROGRESS + For interactive use with slow resize operations, you can use the + scanline callbacks in the extended API. It would have to be a *very* large + image resample to need progress though - we're very fast. + + CEIL and FLOOR + In scalar mode, the only functions we use from math.h are ceilf and floorf, + but if you have your own versions, you can define the STBIR_CEILF(v) and + STBIR_FLOORF(v) macros and we'll use them instead. In SIMD, we just use + our own versions. + + ASSERT + Define STBIR_ASSERT(boolval) to override assert() and not use assert.h + + PORTING FROM VERSION 1 + The API has changed. You can continue to use the old version of stb_image_resize.h, + which is available in the "deprecated/" directory. + + If you're using the old simple-to-use API, porting is straightforward. + (For more advanced APIs, read the documentation.) + + stbir_resize_uint8(): + - call `stbir_resize_uint8_linear`, cast channel count to `stbir_pixel_layout` + + stbir_resize_float(): + - call `stbir_resize_float_linear`, cast channel count to `stbir_pixel_layout` + + stbir_resize_uint8_srgb(): + - function name is unchanged + - cast channel count to `stbir_pixel_layout` + - above is sufficient unless your image has alpha and it's not RGBA/BGRA + - in that case, follow the below instructions for stbir_resize_uint8_srgb_edgemode + + stbir_resize_uint8_srgb_edgemode() + - switch to the "medium complexity" API + - stbir_resize(), very similar API but a few more parameters: + - pixel_layout: cast channel count to `stbir_pixel_layout` + - data_type: STBIR_TYPE_UINT8_SRGB + - edge: unchanged (STBIR_EDGE_WRAP, etc.) + - filter: STBIR_FILTER_DEFAULT + - which channel is alpha is specified in stbir_pixel_layout, see enum for details + + FUTURE TODOS + * For polyphase integral filters, we just memcpy the coeffs to dupe + them, but we should indirect and use the same coeff memory. + * Add pixel layout conversions for sensible different channel counts + (maybe, 1->3/4, 3->4, 4->1, 3->1). + * For SIMD encode and decode scanline routines, do any pre-aligning + for bad input/output buffer alignments and pitch? + * For very wide scanlines, we should we do vertical strips to stay within + L2 cache. Maybe do chunks of 1K pixels at a time. There would be + some pixel reconversion, but probably dwarfed by things falling out + of cache. Probably also something possible with alternating between + scattering and gathering at high resize scales? + * Should we have a multiple MIPs at the same time function (could keep + more memory in cache during multiple resizes)? + * Rewrite the coefficient generator to do many at once. + * AVX-512 vertical kernels - worried about downclocking here. + * Convert the reincludes to macros when we know they aren't changing. + * Experiment with pivoting the horizontal and always using the + vertical filters (which are faster, but perhaps not enough to overcome + the pivot cost and the extra memory touches). Need to buffer the whole + image so have to balance memory use. + * Most of our code is internally function pointers, should we compile + all the SIMD stuff always and dynamically dispatch? + + CONTRIBUTORS + Jeff Roberts: 2.0 implementation, optimizations, SIMD + Martins Mozeiko: NEON simd, WASM simd, clang and GCC whisperer + Fabian Giesen: half float and srgb converters + Sean Barrett: API design, optimizations + Jorge L Rodriguez: Original 1.0 implementation + Aras Pranckevicius: bugfixes + Nathan Reed: warning fixes for 1.0 + + REVISIONS + 2.18 (2026-03-25) fixed coefficient calculation when skipping a coefficient off + the left side of the window, added non-aligned access safe + memcpy mode for scalar path, fixed various typos, and fixed + define error in the float clamp output mode. + 2.17 (2025-10-25) silly format bug in easy-to-use APIs. + 2.16 (2025-10-21) fixed the easy-to-use APIs to allow inverted bitmaps (negative + strides), fix vertical filter kernel callback, fix threaded + gather buffer priming (and assert). + (thanks adipose, TainZerL, and Harrison Green) + 2.15 (2025-07-17) fixed an assert in debug mode when using floats with input + callbacks, work around GCC warning when adding to null ptr + (thanks Johannes Spohr and Pyry Kovanen). + 2.14 (2025-05-09) fixed a bug using downsampling gather horizontal first, and + scatter with vertical first. + 2.13 (2025-02-27) fixed a bug when using input callbacks, turned off simd for + tiny-c, fixed some variables that should have been static, + fixes a bug when calculating temp memory with resizes that + exceed 2GB of temp memory (very large resizes). + 2.12 (2024-10-18) fix incorrect use of user_data with STBIR_FREE + 2.11 (2024-09-08) fix harmless asan warnings in 2-channel and 3-channel mode + with AVX-2, fix some weird scaling edge conditions with + point sample mode. + 2.10 (2024-07-27) fix the defines GCC and mingw for loop unroll control, + fix MSVC 32-bit arm half float routines. + 2.09 (2024-06-19) fix the defines for 32-bit ARM GCC builds (was selecting + hardware half floats). + 2.08 (2024-06-10) fix for RGB->BGR three channel flips and add SIMD (thanks + to Ryan Salsbury), fix for sub-rect resizes, use the + pragmas to control unrolling when they are available. + 2.07 (2024-05-24) fix for slow final split during threaded conversions of very + wide scanlines when downsampling (caused by extra input + converting), fix for wide scanline resamples with many + splits (int overflow), fix GCC warning. + 2.06 (2024-02-10) fix for identical width/height 3x or more down-scaling + undersampling a single row on rare resize ratios (about 1%). + 2.05 (2024-02-07) fix for 2 pixel to 1 pixel resizes with wrap (thanks Aras), + fix for output callback (thanks Julien Koenen). + 2.04 (2023-11-17) fix for rare AVX bug, shadowed symbol (thanks Nikola Smiljanic). + 2.03 (2023-11-01) ASAN and TSAN warnings fixed, minor tweaks. + 2.00 (2023-10-10) mostly new source: new api, optimizations, simd, vertical-first, etc + 2x-5x faster without simd, 4x-12x faster with simd, + in some cases, 20x to 40x faster esp resizing large to very small. + 0.96 (2019-03-04) fixed warnings + 0.95 (2017-07-23) fixed warnings + 0.94 (2017-03-18) fixed warnings + 0.93 (2017-03-03) fixed bug with certain combinations of heights + 0.92 (2017-01-02) fix integer overflow on large (>2GB) images + 0.91 (2016-04-02) fix warnings; fix handling of subpixel regions + 0.90 (2014-09-17) first released version + + LICENSE + See end of file for license information. +*/ + +#if !defined(STB_IMAGE_RESIZE_DO_HORIZONTALS) && !defined(STB_IMAGE_RESIZE_DO_VERTICALS) && !defined(STB_IMAGE_RESIZE_DO_CODERS) // for internal re-includes + +#ifndef STBIR_INCLUDE_STB_IMAGE_RESIZE2_H +#define STBIR_INCLUDE_STB_IMAGE_RESIZE2_H + +#include +#ifdef _MSC_VER +typedef unsigned char stbir_uint8; +typedef unsigned short stbir_uint16; +typedef unsigned int stbir_uint32; +typedef unsigned __int64 stbir_uint64; +#else +#include +typedef uint8_t stbir_uint8; +typedef uint16_t stbir_uint16; +typedef uint32_t stbir_uint32; +typedef uint64_t stbir_uint64; +#endif + +#ifndef STBIRDEF +#ifdef STB_IMAGE_RESIZE_STATIC +#define STBIRDEF static +#else +#ifdef __cplusplus +#define STBIRDEF extern "C" +#else +#define STBIRDEF extern +#endif +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +//// start "header file" /////////////////////////////////////////////////// +// +// Easy-to-use API: +// +// * stride is the offset between successive rows of image data +// in memory, in bytes. specify 0 for packed continuously in memory +// * colorspace is linear or sRGB as specified by function name +// * Uses the default filters +// * Uses edge mode clamped +// * returned result is 1 for success or 0 in case of an error. + + +// stbir_pixel_layout specifies: +// number of channels +// order of channels +// whether color is premultiplied by alpha +// for back compatibility, you can cast the old channel count to an stbir_pixel_layout +typedef enum +{ + STBIR_1CHANNEL = 1, + STBIR_2CHANNEL = 2, + STBIR_RGB = 3, // 3-chan, with order specified (for channel flipping) + STBIR_BGR = 0, // 3-chan, with order specified (for channel flipping) + STBIR_4CHANNEL = 5, + + STBIR_RGBA = 4, // alpha formats, where alpha is NOT premultiplied into color channels + STBIR_BGRA = 6, + STBIR_ARGB = 7, + STBIR_ABGR = 8, + STBIR_RA = 9, + STBIR_AR = 10, + + STBIR_RGBA_PM = 11, // alpha formats, where alpha is premultiplied into color channels + STBIR_BGRA_PM = 12, + STBIR_ARGB_PM = 13, + STBIR_ABGR_PM = 14, + STBIR_RA_PM = 15, + STBIR_AR_PM = 16, + + STBIR_RGBA_NO_AW = 11, // alpha formats, where NO alpha weighting is applied at all! + STBIR_BGRA_NO_AW = 12, // these are just synonyms for the _PM flags (which also do + STBIR_ARGB_NO_AW = 13, // no alpha weighting). These names just make it more clear + STBIR_ABGR_NO_AW = 14, // for some folks). + STBIR_RA_NO_AW = 15, + STBIR_AR_NO_AW = 16, + +} stbir_pixel_layout; + +//=============================================================== +// Simple-complexity API +// +// If output_pixels is NULL (0), then we will allocate the buffer and return it to you. +//-------------------------------- + +STBIRDEF unsigned char * stbir_resize_uint8_srgb( const unsigned char *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_type ); + +STBIRDEF unsigned char * stbir_resize_uint8_linear( const unsigned char *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_type ); + +STBIRDEF float * stbir_resize_float_linear( const float *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + float *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_type ); +//=============================================================== + +//=============================================================== +// Medium-complexity API +// +// This extends the easy-to-use API as follows: +// +// * Can specify the datatype - U8, U8_SRGB, U16, FLOAT, HALF_FLOAT +// * Edge wrap can selected explicitly +// * Filter can be selected explicitly +//-------------------------------- + +typedef enum +{ + STBIR_EDGE_CLAMP = 0, + STBIR_EDGE_REFLECT = 1, + STBIR_EDGE_WRAP = 2, // this edge mode is slower and uses more memory + STBIR_EDGE_ZERO = 3, +} stbir_edge; + +typedef enum +{ + STBIR_FILTER_DEFAULT = 0, // use same filter type that easy-to-use API chooses + STBIR_FILTER_BOX = 1, // A trapezoid w/1-pixel wide ramps, same result as box for integer scale ratios + STBIR_FILTER_TRIANGLE = 2, // On upsampling, produces same results as bilinear texture filtering + STBIR_FILTER_CUBICBSPLINE = 3, // The cubic b-spline (aka Mitchell-Netrevalli with B=1,C=0), gaussian-esque + STBIR_FILTER_CATMULLROM = 4, // An interpolating cubic spline + STBIR_FILTER_MITCHELL = 5, // Mitchell-Netrevalli filter with B=1/3, C=1/3 + STBIR_FILTER_POINT_SAMPLE = 6, // Simple point sampling + STBIR_FILTER_OTHER = 7, // User callback specified +} stbir_filter; + +typedef enum +{ + STBIR_TYPE_UINT8 = 0, + STBIR_TYPE_UINT8_SRGB = 1, + STBIR_TYPE_UINT8_SRGB_ALPHA = 2, // alpha channel, when present, should also be SRGB (this is very unusual) + STBIR_TYPE_UINT16 = 3, + STBIR_TYPE_FLOAT = 4, + STBIR_TYPE_HALF_FLOAT = 5 +} stbir_datatype; + +// medium api +STBIRDEF void * stbir_resize( const void *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_layout, stbir_datatype data_type, + stbir_edge edge, stbir_filter filter ); +//=============================================================== + + + +//=============================================================== +// Extended-complexity API +// +// This API exposes all resize functionality. +// +// * Separate filter types for each axis +// * Separate edge modes for each axis +// * Separate input and output data types +// * Can specify regions with subpixel correctness +// * Can specify alpha flags +// * Can specify a memory callback +// * Can specify a callback data type for pixel input and output +// * Can be threaded for a single resize +// * Can be used to resize many frames without recalculating the sampler info +// +// Use this API as follows: +// 1) Call the stbir_resize_init function on a local STBIR_RESIZE structure +// 2) Call any of the stbir_set functions +// 3) Optionally call stbir_build_samplers() if you are going to resample multiple times +// with the same input and output dimensions (like resizing video frames) +// 4) Resample by calling stbir_resize_extended(). +// 5) Call stbir_free_samplers() if you called stbir_build_samplers() +//-------------------------------- + + +// Types: + +// INPUT CALLBACK: this callback is used for input scanlines +typedef void const * stbir_input_callback( void * optional_output, void const * input_ptr, int num_pixels, int x, int y, void * context ); + +// OUTPUT CALLBACK: this callback is used for output scanlines +typedef void stbir_output_callback( void const * output_ptr, int num_pixels, int y, void * context ); + +// callbacks for user installed filters +typedef float stbir__kernel_callback( float x, float scale, void * user_data ); // centered at zero +typedef float stbir__support_callback( float scale, void * user_data ); + +// internal structure with precomputed scaling +typedef struct stbir__info stbir__info; + +typedef struct STBIR_RESIZE // use the stbir_resize_init and stbir_override functions to set these values for future compatibility +{ + void * user_data; + void const * input_pixels; + int input_w, input_h; + double input_s0, input_t0, input_s1, input_t1; + stbir_input_callback * input_cb; + void * output_pixels; + int output_w, output_h; + int output_subx, output_suby, output_subw, output_subh; + stbir_output_callback * output_cb; + int input_stride_in_bytes; + int output_stride_in_bytes; + int splits; + int fast_alpha; + int needs_rebuild; + int called_alloc; + stbir_pixel_layout input_pixel_layout_public; + stbir_pixel_layout output_pixel_layout_public; + stbir_datatype input_data_type; + stbir_datatype output_data_type; + stbir_filter horizontal_filter, vertical_filter; + stbir_edge horizontal_edge, vertical_edge; + stbir__kernel_callback * horizontal_filter_kernel; stbir__support_callback * horizontal_filter_support; + stbir__kernel_callback * vertical_filter_kernel; stbir__support_callback * vertical_filter_support; + stbir__info * samplers; +} STBIR_RESIZE; + +// extended complexity api + + +// First off, you must ALWAYS call stbir_resize_init on your resize structure before any of the other calls! +STBIRDEF void stbir_resize_init( STBIR_RESIZE * resize, + const void *input_pixels, int input_w, int input_h, int input_stride_in_bytes, // stride can be zero + void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, // stride can be zero + stbir_pixel_layout pixel_layout, stbir_datatype data_type ); + +//=============================================================== +// You can update these parameters any time after resize_init and there is no cost +//-------------------------------- + +STBIRDEF void stbir_set_datatypes( STBIR_RESIZE * resize, stbir_datatype input_type, stbir_datatype output_type ); +STBIRDEF void stbir_set_pixel_callbacks( STBIR_RESIZE * resize, stbir_input_callback * input_cb, stbir_output_callback * output_cb ); // no callbacks by default +STBIRDEF void stbir_set_user_data( STBIR_RESIZE * resize, void * user_data ); // pass back STBIR_RESIZE* by default +STBIRDEF void stbir_set_buffer_ptrs( STBIR_RESIZE * resize, const void * input_pixels, int input_stride_in_bytes, void * output_pixels, int output_stride_in_bytes ); + +//=============================================================== + + +//=============================================================== +// If you call any of these functions, you will trigger a sampler rebuild! +//-------------------------------- + +STBIRDEF int stbir_set_pixel_layouts( STBIR_RESIZE * resize, stbir_pixel_layout input_pixel_layout, stbir_pixel_layout output_pixel_layout ); // sets new buffer layouts +STBIRDEF int stbir_set_edgemodes( STBIR_RESIZE * resize, stbir_edge horizontal_edge, stbir_edge vertical_edge ); // CLAMP by default + +STBIRDEF int stbir_set_filters( STBIR_RESIZE * resize, stbir_filter horizontal_filter, stbir_filter vertical_filter ); // STBIR_DEFAULT_FILTER_UPSAMPLE/DOWNSAMPLE by default +STBIRDEF int stbir_set_filter_callbacks( STBIR_RESIZE * resize, stbir__kernel_callback * horizontal_filter, stbir__support_callback * horizontal_support, stbir__kernel_callback * vertical_filter, stbir__support_callback * vertical_support ); + +STBIRDEF int stbir_set_pixel_subrect( STBIR_RESIZE * resize, int subx, int suby, int subw, int subh ); // sets both sub-regions (full regions by default) +STBIRDEF int stbir_set_input_subrect( STBIR_RESIZE * resize, double s0, double t0, double s1, double t1 ); // sets input sub-region (full region by default) +STBIRDEF int stbir_set_output_pixel_subrect( STBIR_RESIZE * resize, int subx, int suby, int subw, int subh ); // sets output sub-region (full region by default) + +// when inputting AND outputting non-premultiplied alpha pixels, we use a slower but higher quality technique +// that fills the zero alpha pixel's RGB values with something plausible. If you don't care about areas of +// zero alpha, you can call this function to get about a 25% speed improvement for STBIR_RGBA to STBIR_RGBA +// types of resizes. +STBIRDEF int stbir_set_non_pm_alpha_speed_over_quality( STBIR_RESIZE * resize, int non_pma_alpha_speed_over_quality ); +//=============================================================== + + +//=============================================================== +// You can call build_samplers to prebuild all the internal data we need to resample. +// Then, if you call resize_extended many times with the same resize, you only pay the +// cost once. +// If you do call build_samplers, you MUST call free_samplers eventually. +//-------------------------------- + +// This builds the samplers and does one allocation +STBIRDEF int stbir_build_samplers( STBIR_RESIZE * resize ); + +// You MUST call this, if you call stbir_build_samplers or stbir_build_samplers_with_splits +STBIRDEF void stbir_free_samplers( STBIR_RESIZE * resize ); +//=============================================================== + + +// And this is the main function to perform the resize synchronously on one thread. +STBIRDEF int stbir_resize_extended( STBIR_RESIZE * resize ); + + +//=============================================================== +// Use these functions for multithreading. +// 1) You call stbir_build_samplers_with_splits first on the main thread +// 2) Then stbir_resize_with_split on each thread +// 3) stbir_free_samplers when done on the main thread +//-------------------------------- + +// This will build samplers for threading. +// You can pass in the number of threads you'd like to use (try_splits). +// It returns the number of splits (threads) that you can call it with. +/// It might be less if the image resize can't be split up that many ways. + +STBIRDEF int stbir_build_samplers_with_splits( STBIR_RESIZE * resize, int try_splits ); + +// This function does a split of the resizing (you call this fuction for each +// split, on multiple threads). A split is a piece of the output resize pixel space. + +// Note that you MUST call stbir_build_samplers_with_splits before stbir_resize_extended_split! + +// Usually, you will always call stbir_resize_split with split_start as the thread_index +// and "1" for the split_count. +// But, if you have a weird situation where you MIGHT want 8 threads, but sometimes +// only 4 threads, you can use 0,2,4,6 for the split_start's and use "2" for the +// split_count each time to turn in into a 4 thread resize. (This is unusual). + +STBIRDEF int stbir_resize_extended_split( STBIR_RESIZE * resize, int split_start, int split_count ); +//=============================================================== + + +//=============================================================== +// Pixel Callbacks info: +//-------------------------------- + +// The input callback is super flexible - it calls you with the input address +// (based on the stride and base pointer), it gives you an optional_output +// pointer that you can fill, or you can just return your own pointer into +// your own data. +// +// You can also do conversion from non-supported data types if necessary - in +// this case, you ignore the input_ptr and just use the x and y parameters to +// calculate your own input_ptr based on the size of each non-supported pixel. +// (Something like the third example below.) +// +// You can also install just an input or just an output callback by setting the +// callback that you don't want to zero. +// +// First example, progress: (getting a callback that you can monitor the progress): +// void const * my_callback( void * optional_output, void const * input_ptr, int num_pixels, int x, int y, void * context ) +// { +// percentage_done = y / input_height; +// return input_ptr; // use buffer from call +// } +// +// Next example, copying: (copy from some other buffer or stream): +// void const * my_callback( void * optional_output, void const * input_ptr, int num_pixels, int x, int y, void * context ) +// { +// CopyOrStreamData( optional_output, other_data_src, num_pixels * pixel_width_in_bytes ); +// return optional_output; // return the optional buffer that we filled +// } +// +// Third example, input another buffer without copying: (zero-copy from other buffer): +// void const * my_callback( void * optional_output, void const * input_ptr, int num_pixels, int x, int y, void * context ) +// { +// void * pixels = ( (char*) other_image_base ) + ( y * other_image_stride ) + ( x * other_pixel_width_in_bytes ); +// return pixels; // return pointer to your data without copying +// } +// +// +// The output callback is considerably simpler - it just calls you so that you can dump +// out each scanline. You could even directly copy out to disk if you have a simple format +// like TGA or BMP. You can also convert to other output types here if you want. +// +// Simple example: +// void const * my_output( void * output_ptr, int num_pixels, int y, void * context ) +// { +// percentage_done = y / output_height; +// fwrite( output_ptr, pixel_width_in_bytes, num_pixels, output_file ); +// } +//=============================================================== + + + + +//=============================================================== +// optional built-in profiling API +//-------------------------------- + +#ifdef STBIR_PROFILE + +typedef struct STBIR_PROFILE_INFO +{ + stbir_uint64 total_clocks; + + // how many clocks spent (of total_clocks) in the various resize routines, along with a string description + // there are "resize_count" number of zones + stbir_uint64 clocks[ 8 ]; + char const ** descriptions; + + // count of clocks and descriptions + stbir_uint32 count; +} STBIR_PROFILE_INFO; + +// use after calling stbir_resize_extended (or stbir_build_samplers or stbir_build_samplers_with_splits) +STBIRDEF void stbir_resize_build_profile_info( STBIR_PROFILE_INFO * out_info, STBIR_RESIZE const * resize ); + +// use after calling stbir_resize_extended +STBIRDEF void stbir_resize_extended_profile_info( STBIR_PROFILE_INFO * out_info, STBIR_RESIZE const * resize ); + +// use after calling stbir_resize_extended_split +STBIRDEF void stbir_resize_split_profile_info( STBIR_PROFILE_INFO * out_info, STBIR_RESIZE const * resize, int split_start, int split_num ); + +//=============================================================== + +#endif + + +//// end header file ///////////////////////////////////////////////////// +#endif // STBIR_INCLUDE_STB_IMAGE_RESIZE2_H + +#if defined(STB_IMAGE_RESIZE_IMPLEMENTATION) || defined(STB_IMAGE_RESIZE2_IMPLEMENTATION) + +#ifndef STBIR_ASSERT +#include +#define STBIR_ASSERT(x) assert(x) +#endif + +#ifndef STBIR_MALLOC +#include +#define STBIR_MALLOC(size,user_data) ((void)(user_data), malloc(size)) +#define STBIR_FREE(ptr,user_data) ((void)(user_data), free(ptr)) +// (we used the comma operator to evaluate user_data, to avoid "unused parameter" warnings) +#endif + +#ifdef _MSC_VER + +#define stbir__inline __forceinline + +#else + +#define stbir__inline __inline__ + +// Clang address sanitizer +#if defined(__has_feature) + #if __has_feature(address_sanitizer) || __has_feature(memory_sanitizer) + #ifndef STBIR__SEPARATE_ALLOCATIONS + #define STBIR__SEPARATE_ALLOCATIONS + #endif + #endif +#endif + +#endif + +// GCC and MSVC +#if defined(__SANITIZE_ADDRESS__) + #ifndef STBIR__SEPARATE_ALLOCATIONS + #define STBIR__SEPARATE_ALLOCATIONS + #endif +#endif + +// Always turn off automatic FMA use - use STBIR_USE_FMA if you want. +// Otherwise, this is a determinism disaster. +#ifndef STBIR_DONT_CHANGE_FP_CONTRACT // override in case you don't want this behavior +#if defined(_MSC_VER) && !defined(__clang__) +#if _MSC_VER > 1200 +#pragma fp_contract(off) +#endif +#elif defined(__GNUC__) && !defined(__clang__) +#pragma GCC optimize("fp-contract=off") +#else +#pragma STDC FP_CONTRACT OFF +#endif +#endif + +#ifdef _MSC_VER +#define STBIR__UNUSED(v) (void)(v) +#else +#define STBIR__UNUSED(v) (void)sizeof(v) +#endif + +#define STBIR__ARRAY_SIZE(a) (sizeof((a))/sizeof((a)[0])) + + +#ifndef STBIR_DEFAULT_FILTER_UPSAMPLE +#define STBIR_DEFAULT_FILTER_UPSAMPLE STBIR_FILTER_CATMULLROM +#endif + +#ifndef STBIR_DEFAULT_FILTER_DOWNSAMPLE +#define STBIR_DEFAULT_FILTER_DOWNSAMPLE STBIR_FILTER_MITCHELL +#endif + + +#ifndef STBIR__HEADER_FILENAME +#define STBIR__HEADER_FILENAME "stb_image_resize2.h" +#endif + +// the internal pixel layout enums are in a different order, so we can easily do range comparisons of types +// the public pixel layout is ordered in a way that if you cast num_channels (1-4) to the enum, you get something sensible +typedef enum +{ + STBIRI_1CHANNEL = 0, + STBIRI_2CHANNEL = 1, + STBIRI_RGB = 2, + STBIRI_BGR = 3, + STBIRI_4CHANNEL = 4, + + STBIRI_RGBA = 5, + STBIRI_BGRA = 6, + STBIRI_ARGB = 7, + STBIRI_ABGR = 8, + STBIRI_RA = 9, + STBIRI_AR = 10, + + STBIRI_RGBA_PM = 11, + STBIRI_BGRA_PM = 12, + STBIRI_ARGB_PM = 13, + STBIRI_ABGR_PM = 14, + STBIRI_RA_PM = 15, + STBIRI_AR_PM = 16, +} stbir_internal_pixel_layout; + +// define the public pixel layouts to not compile inside the implementation (to avoid accidental use) +#define STBIR_BGR bad_dont_use_in_implementation +#define STBIR_1CHANNEL STBIR_BGR +#define STBIR_2CHANNEL STBIR_BGR +#define STBIR_RGB STBIR_BGR +#define STBIR_RGBA STBIR_BGR +#define STBIR_4CHANNEL STBIR_BGR +#define STBIR_BGRA STBIR_BGR +#define STBIR_ARGB STBIR_BGR +#define STBIR_ABGR STBIR_BGR +#define STBIR_RA STBIR_BGR +#define STBIR_AR STBIR_BGR +#define STBIR_RGBA_PM STBIR_BGR +#define STBIR_BGRA_PM STBIR_BGR +#define STBIR_ARGB_PM STBIR_BGR +#define STBIR_ABGR_PM STBIR_BGR +#define STBIR_RA_PM STBIR_BGR +#define STBIR_AR_PM STBIR_BGR + +// must match stbir_datatype +static unsigned char stbir__type_size[] = { + 1,1,1,2,4,2 // STBIR_TYPE_UINT8,STBIR_TYPE_UINT8_SRGB,STBIR_TYPE_UINT8_SRGB_ALPHA,STBIR_TYPE_UINT16,STBIR_TYPE_FLOAT,STBIR_TYPE_HALF_FLOAT +}; + +// When gathering, the contributors are which source pixels contribute. +// When scattering, the contributors are which destination pixels are contributed to. +typedef struct +{ + int n0; // First contributing pixel + int n1; // Last contributing pixel +} stbir__contributors; + +typedef struct +{ + int lowest; // First sample index for whole filter + int highest; // Last sample index for whole filter + int widest; // widest single set of samples for an output +} stbir__filter_extent_info; + +typedef struct +{ + int n0; // First pixel of decode buffer to write to + int n1; // Last pixel of decode that will be written to + int pixel_offset_for_input; // Pixel offset into input_scanline +} stbir__span; + +typedef struct stbir__scale_info +{ + int input_full_size; + int output_sub_size; + float scale; + float inv_scale; + float pixel_shift; // starting shift in output pixel space (in pixels) + int scale_is_rational; + stbir_uint32 scale_numerator, scale_denominator; +} stbir__scale_info; + +typedef struct +{ + stbir__contributors * contributors; + float* coefficients; + stbir__contributors * gather_prescatter_contributors; + float * gather_prescatter_coefficients; + stbir__scale_info scale_info; + float support; + stbir_filter filter_enum; + stbir__kernel_callback * filter_kernel; + stbir__support_callback * filter_support; + stbir_edge edge; + int coefficient_width; + int filter_pixel_width; + int filter_pixel_margin; + int num_contributors; + int contributors_size; + int coefficients_size; + stbir__filter_extent_info extent_info; + int is_gather; // 0 = scatter, 1 = gather with scale >= 1, 2 = gather with scale < 1 + int gather_prescatter_num_contributors; + int gather_prescatter_coefficient_width; + int gather_prescatter_contributors_size; + int gather_prescatter_coefficients_size; +} stbir__sampler; + +typedef struct +{ + stbir__contributors conservative; + int edge_sizes[2]; // this can be less than filter_pixel_margin, if the filter and scaling falls off + stbir__span spans[2]; // can be two spans, if doing input subrect with clamp mode WRAP +} stbir__extents; + +typedef struct +{ +#ifdef STBIR_PROFILE + union + { + struct { stbir_uint64 total, looping, vertical, horizontal, decode, encode, alpha, unalpha; } named; + stbir_uint64 array[8]; + } profile; + stbir_uint64 * current_zone_excluded_ptr; +#endif + float* decode_buffer; + + int ring_buffer_first_scanline; + int ring_buffer_last_scanline; + int ring_buffer_begin_index; // first_scanline is at this index in the ring buffer + int start_output_y, end_output_y; + int start_input_y, end_input_y; // used in scatter only + + #ifdef STBIR__SEPARATE_ALLOCATIONS + float** ring_buffers; // one pointer for each ring buffer + #else + float* ring_buffer; // one big buffer that we index into + #endif + + float* vertical_buffer; + + char no_cache_straddle[64]; +} stbir__per_split_info; + +typedef float * stbir__decode_pixels_func( float * decode, int width_times_channels, void const * input ); +typedef void stbir__alpha_weight_func( float * decode_buffer, int width_times_channels ); +typedef void stbir__horizontal_gather_channels_func( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, + stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ); +typedef void stbir__alpha_unweight_func(float * encode_buffer, int width_times_channels ); +typedef void stbir__encode_pixels_func( void * output, int width_times_channels, float const * encode ); + +struct stbir__info +{ +#ifdef STBIR_PROFILE + union + { + struct { stbir_uint64 total, build, alloc, horizontal, vertical, cleanup, pivot; } named; + stbir_uint64 array[7]; + } profile; + stbir_uint64 * current_zone_excluded_ptr; +#endif + stbir__sampler horizontal; + stbir__sampler vertical; + + void const * input_data; + void * output_data; + + int input_stride_bytes; + int output_stride_bytes; + int ring_buffer_length_bytes; // The length of an individual entry in the ring buffer. The total number of ring buffers is stbir__get_filter_pixel_width(filter) + int ring_buffer_num_entries; // Total number of entries in the ring buffer. + + stbir_datatype input_type; + stbir_datatype output_type; + + stbir_input_callback * in_pixels_cb; + void * user_data; + stbir_output_callback * out_pixels_cb; + + stbir__extents scanline_extents; + + void * alloced_mem; + stbir__per_split_info * split_info; // by default 1, but there will be N of these allocated based on the thread init you did + + stbir__decode_pixels_func * decode_pixels; + stbir__alpha_weight_func * alpha_weight; + stbir__horizontal_gather_channels_func * horizontal_gather_channels; + stbir__alpha_unweight_func * alpha_unweight; + stbir__encode_pixels_func * encode_pixels; + + int alloc_ring_buffer_num_entries; // Number of entries in the ring buffer that will be allocated + int splits; // count of splits + + stbir_internal_pixel_layout input_pixel_layout_internal; + stbir_internal_pixel_layout output_pixel_layout_internal; + + int input_color_and_type; + int offset_x, offset_y; // offset within output_data + int vertical_first; + int channels; + int effective_channels; // same as channels, except on RGBA/ARGB (7), or XA/AX (3) + size_t alloced_total; +}; + + +#define stbir__max_uint8_as_float 255.0f +#define stbir__max_uint16_as_float 65535.0f +#define stbir__max_uint8_as_float_inverted 3.9215689e-03f // (1.0f/255.0f) +#define stbir__max_uint16_as_float_inverted 1.5259022e-05f // (1.0f/65535.0f) +#define stbir__small_float ((float)1 / (1 << 20) / (1 << 20) / (1 << 20) / (1 << 20) / (1 << 20) / (1 << 20)) + +// min/max friendly +#define STBIR_CLAMP(x, xmin, xmax) for(;;) { \ + if ( (x) < (xmin) ) (x) = (xmin); \ + if ( (x) > (xmax) ) (x) = (xmax); \ + break; \ +} + +static stbir__inline int stbir__min(int a, int b) +{ + return a < b ? a : b; +} + +static stbir__inline int stbir__max(int a, int b) +{ + return a > b ? a : b; +} + +static float stbir__srgb_uchar_to_linear_float[256] = { + 0.000000f, 0.000304f, 0.000607f, 0.000911f, 0.001214f, 0.001518f, 0.001821f, 0.002125f, 0.002428f, 0.002732f, 0.003035f, + 0.003347f, 0.003677f, 0.004025f, 0.004391f, 0.004777f, 0.005182f, 0.005605f, 0.006049f, 0.006512f, 0.006995f, 0.007499f, + 0.008023f, 0.008568f, 0.009134f, 0.009721f, 0.010330f, 0.010960f, 0.011612f, 0.012286f, 0.012983f, 0.013702f, 0.014444f, + 0.015209f, 0.015996f, 0.016807f, 0.017642f, 0.018500f, 0.019382f, 0.020289f, 0.021219f, 0.022174f, 0.023153f, 0.024158f, + 0.025187f, 0.026241f, 0.027321f, 0.028426f, 0.029557f, 0.030713f, 0.031896f, 0.033105f, 0.034340f, 0.035601f, 0.036889f, + 0.038204f, 0.039546f, 0.040915f, 0.042311f, 0.043735f, 0.045186f, 0.046665f, 0.048172f, 0.049707f, 0.051269f, 0.052861f, + 0.054480f, 0.056128f, 0.057805f, 0.059511f, 0.061246f, 0.063010f, 0.064803f, 0.066626f, 0.068478f, 0.070360f, 0.072272f, + 0.074214f, 0.076185f, 0.078187f, 0.080220f, 0.082283f, 0.084376f, 0.086500f, 0.088656f, 0.090842f, 0.093059f, 0.095307f, + 0.097587f, 0.099899f, 0.102242f, 0.104616f, 0.107023f, 0.109462f, 0.111932f, 0.114435f, 0.116971f, 0.119538f, 0.122139f, + 0.124772f, 0.127438f, 0.130136f, 0.132868f, 0.135633f, 0.138432f, 0.141263f, 0.144128f, 0.147027f, 0.149960f, 0.152926f, + 0.155926f, 0.158961f, 0.162029f, 0.165132f, 0.168269f, 0.171441f, 0.174647f, 0.177888f, 0.181164f, 0.184475f, 0.187821f, + 0.191202f, 0.194618f, 0.198069f, 0.201556f, 0.205079f, 0.208637f, 0.212231f, 0.215861f, 0.219526f, 0.223228f, 0.226966f, + 0.230740f, 0.234551f, 0.238398f, 0.242281f, 0.246201f, 0.250158f, 0.254152f, 0.258183f, 0.262251f, 0.266356f, 0.270498f, + 0.274677f, 0.278894f, 0.283149f, 0.287441f, 0.291771f, 0.296138f, 0.300544f, 0.304987f, 0.309469f, 0.313989f, 0.318547f, + 0.323143f, 0.327778f, 0.332452f, 0.337164f, 0.341914f, 0.346704f, 0.351533f, 0.356400f, 0.361307f, 0.366253f, 0.371238f, + 0.376262f, 0.381326f, 0.386430f, 0.391573f, 0.396755f, 0.401978f, 0.407240f, 0.412543f, 0.417885f, 0.423268f, 0.428691f, + 0.434154f, 0.439657f, 0.445201f, 0.450786f, 0.456411f, 0.462077f, 0.467784f, 0.473532f, 0.479320f, 0.485150f, 0.491021f, + 0.496933f, 0.502887f, 0.508881f, 0.514918f, 0.520996f, 0.527115f, 0.533276f, 0.539480f, 0.545725f, 0.552011f, 0.558340f, + 0.564712f, 0.571125f, 0.577581f, 0.584078f, 0.590619f, 0.597202f, 0.603827f, 0.610496f, 0.617207f, 0.623960f, 0.630757f, + 0.637597f, 0.644480f, 0.651406f, 0.658375f, 0.665387f, 0.672443f, 0.679543f, 0.686685f, 0.693872f, 0.701102f, 0.708376f, + 0.715694f, 0.723055f, 0.730461f, 0.737911f, 0.745404f, 0.752942f, 0.760525f, 0.768151f, 0.775822f, 0.783538f, 0.791298f, + 0.799103f, 0.806952f, 0.814847f, 0.822786f, 0.830770f, 0.838799f, 0.846873f, 0.854993f, 0.863157f, 0.871367f, 0.879622f, + 0.887923f, 0.896269f, 0.904661f, 0.913099f, 0.921582f, 0.930111f, 0.938686f, 0.947307f, 0.955974f, 0.964686f, 0.973445f, + 0.982251f, 0.991102f, 1.0f +}; + +typedef union +{ + unsigned int u; + float f; +} stbir__FP32; + +// From https://gist.github.com/rygorous/2203834 + +static const stbir_uint32 fp32_to_srgb8_tab4[104] = { + 0x0073000d, 0x007a000d, 0x0080000d, 0x0087000d, 0x008d000d, 0x0094000d, 0x009a000d, 0x00a1000d, + 0x00a7001a, 0x00b4001a, 0x00c1001a, 0x00ce001a, 0x00da001a, 0x00e7001a, 0x00f4001a, 0x0101001a, + 0x010e0033, 0x01280033, 0x01410033, 0x015b0033, 0x01750033, 0x018f0033, 0x01a80033, 0x01c20033, + 0x01dc0067, 0x020f0067, 0x02430067, 0x02760067, 0x02aa0067, 0x02dd0067, 0x03110067, 0x03440067, + 0x037800ce, 0x03df00ce, 0x044600ce, 0x04ad00ce, 0x051400ce, 0x057b00c5, 0x05dd00bc, 0x063b00b5, + 0x06970158, 0x07420142, 0x07e30130, 0x087b0120, 0x090b0112, 0x09940106, 0x0a1700fc, 0x0a9500f2, + 0x0b0f01cb, 0x0bf401ae, 0x0ccb0195, 0x0d950180, 0x0e56016e, 0x0f0d015e, 0x0fbc0150, 0x10630143, + 0x11070264, 0x1238023e, 0x1357021d, 0x14660201, 0x156601e9, 0x165a01d3, 0x174401c0, 0x182401af, + 0x18fe0331, 0x1a9602fe, 0x1c1502d2, 0x1d7e02ad, 0x1ed4028d, 0x201a0270, 0x21520256, 0x227d0240, + 0x239f0443, 0x25c003fe, 0x27bf03c4, 0x29a10392, 0x2b6a0367, 0x2d1d0341, 0x2ebe031f, 0x304d0300, + 0x31d105b0, 0x34a80555, 0x37520507, 0x39d504c5, 0x3c37048b, 0x3e7c0458, 0x40a8042a, 0x42bd0401, + 0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559, + 0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723, +}; + +static stbir__inline stbir_uint8 stbir__linear_to_srgb_uchar(float in) +{ + static const stbir__FP32 almostone = { 0x3f7fffff }; // 1-eps + static const stbir__FP32 minval = { (127-13) << 23 }; + stbir_uint32 tab,bias,scale,t; + stbir__FP32 f; + + // Clamp to [2^(-13), 1-eps]; these two values map to 0 and 1, respectively. + // The tests are carefully written so that NaNs map to 0, same as in the reference + // implementation. + if (!(in > minval.f)) // written this way to catch NaNs + return 0; + if (in > almostone.f) + return 255; + + // Do the table lookup and unpack bias, scale + f.f = in; + tab = fp32_to_srgb8_tab4[(f.u - minval.u) >> 20]; + bias = (tab >> 16) << 9; + scale = tab & 0xffff; + + // Grab next-highest mantissa bits and perform linear interpolation + t = (f.u >> 12) & 0xff; + return (unsigned char) ((bias + scale*t) >> 16); +} + +#ifndef STBIR_FORCE_GATHER_FILTER_SCANLINES_AMOUNT +#define STBIR_FORCE_GATHER_FILTER_SCANLINES_AMOUNT 32 // when downsampling and <= 32 scanlines of buffering, use gather. gather used down to 1/8th scaling for 25% win. +#endif + +#ifndef STBIR_FORCE_MINIMUM_SCANLINES_FOR_SPLITS +#define STBIR_FORCE_MINIMUM_SCANLINES_FOR_SPLITS 4 // when threading, what is the minimum number of scanlines for a split? +#endif + +#define STBIR_INPUT_CALLBACK_PADDING 3 + +#ifdef _M_IX86_FP +#if ( _M_IX86_FP >= 1 ) +#ifndef STBIR_SSE +#define STBIR_SSE +#endif +#endif +#endif + +#ifdef __TINYC__ + // tiny c has no intrinsics yet - this can become a version check if they add them + #define STBIR_NO_SIMD +#endif + +#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined(__x86_64) || defined(_M_AMD64) || defined(__SSE2__) || defined(STBIR_SSE) || defined(STBIR_SSE2) + #ifndef STBIR_SSE2 + #define STBIR_SSE2 + #endif + #if defined(__AVX__) || defined(STBIR_AVX2) + #ifndef STBIR_AVX + #ifndef STBIR_NO_AVX + #define STBIR_AVX + #endif + #endif + #endif + #if defined(__AVX2__) || defined(STBIR_AVX2) + #ifndef STBIR_NO_AVX2 + #ifndef STBIR_AVX2 + #define STBIR_AVX2 + #endif + #if defined( _MSC_VER ) && !defined(__clang__) + #ifndef STBIR_FP16C // FP16C instructions are on all AVX2 cpus, so we can autoselect it here on microsoft - clang needs -mf16c + #define STBIR_FP16C + #endif + #endif + #endif + #endif + #ifdef __F16C__ + #ifndef STBIR_FP16C // turn on FP16C instructions if the define is set (for clang and gcc) + #define STBIR_FP16C + #endif + #endif +#endif + +#if defined( _M_ARM64 ) || defined( __aarch64__ ) || defined( __arm64__ ) || ((__ARM_NEON_FP & 4) != 0) || defined(__ARM_NEON__) +#ifndef STBIR_NEON +#define STBIR_NEON +#endif +#endif + +#if defined(_M_ARM) || defined(__arm__) +#ifdef STBIR_USE_FMA +#undef STBIR_USE_FMA // no FMA for 32-bit arm on MSVC +#endif +#endif + +#if defined(__wasm__) && defined(__wasm_simd128__) +#ifndef STBIR_WASM +#define STBIR_WASM +#endif +#endif + +// restrict pointers for the output pointers, other loop and unroll control +#if defined( _MSC_VER ) && !defined(__clang__) + #define STBIR_STREAMOUT_PTR( star ) star __restrict + #define STBIR_NO_UNROLL( ptr ) __assume(ptr) // this oddly keeps msvc from unrolling a loop + #if _MSC_VER >= 1900 + #define STBIR_NO_UNROLL_LOOP_START __pragma(loop( no_vector )) + #else + #define STBIR_NO_UNROLL_LOOP_START + #endif +#elif defined( __clang__ ) + #define STBIR_STREAMOUT_PTR( star ) star __restrict__ + #define STBIR_NO_UNROLL( ptr ) __asm__ (""::"r"(ptr)) + #if ( __clang_major__ >= 4 ) || ( ( __clang_major__ >= 3 ) && ( __clang_minor__ >= 5 ) ) + #define STBIR_NO_UNROLL_LOOP_START _Pragma("clang loop unroll(disable)") _Pragma("clang loop vectorize(disable)") + #else + #define STBIR_NO_UNROLL_LOOP_START + #endif +#elif defined( __GNUC__ ) + #define STBIR_STREAMOUT_PTR( star ) star __restrict__ + #define STBIR_NO_UNROLL( ptr ) __asm__ (""::"r"(ptr)) + #if __GNUC__ >= 14 + #define STBIR_NO_UNROLL_LOOP_START _Pragma("GCC unroll 0") _Pragma("GCC novector") + #else + #define STBIR_NO_UNROLL_LOOP_START + #endif + #define STBIR_NO_UNROLL_LOOP_START_INF_FOR +#else + #define STBIR_STREAMOUT_PTR( star ) star + #define STBIR_NO_UNROLL( ptr ) + #define STBIR_NO_UNROLL_LOOP_START +#endif + +#ifndef STBIR_NO_UNROLL_LOOP_START_INF_FOR +#define STBIR_NO_UNROLL_LOOP_START_INF_FOR STBIR_NO_UNROLL_LOOP_START +#endif + +#ifdef STBIR_NO_SIMD // force simd off for whatever reason + +// force simd off overrides everything else, so clear it all + +#ifdef STBIR_SSE2 +#undef STBIR_SSE2 +#endif + +#ifdef STBIR_AVX +#undef STBIR_AVX +#endif + +#ifdef STBIR_NEON +#undef STBIR_NEON +#endif + +#ifdef STBIR_AVX2 +#undef STBIR_AVX2 +#endif + +#ifdef STBIR_FP16C +#undef STBIR_FP16C +#endif + +#ifdef STBIR_WASM +#undef STBIR_WASM +#endif + +#ifdef STBIR_SIMD +#undef STBIR_SIMD +#endif + +#else // STBIR_SIMD + +#ifdef STBIR_SSE2 + #include + + #define stbir__simdf __m128 + #define stbir__simdi __m128i + + #define stbir_simdi_castf( reg ) _mm_castps_si128(reg) + #define stbir_simdf_casti( reg ) _mm_castsi128_ps(reg) + + #define stbir__simdf_load( reg, ptr ) (reg) = _mm_loadu_ps( (float const*)(ptr) ) + #define stbir__simdi_load( reg, ptr ) (reg) = _mm_loadu_si128 ( (stbir__simdi const*)(ptr) ) + #define stbir__simdf_load1( out, ptr ) (out) = _mm_load_ss( (float const*)(ptr) ) // top values can be random (not denormal or nan for perf) + #define stbir__simdi_load1( out, ptr ) (out) = _mm_castps_si128( _mm_load_ss( (float const*)(ptr) )) + #define stbir__simdf_load1z( out, ptr ) (out) = _mm_load_ss( (float const*)(ptr) ) // top values must be zero + #define stbir__simdf_frep4( fvar ) _mm_set_ps1( fvar ) + #define stbir__simdf_load1frep4( out, fvar ) (out) = _mm_set_ps1( fvar ) + #define stbir__simdf_load2( out, ptr ) (out) = _mm_castsi128_ps( _mm_loadl_epi64( (__m128i*)(ptr)) ) // top values can be random (not denormal or nan for perf) + #define stbir__simdf_load2z( out, ptr ) (out) = _mm_castsi128_ps( _mm_loadl_epi64( (__m128i*)(ptr)) ) // top values must be zero + #define stbir__simdf_load2hmerge( out, reg, ptr ) (out) = _mm_castpd_ps(_mm_loadh_pd( _mm_castps_pd(reg), (double*)(ptr) )) + + #define stbir__simdf_zeroP() _mm_setzero_ps() + #define stbir__simdf_zero( reg ) (reg) = _mm_setzero_ps() + + #define stbir__simdf_store( ptr, reg ) _mm_storeu_ps( (float*)(ptr), reg ) + #define stbir__simdf_store1( ptr, reg ) _mm_store_ss( (float*)(ptr), reg ) + #define stbir__simdf_store2( ptr, reg ) _mm_storel_epi64( (__m128i*)(ptr), _mm_castps_si128(reg) ) + #define stbir__simdf_store2h( ptr, reg ) _mm_storeh_pd( (double*)(ptr), _mm_castps_pd(reg) ) + + #define stbir__simdi_store( ptr, reg ) _mm_storeu_si128( (__m128i*)(ptr), reg ) + #define stbir__simdi_store1( ptr, reg ) _mm_store_ss( (float*)(ptr), _mm_castsi128_ps(reg) ) + #define stbir__simdi_store2( ptr, reg ) _mm_storel_epi64( (__m128i*)(ptr), (reg) ) + + #define stbir__prefetch( ptr ) _mm_prefetch((char*)(ptr), _MM_HINT_T0 ) + + #define stbir__simdi_expand_u8_to_u32(out0,out1,out2,out3,ireg) \ + { \ + stbir__simdi zero = _mm_setzero_si128(); \ + out2 = _mm_unpacklo_epi8( ireg, zero ); \ + out3 = _mm_unpackhi_epi8( ireg, zero ); \ + out0 = _mm_unpacklo_epi16( out2, zero ); \ + out1 = _mm_unpackhi_epi16( out2, zero ); \ + out2 = _mm_unpacklo_epi16( out3, zero ); \ + out3 = _mm_unpackhi_epi16( out3, zero ); \ + } + +#define stbir__simdi_expand_u8_to_1u32(out,ireg) \ + { \ + stbir__simdi zero = _mm_setzero_si128(); \ + out = _mm_unpacklo_epi8( ireg, zero ); \ + out = _mm_unpacklo_epi16( out, zero ); \ + } + + #define stbir__simdi_expand_u16_to_u32(out0,out1,ireg) \ + { \ + stbir__simdi zero = _mm_setzero_si128(); \ + out0 = _mm_unpacklo_epi16( ireg, zero ); \ + out1 = _mm_unpackhi_epi16( ireg, zero ); \ + } + + #define stbir__simdf_convert_float_to_i32( i, f ) (i) = _mm_cvttps_epi32(f) + #define stbir__simdf_convert_float_to_int( f ) _mm_cvtt_ss2si(f) + #define stbir__simdf_convert_float_to_uint8( f ) ((unsigned char)_mm_cvtsi128_si32(_mm_cvttps_epi32(_mm_max_ps(_mm_min_ps(f,STBIR__CONSTF(STBIR_max_uint8_as_float)),_mm_setzero_ps())))) + #define stbir__simdf_convert_float_to_short( f ) ((unsigned short)_mm_cvtsi128_si32(_mm_cvttps_epi32(_mm_max_ps(_mm_min_ps(f,STBIR__CONSTF(STBIR_max_uint16_as_float)),_mm_setzero_ps())))) + + #define stbir__simdi_to_int( i ) _mm_cvtsi128_si32(i) + #define stbir__simdi_convert_i32_to_float(out, ireg) (out) = _mm_cvtepi32_ps( ireg ) + #define stbir__simdf_add( out, reg0, reg1 ) (out) = _mm_add_ps( reg0, reg1 ) + #define stbir__simdf_mult( out, reg0, reg1 ) (out) = _mm_mul_ps( reg0, reg1 ) + #define stbir__simdf_mult_mem( out, reg, ptr ) (out) = _mm_mul_ps( reg, _mm_loadu_ps( (float const*)(ptr) ) ) + #define stbir__simdf_mult1_mem( out, reg, ptr ) (out) = _mm_mul_ss( reg, _mm_load_ss( (float const*)(ptr) ) ) + #define stbir__simdf_add_mem( out, reg, ptr ) (out) = _mm_add_ps( reg, _mm_loadu_ps( (float const*)(ptr) ) ) + #define stbir__simdf_add1_mem( out, reg, ptr ) (out) = _mm_add_ss( reg, _mm_load_ss( (float const*)(ptr) ) ) + + #ifdef STBIR_USE_FMA // not on by default to maintain bit identical simd to non-simd + #include + #define stbir__simdf_madd( out, add, mul1, mul2 ) (out) = _mm_fmadd_ps( mul1, mul2, add ) + #define stbir__simdf_madd1( out, add, mul1, mul2 ) (out) = _mm_fmadd_ss( mul1, mul2, add ) + #define stbir__simdf_madd_mem( out, add, mul, ptr ) (out) = _mm_fmadd_ps( mul, _mm_loadu_ps( (float const*)(ptr) ), add ) + #define stbir__simdf_madd1_mem( out, add, mul, ptr ) (out) = _mm_fmadd_ss( mul, _mm_load_ss( (float const*)(ptr) ), add ) + #else + #define stbir__simdf_madd( out, add, mul1, mul2 ) (out) = _mm_add_ps( add, _mm_mul_ps( mul1, mul2 ) ) + #define stbir__simdf_madd1( out, add, mul1, mul2 ) (out) = _mm_add_ss( add, _mm_mul_ss( mul1, mul2 ) ) + #define stbir__simdf_madd_mem( out, add, mul, ptr ) (out) = _mm_add_ps( add, _mm_mul_ps( mul, _mm_loadu_ps( (float const*)(ptr) ) ) ) + #define stbir__simdf_madd1_mem( out, add, mul, ptr ) (out) = _mm_add_ss( add, _mm_mul_ss( mul, _mm_load_ss( (float const*)(ptr) ) ) ) + #endif + + #define stbir__simdf_add1( out, reg0, reg1 ) (out) = _mm_add_ss( reg0, reg1 ) + #define stbir__simdf_mult1( out, reg0, reg1 ) (out) = _mm_mul_ss( reg0, reg1 ) + + #define stbir__simdf_and( out, reg0, reg1 ) (out) = _mm_and_ps( reg0, reg1 ) + #define stbir__simdf_or( out, reg0, reg1 ) (out) = _mm_or_ps( reg0, reg1 ) + + #define stbir__simdf_min( out, reg0, reg1 ) (out) = _mm_min_ps( reg0, reg1 ) + #define stbir__simdf_max( out, reg0, reg1 ) (out) = _mm_max_ps( reg0, reg1 ) + #define stbir__simdf_min1( out, reg0, reg1 ) (out) = _mm_min_ss( reg0, reg1 ) + #define stbir__simdf_max1( out, reg0, reg1 ) (out) = _mm_max_ss( reg0, reg1 ) + + #define stbir__simdf_0123ABCDto3ABx( out, reg0, reg1 ) (out)=_mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( _mm_shuffle_ps( reg1,reg0, (0<<0) + (1<<2) + (2<<4) + (3<<6) )), (3<<0) + (0<<2) + (1<<4) + (2<<6) ) ) + #define stbir__simdf_0123ABCDto23Ax( out, reg0, reg1 ) (out)=_mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( _mm_shuffle_ps( reg1,reg0, (0<<0) + (1<<2) + (2<<4) + (3<<6) )), (2<<0) + (3<<2) + (0<<4) + (1<<6) ) ) + + static const stbir__simdf STBIR_zeroones = { 0.0f,1.0f,0.0f,1.0f }; + static const stbir__simdf STBIR_onezeros = { 1.0f,0.0f,1.0f,0.0f }; + #define stbir__simdf_aaa1( out, alp, ones ) (out)=_mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( _mm_movehl_ps( ones, alp ) ), (1<<0) + (1<<2) + (1<<4) + (2<<6) ) ) + #define stbir__simdf_1aaa( out, alp, ones ) (out)=_mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( _mm_movelh_ps( ones, alp ) ), (0<<0) + (2<<2) + (2<<4) + (2<<6) ) ) + #define stbir__simdf_a1a1( out, alp, ones) (out) = _mm_or_ps( _mm_castsi128_ps( _mm_srli_epi64( _mm_castps_si128(alp), 32 ) ), STBIR_zeroones ) + #define stbir__simdf_1a1a( out, alp, ones) (out) = _mm_or_ps( _mm_castsi128_ps( _mm_slli_epi64( _mm_castps_si128(alp), 32 ) ), STBIR_onezeros ) + + #define stbir__simdf_swiz( reg, one, two, three, four ) _mm_castsi128_ps( _mm_shuffle_epi32( _mm_castps_si128( reg ), (one<<0) + (two<<2) + (three<<4) + (four<<6) ) ) + + #define stbir__simdi_and( out, reg0, reg1 ) (out) = _mm_and_si128( reg0, reg1 ) + #define stbir__simdi_or( out, reg0, reg1 ) (out) = _mm_or_si128( reg0, reg1 ) + #define stbir__simdi_16madd( out, reg0, reg1 ) (out) = _mm_madd_epi16( reg0, reg1 ) + + #define stbir__simdf_pack_to_8bytes(out,aa,bb) \ + { \ + stbir__simdf af,bf; \ + stbir__simdi a,b; \ + af = _mm_min_ps( aa, STBIR_max_uint8_as_float ); \ + bf = _mm_min_ps( bb, STBIR_max_uint8_as_float ); \ + af = _mm_max_ps( af, _mm_setzero_ps() ); \ + bf = _mm_max_ps( bf, _mm_setzero_ps() ); \ + a = _mm_cvttps_epi32( af ); \ + b = _mm_cvttps_epi32( bf ); \ + a = _mm_packs_epi32( a, b ); \ + out = _mm_packus_epi16( a, a ); \ + } + + #define stbir__simdf_load4_transposed( o0, o1, o2, o3, ptr ) \ + stbir__simdf_load( o0, (ptr) ); \ + stbir__simdf_load( o1, (ptr)+4 ); \ + stbir__simdf_load( o2, (ptr)+8 ); \ + stbir__simdf_load( o3, (ptr)+12 ); \ + { \ + __m128 tmp0, tmp1, tmp2, tmp3; \ + tmp0 = _mm_unpacklo_ps(o0, o1); \ + tmp2 = _mm_unpacklo_ps(o2, o3); \ + tmp1 = _mm_unpackhi_ps(o0, o1); \ + tmp3 = _mm_unpackhi_ps(o2, o3); \ + o0 = _mm_movelh_ps(tmp0, tmp2); \ + o1 = _mm_movehl_ps(tmp2, tmp0); \ + o2 = _mm_movelh_ps(tmp1, tmp3); \ + o3 = _mm_movehl_ps(tmp3, tmp1); \ + } + + #define stbir__interleave_pack_and_store_16_u8( ptr, r0, r1, r2, r3 ) \ + r0 = _mm_packs_epi32( r0, r1 ); \ + r2 = _mm_packs_epi32( r2, r3 ); \ + r1 = _mm_unpacklo_epi16( r0, r2 ); \ + r3 = _mm_unpackhi_epi16( r0, r2 ); \ + r0 = _mm_unpacklo_epi16( r1, r3 ); \ + r2 = _mm_unpackhi_epi16( r1, r3 ); \ + r0 = _mm_packus_epi16( r0, r2 ); \ + stbir__simdi_store( ptr, r0 ); \ + + #define stbir__simdi_32shr( out, reg, imm ) out = _mm_srli_epi32( reg, imm ) + + #if defined(_MSC_VER) && !defined(__clang__) + // msvc inits with 8 bytes + #define STBIR__CONST_32_TO_8( v ) (char)(unsigned char)((v)&255),(char)(unsigned char)(((v)>>8)&255),(char)(unsigned char)(((v)>>16)&255),(char)(unsigned char)(((v)>>24)&255) + #define STBIR__CONST_4_32i( v ) STBIR__CONST_32_TO_8( v ), STBIR__CONST_32_TO_8( v ), STBIR__CONST_32_TO_8( v ), STBIR__CONST_32_TO_8( v ) + #define STBIR__CONST_4d_32i( v0, v1, v2, v3 ) STBIR__CONST_32_TO_8( v0 ), STBIR__CONST_32_TO_8( v1 ), STBIR__CONST_32_TO_8( v2 ), STBIR__CONST_32_TO_8( v3 ) + #else + // everything else inits with long long's + #define STBIR__CONST_4_32i( v ) (long long)((((stbir_uint64)(stbir_uint32)(v))<<32)|((stbir_uint64)(stbir_uint32)(v))),(long long)((((stbir_uint64)(stbir_uint32)(v))<<32)|((stbir_uint64)(stbir_uint32)(v))) + #define STBIR__CONST_4d_32i( v0, v1, v2, v3 ) (long long)((((stbir_uint64)(stbir_uint32)(v1))<<32)|((stbir_uint64)(stbir_uint32)(v0))),(long long)((((stbir_uint64)(stbir_uint32)(v3))<<32)|((stbir_uint64)(stbir_uint32)(v2))) + #endif + + #define STBIR__SIMDF_CONST(var, x) stbir__simdf var = { x, x, x, x } + #define STBIR__SIMDI_CONST(var, x) stbir__simdi var = { STBIR__CONST_4_32i(x) } + #define STBIR__CONSTF(var) (var) + #define STBIR__CONSTI(var) (var) + + #if defined(STBIR_AVX) || defined(__SSE4_1__) + #include + #define stbir__simdf_pack_to_8words(out,reg0,reg1) out = _mm_packus_epi32(_mm_cvttps_epi32(_mm_max_ps(_mm_min_ps(reg0,STBIR__CONSTF(STBIR_max_uint16_as_float)),_mm_setzero_ps())), _mm_cvttps_epi32(_mm_max_ps(_mm_min_ps(reg1,STBIR__CONSTF(STBIR_max_uint16_as_float)),_mm_setzero_ps()))) + #else + static STBIR__SIMDI_CONST(stbir__s32_32768, 32768); + static STBIR__SIMDI_CONST(stbir__s16_32768, ((32768<<16)|32768)); + + #define stbir__simdf_pack_to_8words(out,reg0,reg1) \ + { \ + stbir__simdi tmp0,tmp1; \ + tmp0 = _mm_cvttps_epi32(_mm_max_ps(_mm_min_ps(reg0,STBIR__CONSTF(STBIR_max_uint16_as_float)),_mm_setzero_ps())); \ + tmp1 = _mm_cvttps_epi32(_mm_max_ps(_mm_min_ps(reg1,STBIR__CONSTF(STBIR_max_uint16_as_float)),_mm_setzero_ps())); \ + tmp0 = _mm_sub_epi32( tmp0, stbir__s32_32768 ); \ + tmp1 = _mm_sub_epi32( tmp1, stbir__s32_32768 ); \ + out = _mm_packs_epi32( tmp0, tmp1 ); \ + out = _mm_sub_epi16( out, stbir__s16_32768 ); \ + } + + #endif + + #define STBIR_SIMD + + // if we detect AVX, set the simd8 defines + #ifdef STBIR_AVX + #include + #define STBIR_SIMD8 + #define stbir__simdf8 __m256 + #define stbir__simdi8 __m256i + #define stbir__simdf8_load( out, ptr ) (out) = _mm256_loadu_ps( (float const *)(ptr) ) + #define stbir__simdi8_load( out, ptr ) (out) = _mm256_loadu_si256( (__m256i const *)(ptr) ) + #define stbir__simdf8_mult( out, a, b ) (out) = _mm256_mul_ps( (a), (b) ) + #define stbir__simdf8_store( ptr, out ) _mm256_storeu_ps( (float*)(ptr), out ) + #define stbir__simdi8_store( ptr, reg ) _mm256_storeu_si256( (__m256i*)(ptr), reg ) + #define stbir__simdf8_frep8( fval ) _mm256_set1_ps( fval ) + + #define stbir__simdf8_min( out, reg0, reg1 ) (out) = _mm256_min_ps( reg0, reg1 ) + #define stbir__simdf8_max( out, reg0, reg1 ) (out) = _mm256_max_ps( reg0, reg1 ) + + #define stbir__simdf8_add4halves( out, bot4, top8 ) (out) = _mm_add_ps( bot4, _mm256_extractf128_ps( top8, 1 ) ) + #define stbir__simdf8_mult_mem( out, reg, ptr ) (out) = _mm256_mul_ps( reg, _mm256_loadu_ps( (float const*)(ptr) ) ) + #define stbir__simdf8_add_mem( out, reg, ptr ) (out) = _mm256_add_ps( reg, _mm256_loadu_ps( (float const*)(ptr) ) ) + #define stbir__simdf8_add( out, a, b ) (out) = _mm256_add_ps( a, b ) + #define stbir__simdf8_load1b( out, ptr ) (out) = _mm256_broadcast_ss( ptr ) + #define stbir__simdf_load1rep4( out, ptr ) (out) = _mm_broadcast_ss( ptr ) // avx load instruction + + #define stbir__simdi8_convert_i32_to_float(out, ireg) (out) = _mm256_cvtepi32_ps( ireg ) + #define stbir__simdf8_convert_float_to_i32( i, f ) (i) = _mm256_cvttps_epi32(f) + + #define stbir__simdf8_bot4s( out, a, b ) (out) = _mm256_permute2f128_ps(a,b, (0<<0)+(2<<4) ) + #define stbir__simdf8_top4s( out, a, b ) (out) = _mm256_permute2f128_ps(a,b, (1<<0)+(3<<4) ) + + #define stbir__simdf8_gettop4( reg ) _mm256_extractf128_ps(reg,1) + + #ifdef STBIR_AVX2 + + #define stbir__simdi8_expand_u8_to_u32(out0,out1,ireg) \ + { \ + stbir__simdi8 a, zero =_mm256_setzero_si256();\ + a = _mm256_permute4x64_epi64( _mm256_unpacklo_epi8( _mm256_permute4x64_epi64(_mm256_castsi128_si256(ireg),(0<<0)+(2<<2)+(1<<4)+(3<<6)), zero ),(0<<0)+(2<<2)+(1<<4)+(3<<6)); \ + out0 = _mm256_unpacklo_epi16( a, zero ); \ + out1 = _mm256_unpackhi_epi16( a, zero ); \ + } + + #define stbir__simdf8_pack_to_16bytes(out,aa,bb) \ + { \ + stbir__simdi8 t; \ + stbir__simdf8 af,bf; \ + stbir__simdi8 a,b; \ + af = _mm256_min_ps( aa, STBIR_max_uint8_as_floatX ); \ + bf = _mm256_min_ps( bb, STBIR_max_uint8_as_floatX ); \ + af = _mm256_max_ps( af, _mm256_setzero_ps() ); \ + bf = _mm256_max_ps( bf, _mm256_setzero_ps() ); \ + a = _mm256_cvttps_epi32( af ); \ + b = _mm256_cvttps_epi32( bf ); \ + t = _mm256_permute4x64_epi64( _mm256_packs_epi32( a, b ), (0<<0)+(2<<2)+(1<<4)+(3<<6) ); \ + out = _mm256_castsi256_si128( _mm256_permute4x64_epi64( _mm256_packus_epi16( t, t ), (0<<0)+(2<<2)+(1<<4)+(3<<6) ) ); \ + } + + #define stbir__simdi8_expand_u16_to_u32(out,ireg) out = _mm256_unpacklo_epi16( _mm256_permute4x64_epi64(_mm256_castsi128_si256(ireg),(0<<0)+(2<<2)+(1<<4)+(3<<6)), _mm256_setzero_si256() ); + + #define stbir__simdf8_pack_to_16words(out,aa,bb) \ + { \ + stbir__simdf8 af,bf; \ + stbir__simdi8 a,b; \ + af = _mm256_min_ps( aa, STBIR_max_uint16_as_floatX ); \ + bf = _mm256_min_ps( bb, STBIR_max_uint16_as_floatX ); \ + af = _mm256_max_ps( af, _mm256_setzero_ps() ); \ + bf = _mm256_max_ps( bf, _mm256_setzero_ps() ); \ + a = _mm256_cvttps_epi32( af ); \ + b = _mm256_cvttps_epi32( bf ); \ + (out) = _mm256_permute4x64_epi64( _mm256_packus_epi32(a, b), (0<<0)+(2<<2)+(1<<4)+(3<<6) ); \ + } + + #else + + #define stbir__simdi8_expand_u8_to_u32(out0,out1,ireg) \ + { \ + stbir__simdi a,zero = _mm_setzero_si128(); \ + a = _mm_unpacklo_epi8( ireg, zero ); \ + out0 = _mm256_setr_m128i( _mm_unpacklo_epi16( a, zero ), _mm_unpackhi_epi16( a, zero ) ); \ + a = _mm_unpackhi_epi8( ireg, zero ); \ + out1 = _mm256_setr_m128i( _mm_unpacklo_epi16( a, zero ), _mm_unpackhi_epi16( a, zero ) ); \ + } + + #define stbir__simdf8_pack_to_16bytes(out,aa,bb) \ + { \ + stbir__simdi t; \ + stbir__simdf8 af,bf; \ + stbir__simdi8 a,b; \ + af = _mm256_min_ps( aa, STBIR_max_uint8_as_floatX ); \ + bf = _mm256_min_ps( bb, STBIR_max_uint8_as_floatX ); \ + af = _mm256_max_ps( af, _mm256_setzero_ps() ); \ + bf = _mm256_max_ps( bf, _mm256_setzero_ps() ); \ + a = _mm256_cvttps_epi32( af ); \ + b = _mm256_cvttps_epi32( bf ); \ + out = _mm_packs_epi32( _mm256_castsi256_si128(a), _mm256_extractf128_si256( a, 1 ) ); \ + out = _mm_packus_epi16( out, out ); \ + t = _mm_packs_epi32( _mm256_castsi256_si128(b), _mm256_extractf128_si256( b, 1 ) ); \ + t = _mm_packus_epi16( t, t ); \ + out = _mm_castps_si128( _mm_shuffle_ps( _mm_castsi128_ps(out), _mm_castsi128_ps(t), (0<<0)+(1<<2)+(0<<4)+(1<<6) ) ); \ + } + + #define stbir__simdi8_expand_u16_to_u32(out,ireg) \ + { \ + stbir__simdi a,b,zero = _mm_setzero_si128(); \ + a = _mm_unpacklo_epi16( ireg, zero ); \ + b = _mm_unpackhi_epi16( ireg, zero ); \ + out = _mm256_insertf128_si256( _mm256_castsi128_si256( a ), b, 1 ); \ + } + + #define stbir__simdf8_pack_to_16words(out,aa,bb) \ + { \ + stbir__simdi t0,t1; \ + stbir__simdf8 af,bf; \ + stbir__simdi8 a,b; \ + af = _mm256_min_ps( aa, STBIR_max_uint16_as_floatX ); \ + bf = _mm256_min_ps( bb, STBIR_max_uint16_as_floatX ); \ + af = _mm256_max_ps( af, _mm256_setzero_ps() ); \ + bf = _mm256_max_ps( bf, _mm256_setzero_ps() ); \ + a = _mm256_cvttps_epi32( af ); \ + b = _mm256_cvttps_epi32( bf ); \ + t0 = _mm_packus_epi32( _mm256_castsi256_si128(a), _mm256_extractf128_si256( a, 1 ) ); \ + t1 = _mm_packus_epi32( _mm256_castsi256_si128(b), _mm256_extractf128_si256( b, 1 ) ); \ + out = _mm256_setr_m128i( t0, t1 ); \ + } + + #endif + + static __m256i stbir_00001111 = { STBIR__CONST_4d_32i( 0, 0, 0, 0 ), STBIR__CONST_4d_32i( 1, 1, 1, 1 ) }; + #define stbir__simdf8_0123to00001111( out, in ) (out) = _mm256_permutevar_ps ( in, stbir_00001111 ) + + static __m256i stbir_22223333 = { STBIR__CONST_4d_32i( 2, 2, 2, 2 ), STBIR__CONST_4d_32i( 3, 3, 3, 3 ) }; + #define stbir__simdf8_0123to22223333( out, in ) (out) = _mm256_permutevar_ps ( in, stbir_22223333 ) + + #define stbir__simdf8_0123to2222( out, in ) (out) = stbir__simdf_swiz(_mm256_castps256_ps128(in), 2,2,2,2 ) + + #define stbir__simdf8_load4b( out, ptr ) (out) = _mm256_broadcast_ps( (__m128 const *)(ptr) ) + + static __m256i stbir_00112233 = { STBIR__CONST_4d_32i( 0, 0, 1, 1 ), STBIR__CONST_4d_32i( 2, 2, 3, 3 ) }; + #define stbir__simdf8_0123to00112233( out, in ) (out) = _mm256_permutevar_ps ( in, stbir_00112233 ) + #define stbir__simdf8_add4( out, a8, b ) (out) = _mm256_add_ps( a8, _mm256_castps128_ps256( b ) ) + + static __m256i stbir_load6 = { STBIR__CONST_4_32i( 0x80000000 ), STBIR__CONST_4d_32i( 0x80000000, 0x80000000, 0, 0 ) }; + #define stbir__simdf8_load6z( out, ptr ) (out) = _mm256_maskload_ps( ptr, stbir_load6 ) + + #define stbir__simdf8_0123to00000000( out, in ) (out) = _mm256_shuffle_ps ( in, in, (0<<0)+(0<<2)+(0<<4)+(0<<6) ) + #define stbir__simdf8_0123to11111111( out, in ) (out) = _mm256_shuffle_ps ( in, in, (1<<0)+(1<<2)+(1<<4)+(1<<6) ) + #define stbir__simdf8_0123to22222222( out, in ) (out) = _mm256_shuffle_ps ( in, in, (2<<0)+(2<<2)+(2<<4)+(2<<6) ) + #define stbir__simdf8_0123to33333333( out, in ) (out) = _mm256_shuffle_ps ( in, in, (3<<0)+(3<<2)+(3<<4)+(3<<6) ) + #define stbir__simdf8_0123to21032103( out, in ) (out) = _mm256_shuffle_ps ( in, in, (2<<0)+(1<<2)+(0<<4)+(3<<6) ) + #define stbir__simdf8_0123to32103210( out, in ) (out) = _mm256_shuffle_ps ( in, in, (3<<0)+(2<<2)+(1<<4)+(0<<6) ) + #define stbir__simdf8_0123to12301230( out, in ) (out) = _mm256_shuffle_ps ( in, in, (1<<0)+(2<<2)+(3<<4)+(0<<6) ) + #define stbir__simdf8_0123to10321032( out, in ) (out) = _mm256_shuffle_ps ( in, in, (1<<0)+(0<<2)+(3<<4)+(2<<6) ) + #define stbir__simdf8_0123to30123012( out, in ) (out) = _mm256_shuffle_ps ( in, in, (3<<0)+(0<<2)+(1<<4)+(2<<6) ) + + #define stbir__simdf8_0123to11331133( out, in ) (out) = _mm256_shuffle_ps ( in, in, (1<<0)+(1<<2)+(3<<4)+(3<<6) ) + #define stbir__simdf8_0123to00220022( out, in ) (out) = _mm256_shuffle_ps ( in, in, (0<<0)+(0<<2)+(2<<4)+(2<<6) ) + + #define stbir__simdf8_aaa1( out, alp, ones ) (out) = _mm256_blend_ps( alp, ones, (1<<0)+(1<<1)+(1<<2)+(0<<3)+(1<<4)+(1<<5)+(1<<6)+(0<<7)); (out)=_mm256_shuffle_ps( out,out, (3<<0) + (3<<2) + (3<<4) + (0<<6) ) + #define stbir__simdf8_1aaa( out, alp, ones ) (out) = _mm256_blend_ps( alp, ones, (0<<0)+(1<<1)+(1<<2)+(1<<3)+(0<<4)+(1<<5)+(1<<6)+(1<<7)); (out)=_mm256_shuffle_ps( out,out, (1<<0) + (0<<2) + (0<<4) + (0<<6) ) + #define stbir__simdf8_a1a1( out, alp, ones) (out) = _mm256_blend_ps( alp, ones, (1<<0)+(0<<1)+(1<<2)+(0<<3)+(1<<4)+(0<<5)+(1<<6)+(0<<7)); (out)=_mm256_shuffle_ps( out,out, (1<<0) + (0<<2) + (3<<4) + (2<<6) ) + #define stbir__simdf8_1a1a( out, alp, ones) (out) = _mm256_blend_ps( alp, ones, (0<<0)+(1<<1)+(0<<2)+(1<<3)+(0<<4)+(1<<5)+(0<<6)+(1<<7)); (out)=_mm256_shuffle_ps( out,out, (1<<0) + (0<<2) + (3<<4) + (2<<6) ) + + #define stbir__simdf8_zero( reg ) (reg) = _mm256_setzero_ps() + + #ifdef STBIR_USE_FMA // not on by default to maintain bit identical simd to non-simd + #define stbir__simdf8_madd( out, add, mul1, mul2 ) (out) = _mm256_fmadd_ps( mul1, mul2, add ) + #define stbir__simdf8_madd_mem( out, add, mul, ptr ) (out) = _mm256_fmadd_ps( mul, _mm256_loadu_ps( (float const*)(ptr) ), add ) + #define stbir__simdf8_madd_mem4( out, add, mul, ptr )(out) = _mm256_fmadd_ps( _mm256_setr_m128( mul, _mm_setzero_ps() ), _mm256_setr_m128( _mm_loadu_ps( (float const*)(ptr) ), _mm_setzero_ps() ), add ) + #else + #define stbir__simdf8_madd( out, add, mul1, mul2 ) (out) = _mm256_add_ps( add, _mm256_mul_ps( mul1, mul2 ) ) + #define stbir__simdf8_madd_mem( out, add, mul, ptr ) (out) = _mm256_add_ps( add, _mm256_mul_ps( mul, _mm256_loadu_ps( (float const*)(ptr) ) ) ) + #define stbir__simdf8_madd_mem4( out, add, mul, ptr ) (out) = _mm256_add_ps( add, _mm256_setr_m128( _mm_mul_ps( mul, _mm_loadu_ps( (float const*)(ptr) ) ), _mm_setzero_ps() ) ) + #endif + #define stbir__if_simdf8_cast_to_simdf4( val ) _mm256_castps256_ps128( val ) + + #endif + + #ifdef STBIR_FLOORF + #undef STBIR_FLOORF + #endif + #define STBIR_FLOORF stbir_simd_floorf + static stbir__inline float stbir_simd_floorf(float x) // martins floorf + { + #if defined(STBIR_AVX) || defined(__SSE4_1__) || defined(STBIR_SSE41) + __m128 t = _mm_set_ss(x); + return _mm_cvtss_f32( _mm_floor_ss(t, t) ); + #else + __m128 f = _mm_set_ss(x); + __m128 t = _mm_cvtepi32_ps(_mm_cvttps_epi32(f)); + __m128 r = _mm_add_ss(t, _mm_and_ps(_mm_cmplt_ss(f, t), _mm_set_ss(-1.0f))); + return _mm_cvtss_f32(r); + #endif + } + + #ifdef STBIR_CEILF + #undef STBIR_CEILF + #endif + #define STBIR_CEILF stbir_simd_ceilf + static stbir__inline float stbir_simd_ceilf(float x) // martins ceilf + { + #if defined(STBIR_AVX) || defined(__SSE4_1__) || defined(STBIR_SSE41) + __m128 t = _mm_set_ss(x); + return _mm_cvtss_f32( _mm_ceil_ss(t, t) ); + #else + __m128 f = _mm_set_ss(x); + __m128 t = _mm_cvtepi32_ps(_mm_cvttps_epi32(f)); + __m128 r = _mm_add_ss(t, _mm_and_ps(_mm_cmplt_ss(t, f), _mm_set_ss(1.0f))); + return _mm_cvtss_f32(r); + #endif + } + +#elif defined(STBIR_NEON) + + #include + + #define stbir__simdf float32x4_t + #define stbir__simdi uint32x4_t + + #define stbir_simdi_castf( reg ) vreinterpretq_u32_f32(reg) + #define stbir_simdf_casti( reg ) vreinterpretq_f32_u32(reg) + + #define stbir__simdf_load( reg, ptr ) (reg) = vld1q_f32( (float const*)(ptr) ) + #define stbir__simdi_load( reg, ptr ) (reg) = vld1q_u32( (uint32_t const*)(ptr) ) + #define stbir__simdf_load1( out, ptr ) (out) = vld1q_dup_f32( (float const*)(ptr) ) // top values can be random (not denormal or nan for perf) + #define stbir__simdi_load1( out, ptr ) (out) = vld1q_dup_u32( (uint32_t const*)(ptr) ) + #define stbir__simdf_load1z( out, ptr ) (out) = vld1q_lane_f32( (float const*)(ptr), vdupq_n_f32(0), 0 ) // top values must be zero + #define stbir__simdf_frep4( fvar ) vdupq_n_f32( fvar ) + #define stbir__simdf_load1frep4( out, fvar ) (out) = vdupq_n_f32( fvar ) + #define stbir__simdf_load2( out, ptr ) (out) = vcombine_f32( vld1_f32( (float const*)(ptr) ), vcreate_f32(0) ) // top values can be random (not denormal or nan for perf) + #define stbir__simdf_load2z( out, ptr ) (out) = vcombine_f32( vld1_f32( (float const*)(ptr) ), vcreate_f32(0) ) // top values must be zero + #define stbir__simdf_load2hmerge( out, reg, ptr ) (out) = vcombine_f32( vget_low_f32(reg), vld1_f32( (float const*)(ptr) ) ) + + #define stbir__simdf_zeroP() vdupq_n_f32(0) + #define stbir__simdf_zero( reg ) (reg) = vdupq_n_f32(0) + + #define stbir__simdf_store( ptr, reg ) vst1q_f32( (float*)(ptr), reg ) + #define stbir__simdf_store1( ptr, reg ) vst1q_lane_f32( (float*)(ptr), reg, 0) + #define stbir__simdf_store2( ptr, reg ) vst1_f32( (float*)(ptr), vget_low_f32(reg) ) + #define stbir__simdf_store2h( ptr, reg ) vst1_f32( (float*)(ptr), vget_high_f32(reg) ) + + #define stbir__simdi_store( ptr, reg ) vst1q_u32( (uint32_t*)(ptr), reg ) + #define stbir__simdi_store1( ptr, reg ) vst1q_lane_u32( (uint32_t*)(ptr), reg, 0 ) + #define stbir__simdi_store2( ptr, reg ) vst1_u32( (uint32_t*)(ptr), vget_low_u32(reg) ) + + #define stbir__prefetch( ptr ) + + #define stbir__simdi_expand_u8_to_u32(out0,out1,out2,out3,ireg) \ + { \ + uint16x8_t l = vmovl_u8( vget_low_u8 ( vreinterpretq_u8_u32(ireg) ) ); \ + uint16x8_t h = vmovl_u8( vget_high_u8( vreinterpretq_u8_u32(ireg) ) ); \ + out0 = vmovl_u16( vget_low_u16 ( l ) ); \ + out1 = vmovl_u16( vget_high_u16( l ) ); \ + out2 = vmovl_u16( vget_low_u16 ( h ) ); \ + out3 = vmovl_u16( vget_high_u16( h ) ); \ + } + + #define stbir__simdi_expand_u8_to_1u32(out,ireg) \ + { \ + uint16x8_t tmp = vmovl_u8( vget_low_u8( vreinterpretq_u8_u32(ireg) ) ); \ + out = vmovl_u16( vget_low_u16( tmp ) ); \ + } + + #define stbir__simdi_expand_u16_to_u32(out0,out1,ireg) \ + { \ + uint16x8_t tmp = vreinterpretq_u16_u32(ireg); \ + out0 = vmovl_u16( vget_low_u16 ( tmp ) ); \ + out1 = vmovl_u16( vget_high_u16( tmp ) ); \ + } + + #define stbir__simdf_convert_float_to_i32( i, f ) (i) = vreinterpretq_u32_s32( vcvtq_s32_f32(f) ) + #define stbir__simdf_convert_float_to_int( f ) vgetq_lane_s32(vcvtq_s32_f32(f), 0) + #define stbir__simdi_to_int( i ) (int)vgetq_lane_u32(i, 0) + #define stbir__simdf_convert_float_to_uint8( f ) ((unsigned char)vgetq_lane_s32(vcvtq_s32_f32(vmaxq_f32(vminq_f32(f,STBIR__CONSTF(STBIR_max_uint8_as_float)),vdupq_n_f32(0))), 0)) + #define stbir__simdf_convert_float_to_short( f ) ((unsigned short)vgetq_lane_s32(vcvtq_s32_f32(vmaxq_f32(vminq_f32(f,STBIR__CONSTF(STBIR_max_uint16_as_float)),vdupq_n_f32(0))), 0)) + #define stbir__simdi_convert_i32_to_float(out, ireg) (out) = vcvtq_f32_s32( vreinterpretq_s32_u32(ireg) ) + #define stbir__simdf_add( out, reg0, reg1 ) (out) = vaddq_f32( reg0, reg1 ) + #define stbir__simdf_mult( out, reg0, reg1 ) (out) = vmulq_f32( reg0, reg1 ) + #define stbir__simdf_mult_mem( out, reg, ptr ) (out) = vmulq_f32( reg, vld1q_f32( (float const*)(ptr) ) ) + #define stbir__simdf_mult1_mem( out, reg, ptr ) (out) = vmulq_f32( reg, vld1q_dup_f32( (float const*)(ptr) ) ) + #define stbir__simdf_add_mem( out, reg, ptr ) (out) = vaddq_f32( reg, vld1q_f32( (float const*)(ptr) ) ) + #define stbir__simdf_add1_mem( out, reg, ptr ) (out) = vaddq_f32( reg, vld1q_dup_f32( (float const*)(ptr) ) ) + + #ifdef STBIR_USE_FMA // not on by default to maintain bit identical simd to non-simd (and also x64 no madd to arm madd) + #define stbir__simdf_madd( out, add, mul1, mul2 ) (out) = vfmaq_f32( add, mul1, mul2 ) + #define stbir__simdf_madd1( out, add, mul1, mul2 ) (out) = vfmaq_f32( add, mul1, mul2 ) + #define stbir__simdf_madd_mem( out, add, mul, ptr ) (out) = vfmaq_f32( add, mul, vld1q_f32( (float const*)(ptr) ) ) + #define stbir__simdf_madd1_mem( out, add, mul, ptr ) (out) = vfmaq_f32( add, mul, vld1q_dup_f32( (float const*)(ptr) ) ) + #else + #define stbir__simdf_madd( out, add, mul1, mul2 ) (out) = vaddq_f32( add, vmulq_f32( mul1, mul2 ) ) + #define stbir__simdf_madd1( out, add, mul1, mul2 ) (out) = vaddq_f32( add, vmulq_f32( mul1, mul2 ) ) + #define stbir__simdf_madd_mem( out, add, mul, ptr ) (out) = vaddq_f32( add, vmulq_f32( mul, vld1q_f32( (float const*)(ptr) ) ) ) + #define stbir__simdf_madd1_mem( out, add, mul, ptr ) (out) = vaddq_f32( add, vmulq_f32( mul, vld1q_dup_f32( (float const*)(ptr) ) ) ) + #endif + + #define stbir__simdf_add1( out, reg0, reg1 ) (out) = vaddq_f32( reg0, reg1 ) + #define stbir__simdf_mult1( out, reg0, reg1 ) (out) = vmulq_f32( reg0, reg1 ) + + #define stbir__simdf_and( out, reg0, reg1 ) (out) = vreinterpretq_f32_u32( vandq_u32( vreinterpretq_u32_f32(reg0), vreinterpretq_u32_f32(reg1) ) ) + #define stbir__simdf_or( out, reg0, reg1 ) (out) = vreinterpretq_f32_u32( vorrq_u32( vreinterpretq_u32_f32(reg0), vreinterpretq_u32_f32(reg1) ) ) + + #define stbir__simdf_min( out, reg0, reg1 ) (out) = vminq_f32( reg0, reg1 ) + #define stbir__simdf_max( out, reg0, reg1 ) (out) = vmaxq_f32( reg0, reg1 ) + #define stbir__simdf_min1( out, reg0, reg1 ) (out) = vminq_f32( reg0, reg1 ) + #define stbir__simdf_max1( out, reg0, reg1 ) (out) = vmaxq_f32( reg0, reg1 ) + + #define stbir__simdf_0123ABCDto3ABx( out, reg0, reg1 ) (out) = vextq_f32( reg0, reg1, 3 ) + #define stbir__simdf_0123ABCDto23Ax( out, reg0, reg1 ) (out) = vextq_f32( reg0, reg1, 2 ) + + #define stbir__simdf_a1a1( out, alp, ones ) (out) = vzipq_f32(vuzpq_f32(alp, alp).val[1], ones).val[0] + #define stbir__simdf_1a1a( out, alp, ones ) (out) = vzipq_f32(ones, vuzpq_f32(alp, alp).val[0]).val[0] + + #if defined( _M_ARM64 ) || defined( __aarch64__ ) || defined( __arm64__ ) + + #define stbir__simdf_aaa1( out, alp, ones ) (out) = vcopyq_laneq_f32(vdupq_n_f32(vgetq_lane_f32(alp, 3)), 3, ones, 3) + #define stbir__simdf_1aaa( out, alp, ones ) (out) = vcopyq_laneq_f32(vdupq_n_f32(vgetq_lane_f32(alp, 0)), 0, ones, 0) + + #if defined( _MSC_VER ) && !defined(__clang__) + #define stbir_make16(a,b,c,d) vcombine_u8( \ + vcreate_u8( (4*a+0) | ((4*a+1)<<8) | ((4*a+2)<<16) | ((4*a+3)<<24) | \ + ((stbir_uint64)(4*b+0)<<32) | ((stbir_uint64)(4*b+1)<<40) | ((stbir_uint64)(4*b+2)<<48) | ((stbir_uint64)(4*b+3)<<56)), \ + vcreate_u8( (4*c+0) | ((4*c+1)<<8) | ((4*c+2)<<16) | ((4*c+3)<<24) | \ + ((stbir_uint64)(4*d+0)<<32) | ((stbir_uint64)(4*d+1)<<40) | ((stbir_uint64)(4*d+2)<<48) | ((stbir_uint64)(4*d+3)<<56) ) ) + + static stbir__inline uint8x16x2_t stbir_make16x2(float32x4_t rega,float32x4_t regb) + { + uint8x16x2_t r = { vreinterpretq_u8_f32(rega), vreinterpretq_u8_f32(regb) }; + return r; + } + #else + #define stbir_make16(a,b,c,d) (uint8x16_t){4*a+0,4*a+1,4*a+2,4*a+3,4*b+0,4*b+1,4*b+2,4*b+3,4*c+0,4*c+1,4*c+2,4*c+3,4*d+0,4*d+1,4*d+2,4*d+3} + #define stbir_make16x2(a,b) (uint8x16x2_t){{vreinterpretq_u8_f32(a),vreinterpretq_u8_f32(b)}} + #endif + + #define stbir__simdf_swiz( reg, one, two, three, four ) vreinterpretq_f32_u8( vqtbl1q_u8( vreinterpretq_u8_f32(reg), stbir_make16(one, two, three, four) ) ) + #define stbir__simdf_swiz2( rega, regb, one, two, three, four ) vreinterpretq_f32_u8( vqtbl2q_u8( stbir_make16x2(rega,regb), stbir_make16(one, two, three, four) ) ) + + #define stbir__simdi_16madd( out, reg0, reg1 ) \ + { \ + int16x8_t r0 = vreinterpretq_s16_u32(reg0); \ + int16x8_t r1 = vreinterpretq_s16_u32(reg1); \ + int32x4_t tmp0 = vmull_s16( vget_low_s16(r0), vget_low_s16(r1) ); \ + int32x4_t tmp1 = vmull_s16( vget_high_s16(r0), vget_high_s16(r1) ); \ + (out) = vreinterpretq_u32_s32( vpaddq_s32(tmp0, tmp1) ); \ + } + + #else + + #define stbir__simdf_aaa1( out, alp, ones ) (out) = vsetq_lane_f32(1.0f, vdupq_n_f32(vgetq_lane_f32(alp, 3)), 3) + #define stbir__simdf_1aaa( out, alp, ones ) (out) = vsetq_lane_f32(1.0f, vdupq_n_f32(vgetq_lane_f32(alp, 0)), 0) + + #if defined( _MSC_VER ) && !defined(__clang__) + static stbir__inline uint8x8x2_t stbir_make8x2(float32x4_t reg) + { + uint8x8x2_t r = { { vget_low_u8(vreinterpretq_u8_f32(reg)), vget_high_u8(vreinterpretq_u8_f32(reg)) } }; + return r; + } + #define stbir_make8(a,b) vcreate_u8( \ + (4*a+0) | ((4*a+1)<<8) | ((4*a+2)<<16) | ((4*a+3)<<24) | \ + ((stbir_uint64)(4*b+0)<<32) | ((stbir_uint64)(4*b+1)<<40) | ((stbir_uint64)(4*b+2)<<48) | ((stbir_uint64)(4*b+3)<<56) ) + #else + #define stbir_make8x2(reg) (uint8x8x2_t){ { vget_low_u8(vreinterpretq_u8_f32(reg)), vget_high_u8(vreinterpretq_u8_f32(reg)) } } + #define stbir_make8(a,b) (uint8x8_t){4*a+0,4*a+1,4*a+2,4*a+3,4*b+0,4*b+1,4*b+2,4*b+3} + #endif + + #define stbir__simdf_swiz( reg, one, two, three, four ) vreinterpretq_f32_u8( vcombine_u8( \ + vtbl2_u8( stbir_make8x2( reg ), stbir_make8( one, two ) ), \ + vtbl2_u8( stbir_make8x2( reg ), stbir_make8( three, four ) ) ) ) + + #define stbir__simdi_16madd( out, reg0, reg1 ) \ + { \ + int16x8_t r0 = vreinterpretq_s16_u32(reg0); \ + int16x8_t r1 = vreinterpretq_s16_u32(reg1); \ + int32x4_t tmp0 = vmull_s16( vget_low_s16(r0), vget_low_s16(r1) ); \ + int32x4_t tmp1 = vmull_s16( vget_high_s16(r0), vget_high_s16(r1) ); \ + int32x2_t out0 = vpadd_s32( vget_low_s32(tmp0), vget_high_s32(tmp0) ); \ + int32x2_t out1 = vpadd_s32( vget_low_s32(tmp1), vget_high_s32(tmp1) ); \ + (out) = vreinterpretq_u32_s32( vcombine_s32(out0, out1) ); \ + } + + #endif + + #define stbir__simdi_and( out, reg0, reg1 ) (out) = vandq_u32( reg0, reg1 ) + #define stbir__simdi_or( out, reg0, reg1 ) (out) = vorrq_u32( reg0, reg1 ) + + #define stbir__simdf_pack_to_8bytes(out,aa,bb) \ + { \ + float32x4_t af = vmaxq_f32( vminq_f32(aa,STBIR__CONSTF(STBIR_max_uint8_as_float) ), vdupq_n_f32(0) ); \ + float32x4_t bf = vmaxq_f32( vminq_f32(bb,STBIR__CONSTF(STBIR_max_uint8_as_float) ), vdupq_n_f32(0) ); \ + int16x4_t ai = vqmovn_s32( vcvtq_s32_f32( af ) ); \ + int16x4_t bi = vqmovn_s32( vcvtq_s32_f32( bf ) ); \ + uint8x8_t out8 = vqmovun_s16( vcombine_s16(ai, bi) ); \ + out = vreinterpretq_u32_u8( vcombine_u8(out8, out8) ); \ + } + + #define stbir__simdf_pack_to_8words(out,aa,bb) \ + { \ + float32x4_t af = vmaxq_f32( vminq_f32(aa,STBIR__CONSTF(STBIR_max_uint16_as_float) ), vdupq_n_f32(0) ); \ + float32x4_t bf = vmaxq_f32( vminq_f32(bb,STBIR__CONSTF(STBIR_max_uint16_as_float) ), vdupq_n_f32(0) ); \ + int32x4_t ai = vcvtq_s32_f32( af ); \ + int32x4_t bi = vcvtq_s32_f32( bf ); \ + out = vreinterpretq_u32_u16( vcombine_u16(vqmovun_s32(ai), vqmovun_s32(bi)) ); \ + } + + #define stbir__interleave_pack_and_store_16_u8( ptr, r0, r1, r2, r3 ) \ + { \ + int16x4x2_t tmp0 = vzip_s16( vqmovn_s32(vreinterpretq_s32_u32(r0)), vqmovn_s32(vreinterpretq_s32_u32(r2)) ); \ + int16x4x2_t tmp1 = vzip_s16( vqmovn_s32(vreinterpretq_s32_u32(r1)), vqmovn_s32(vreinterpretq_s32_u32(r3)) ); \ + uint8x8x2_t out = \ + { { \ + vqmovun_s16( vcombine_s16(tmp0.val[0], tmp0.val[1]) ), \ + vqmovun_s16( vcombine_s16(tmp1.val[0], tmp1.val[1]) ), \ + } }; \ + vst2_u8(ptr, out); \ + } + + #define stbir__simdf_load4_transposed( o0, o1, o2, o3, ptr ) \ + { \ + float32x4x4_t tmp = vld4q_f32(ptr); \ + o0 = tmp.val[0]; \ + o1 = tmp.val[1]; \ + o2 = tmp.val[2]; \ + o3 = tmp.val[3]; \ + } + + #define stbir__simdi_32shr( out, reg, imm ) out = vshrq_n_u32( reg, imm ) + + #if defined( _MSC_VER ) && !defined(__clang__) + #define STBIR__SIMDF_CONST(var, x) __declspec(align(8)) float var[] = { x, x, x, x } + #define STBIR__SIMDI_CONST(var, x) __declspec(align(8)) uint32_t var[] = { x, x, x, x } + #define STBIR__CONSTF(var) (*(const float32x4_t*)var) + #define STBIR__CONSTI(var) (*(const uint32x4_t*)var) + #else + #define STBIR__SIMDF_CONST(var, x) stbir__simdf var = { x, x, x, x } + #define STBIR__SIMDI_CONST(var, x) stbir__simdi var = { x, x, x, x } + #define STBIR__CONSTF(var) (var) + #define STBIR__CONSTI(var) (var) + #endif + + #ifdef STBIR_FLOORF + #undef STBIR_FLOORF + #endif + #define STBIR_FLOORF stbir_simd_floorf + static stbir__inline float stbir_simd_floorf(float x) + { + #if defined( _M_ARM64 ) || defined( __aarch64__ ) || defined( __arm64__ ) + return vget_lane_f32( vrndm_f32( vdup_n_f32(x) ), 0); + #else + float32x2_t f = vdup_n_f32(x); + float32x2_t t = vcvt_f32_s32(vcvt_s32_f32(f)); + uint32x2_t a = vclt_f32(f, t); + uint32x2_t b = vreinterpret_u32_f32(vdup_n_f32(-1.0f)); + float32x2_t r = vadd_f32(t, vreinterpret_f32_u32(vand_u32(a, b))); + return vget_lane_f32(r, 0); + #endif + } + + #ifdef STBIR_CEILF + #undef STBIR_CEILF + #endif + #define STBIR_CEILF stbir_simd_ceilf + static stbir__inline float stbir_simd_ceilf(float x) + { + #if defined( _M_ARM64 ) || defined( __aarch64__ ) || defined( __arm64__ ) + return vget_lane_f32( vrndp_f32( vdup_n_f32(x) ), 0); + #else + float32x2_t f = vdup_n_f32(x); + float32x2_t t = vcvt_f32_s32(vcvt_s32_f32(f)); + uint32x2_t a = vclt_f32(t, f); + uint32x2_t b = vreinterpret_u32_f32(vdup_n_f32(1.0f)); + float32x2_t r = vadd_f32(t, vreinterpret_f32_u32(vand_u32(a, b))); + return vget_lane_f32(r, 0); + #endif + } + + #define STBIR_SIMD + +#elif defined(STBIR_WASM) + + #include + + #define stbir__simdf v128_t + #define stbir__simdi v128_t + + #define stbir_simdi_castf( reg ) (reg) + #define stbir_simdf_casti( reg ) (reg) + + #define stbir__simdf_load( reg, ptr ) (reg) = wasm_v128_load( (void const*)(ptr) ) + #define stbir__simdi_load( reg, ptr ) (reg) = wasm_v128_load( (void const*)(ptr) ) + #define stbir__simdf_load1( out, ptr ) (out) = wasm_v128_load32_splat( (void const*)(ptr) ) // top values can be random (not denormal or nan for perf) + #define stbir__simdi_load1( out, ptr ) (out) = wasm_v128_load32_splat( (void const*)(ptr) ) + #define stbir__simdf_load1z( out, ptr ) (out) = wasm_v128_load32_zero( (void const*)(ptr) ) // top values must be zero + #define stbir__simdf_frep4( fvar ) wasm_f32x4_splat( fvar ) + #define stbir__simdf_load1frep4( out, fvar ) (out) = wasm_f32x4_splat( fvar ) + #define stbir__simdf_load2( out, ptr ) (out) = wasm_v128_load64_splat( (void const*)(ptr) ) // top values can be random (not denormal or nan for perf) + #define stbir__simdf_load2z( out, ptr ) (out) = wasm_v128_load64_zero( (void const*)(ptr) ) // top values must be zero + #define stbir__simdf_load2hmerge( out, reg, ptr ) (out) = wasm_v128_load64_lane( (void const*)(ptr), reg, 1 ) + + #define stbir__simdf_zeroP() wasm_f32x4_const_splat(0) + #define stbir__simdf_zero( reg ) (reg) = wasm_f32x4_const_splat(0) + + #define stbir__simdf_store( ptr, reg ) wasm_v128_store( (void*)(ptr), reg ) + #define stbir__simdf_store1( ptr, reg ) wasm_v128_store32_lane( (void*)(ptr), reg, 0 ) + #define stbir__simdf_store2( ptr, reg ) wasm_v128_store64_lane( (void*)(ptr), reg, 0 ) + #define stbir__simdf_store2h( ptr, reg ) wasm_v128_store64_lane( (void*)(ptr), reg, 1 ) + + #define stbir__simdi_store( ptr, reg ) wasm_v128_store( (void*)(ptr), reg ) + #define stbir__simdi_store1( ptr, reg ) wasm_v128_store32_lane( (void*)(ptr), reg, 0 ) + #define stbir__simdi_store2( ptr, reg ) wasm_v128_store64_lane( (void*)(ptr), reg, 0 ) + + #define stbir__prefetch( ptr ) + + #define stbir__simdi_expand_u8_to_u32(out0,out1,out2,out3,ireg) \ + { \ + v128_t l = wasm_u16x8_extend_low_u8x16 ( ireg ); \ + v128_t h = wasm_u16x8_extend_high_u8x16( ireg ); \ + out0 = wasm_u32x4_extend_low_u16x8 ( l ); \ + out1 = wasm_u32x4_extend_high_u16x8( l ); \ + out2 = wasm_u32x4_extend_low_u16x8 ( h ); \ + out3 = wasm_u32x4_extend_high_u16x8( h ); \ + } + + #define stbir__simdi_expand_u8_to_1u32(out,ireg) \ + { \ + v128_t tmp = wasm_u16x8_extend_low_u8x16(ireg); \ + out = wasm_u32x4_extend_low_u16x8(tmp); \ + } + + #define stbir__simdi_expand_u16_to_u32(out0,out1,ireg) \ + { \ + out0 = wasm_u32x4_extend_low_u16x8 ( ireg ); \ + out1 = wasm_u32x4_extend_high_u16x8( ireg ); \ + } + + #define stbir__simdf_convert_float_to_i32( i, f ) (i) = wasm_i32x4_trunc_sat_f32x4(f) + #define stbir__simdf_convert_float_to_int( f ) wasm_i32x4_extract_lane(wasm_i32x4_trunc_sat_f32x4(f), 0) + #define stbir__simdi_to_int( i ) wasm_i32x4_extract_lane(i, 0) + #define stbir__simdf_convert_float_to_uint8( f ) ((unsigned char)wasm_i32x4_extract_lane(wasm_i32x4_trunc_sat_f32x4(wasm_f32x4_max(wasm_f32x4_min(f,STBIR_max_uint8_as_float),wasm_f32x4_const_splat(0))), 0)) + #define stbir__simdf_convert_float_to_short( f ) ((unsigned short)wasm_i32x4_extract_lane(wasm_i32x4_trunc_sat_f32x4(wasm_f32x4_max(wasm_f32x4_min(f,STBIR_max_uint16_as_float),wasm_f32x4_const_splat(0))), 0)) + #define stbir__simdi_convert_i32_to_float(out, ireg) (out) = wasm_f32x4_convert_i32x4(ireg) + #define stbir__simdf_add( out, reg0, reg1 ) (out) = wasm_f32x4_add( reg0, reg1 ) + #define stbir__simdf_mult( out, reg0, reg1 ) (out) = wasm_f32x4_mul( reg0, reg1 ) + #define stbir__simdf_mult_mem( out, reg, ptr ) (out) = wasm_f32x4_mul( reg, wasm_v128_load( (void const*)(ptr) ) ) + #define stbir__simdf_mult1_mem( out, reg, ptr ) (out) = wasm_f32x4_mul( reg, wasm_v128_load32_splat( (void const*)(ptr) ) ) + #define stbir__simdf_add_mem( out, reg, ptr ) (out) = wasm_f32x4_add( reg, wasm_v128_load( (void const*)(ptr) ) ) + #define stbir__simdf_add1_mem( out, reg, ptr ) (out) = wasm_f32x4_add( reg, wasm_v128_load32_splat( (void const*)(ptr) ) ) + + #define stbir__simdf_madd( out, add, mul1, mul2 ) (out) = wasm_f32x4_add( add, wasm_f32x4_mul( mul1, mul2 ) ) + #define stbir__simdf_madd1( out, add, mul1, mul2 ) (out) = wasm_f32x4_add( add, wasm_f32x4_mul( mul1, mul2 ) ) + #define stbir__simdf_madd_mem( out, add, mul, ptr ) (out) = wasm_f32x4_add( add, wasm_f32x4_mul( mul, wasm_v128_load( (void const*)(ptr) ) ) ) + #define stbir__simdf_madd1_mem( out, add, mul, ptr ) (out) = wasm_f32x4_add( add, wasm_f32x4_mul( mul, wasm_v128_load32_splat( (void const*)(ptr) ) ) ) + + #define stbir__simdf_add1( out, reg0, reg1 ) (out) = wasm_f32x4_add( reg0, reg1 ) + #define stbir__simdf_mult1( out, reg0, reg1 ) (out) = wasm_f32x4_mul( reg0, reg1 ) + + #define stbir__simdf_and( out, reg0, reg1 ) (out) = wasm_v128_and( reg0, reg1 ) + #define stbir__simdf_or( out, reg0, reg1 ) (out) = wasm_v128_or( reg0, reg1 ) + + #define stbir__simdf_min( out, reg0, reg1 ) (out) = wasm_f32x4_min( reg0, reg1 ) + #define stbir__simdf_max( out, reg0, reg1 ) (out) = wasm_f32x4_max( reg0, reg1 ) + #define stbir__simdf_min1( out, reg0, reg1 ) (out) = wasm_f32x4_min( reg0, reg1 ) + #define stbir__simdf_max1( out, reg0, reg1 ) (out) = wasm_f32x4_max( reg0, reg1 ) + + #define stbir__simdf_0123ABCDto3ABx( out, reg0, reg1 ) (out) = wasm_i32x4_shuffle( reg0, reg1, 3, 4, 5, -1 ) + #define stbir__simdf_0123ABCDto23Ax( out, reg0, reg1 ) (out) = wasm_i32x4_shuffle( reg0, reg1, 2, 3, 4, -1 ) + + #define stbir__simdf_aaa1(out,alp,ones) (out) = wasm_i32x4_shuffle(alp, ones, 3, 3, 3, 4) + #define stbir__simdf_1aaa(out,alp,ones) (out) = wasm_i32x4_shuffle(alp, ones, 4, 0, 0, 0) + #define stbir__simdf_a1a1(out,alp,ones) (out) = wasm_i32x4_shuffle(alp, ones, 1, 4, 3, 4) + #define stbir__simdf_1a1a(out,alp,ones) (out) = wasm_i32x4_shuffle(alp, ones, 4, 0, 4, 2) + + #define stbir__simdf_swiz( reg, one, two, three, four ) wasm_i32x4_shuffle(reg, reg, one, two, three, four) + + #define stbir__simdi_and( out, reg0, reg1 ) (out) = wasm_v128_and( reg0, reg1 ) + #define stbir__simdi_or( out, reg0, reg1 ) (out) = wasm_v128_or( reg0, reg1 ) + #define stbir__simdi_16madd( out, reg0, reg1 ) (out) = wasm_i32x4_dot_i16x8( reg0, reg1 ) + + #define stbir__simdf_pack_to_8bytes(out,aa,bb) \ + { \ + v128_t af = wasm_f32x4_max( wasm_f32x4_min(aa, STBIR_max_uint8_as_float), wasm_f32x4_const_splat(0) ); \ + v128_t bf = wasm_f32x4_max( wasm_f32x4_min(bb, STBIR_max_uint8_as_float), wasm_f32x4_const_splat(0) ); \ + v128_t ai = wasm_i32x4_trunc_sat_f32x4( af ); \ + v128_t bi = wasm_i32x4_trunc_sat_f32x4( bf ); \ + v128_t out16 = wasm_i16x8_narrow_i32x4( ai, bi ); \ + out = wasm_u8x16_narrow_i16x8( out16, out16 ); \ + } + + #define stbir__simdf_pack_to_8words(out,aa,bb) \ + { \ + v128_t af = wasm_f32x4_max( wasm_f32x4_min(aa, STBIR_max_uint16_as_float), wasm_f32x4_const_splat(0)); \ + v128_t bf = wasm_f32x4_max( wasm_f32x4_min(bb, STBIR_max_uint16_as_float), wasm_f32x4_const_splat(0)); \ + v128_t ai = wasm_i32x4_trunc_sat_f32x4( af ); \ + v128_t bi = wasm_i32x4_trunc_sat_f32x4( bf ); \ + out = wasm_u16x8_narrow_i32x4( ai, bi ); \ + } + + #define stbir__interleave_pack_and_store_16_u8( ptr, r0, r1, r2, r3 ) \ + { \ + v128_t tmp0 = wasm_i16x8_narrow_i32x4(r0, r1); \ + v128_t tmp1 = wasm_i16x8_narrow_i32x4(r2, r3); \ + v128_t tmp = wasm_u8x16_narrow_i16x8(tmp0, tmp1); \ + tmp = wasm_i8x16_shuffle(tmp, tmp, 0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15); \ + wasm_v128_store( (void*)(ptr), tmp); \ + } + + #define stbir__simdf_load4_transposed( o0, o1, o2, o3, ptr ) \ + { \ + v128_t t0 = wasm_v128_load( ptr ); \ + v128_t t1 = wasm_v128_load( ptr+4 ); \ + v128_t t2 = wasm_v128_load( ptr+8 ); \ + v128_t t3 = wasm_v128_load( ptr+12 ); \ + v128_t s0 = wasm_i32x4_shuffle(t0, t1, 0, 4, 2, 6); \ + v128_t s1 = wasm_i32x4_shuffle(t0, t1, 1, 5, 3, 7); \ + v128_t s2 = wasm_i32x4_shuffle(t2, t3, 0, 4, 2, 6); \ + v128_t s3 = wasm_i32x4_shuffle(t2, t3, 1, 5, 3, 7); \ + o0 = wasm_i32x4_shuffle(s0, s2, 0, 1, 4, 5); \ + o1 = wasm_i32x4_shuffle(s1, s3, 0, 1, 4, 5); \ + o2 = wasm_i32x4_shuffle(s0, s2, 2, 3, 6, 7); \ + o3 = wasm_i32x4_shuffle(s1, s3, 2, 3, 6, 7); \ + } + + #define stbir__simdi_32shr( out, reg, imm ) out = wasm_u32x4_shr( reg, imm ) + + typedef float stbir__f32x4 __attribute__((__vector_size__(16), __aligned__(16))); + #define STBIR__SIMDF_CONST(var, x) stbir__simdf var = (v128_t)(stbir__f32x4){ x, x, x, x } + #define STBIR__SIMDI_CONST(var, x) stbir__simdi var = { x, x, x, x } + #define STBIR__CONSTF(var) (var) + #define STBIR__CONSTI(var) (var) + + #ifdef STBIR_FLOORF + #undef STBIR_FLOORF + #endif + #define STBIR_FLOORF stbir_simd_floorf + static stbir__inline float stbir_simd_floorf(float x) + { + return wasm_f32x4_extract_lane( wasm_f32x4_floor( wasm_f32x4_splat(x) ), 0); + } + + #ifdef STBIR_CEILF + #undef STBIR_CEILF + #endif + #define STBIR_CEILF stbir_simd_ceilf + static stbir__inline float stbir_simd_ceilf(float x) + { + return wasm_f32x4_extract_lane( wasm_f32x4_ceil( wasm_f32x4_splat(x) ), 0); + } + + #define STBIR_SIMD + +#endif // SSE2/NEON/WASM + +#endif // NO SIMD + +#ifdef STBIR_SIMD8 + #define stbir__simdfX stbir__simdf8 + #define stbir__simdiX stbir__simdi8 + #define stbir__simdfX_load stbir__simdf8_load + #define stbir__simdiX_load stbir__simdi8_load + #define stbir__simdfX_mult stbir__simdf8_mult + #define stbir__simdfX_add_mem stbir__simdf8_add_mem + #define stbir__simdfX_madd_mem stbir__simdf8_madd_mem + #define stbir__simdfX_store stbir__simdf8_store + #define stbir__simdiX_store stbir__simdi8_store + #define stbir__simdf_frepX stbir__simdf8_frep8 + #define stbir__simdfX_madd stbir__simdf8_madd + #define stbir__simdfX_min stbir__simdf8_min + #define stbir__simdfX_max stbir__simdf8_max + #define stbir__simdfX_aaa1 stbir__simdf8_aaa1 + #define stbir__simdfX_1aaa stbir__simdf8_1aaa + #define stbir__simdfX_a1a1 stbir__simdf8_a1a1 + #define stbir__simdfX_1a1a stbir__simdf8_1a1a + #define stbir__simdfX_convert_float_to_i32 stbir__simdf8_convert_float_to_i32 + #define stbir__simdfX_pack_to_words stbir__simdf8_pack_to_16words + #define stbir__simdfX_zero stbir__simdf8_zero + #define STBIR_onesX STBIR_ones8 + #define STBIR_max_uint8_as_floatX STBIR_max_uint8_as_float8 + #define STBIR_max_uint16_as_floatX STBIR_max_uint16_as_float8 + #define STBIR_simd_point5X STBIR_simd_point58 + #define stbir__simdfX_float_count 8 + #define stbir__simdfX_0123to1230 stbir__simdf8_0123to12301230 + #define stbir__simdfX_0123to2103 stbir__simdf8_0123to21032103 + static const stbir__simdf8 STBIR_max_uint16_as_float_inverted8 = { stbir__max_uint16_as_float_inverted,stbir__max_uint16_as_float_inverted,stbir__max_uint16_as_float_inverted,stbir__max_uint16_as_float_inverted,stbir__max_uint16_as_float_inverted,stbir__max_uint16_as_float_inverted,stbir__max_uint16_as_float_inverted,stbir__max_uint16_as_float_inverted }; + static const stbir__simdf8 STBIR_max_uint8_as_float_inverted8 = { stbir__max_uint8_as_float_inverted,stbir__max_uint8_as_float_inverted,stbir__max_uint8_as_float_inverted,stbir__max_uint8_as_float_inverted,stbir__max_uint8_as_float_inverted,stbir__max_uint8_as_float_inverted,stbir__max_uint8_as_float_inverted,stbir__max_uint8_as_float_inverted }; + static const stbir__simdf8 STBIR_ones8 = { 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0 }; + static const stbir__simdf8 STBIR_simd_point58 = { 0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5 }; + static const stbir__simdf8 STBIR_max_uint8_as_float8 = { stbir__max_uint8_as_float,stbir__max_uint8_as_float,stbir__max_uint8_as_float,stbir__max_uint8_as_float, stbir__max_uint8_as_float,stbir__max_uint8_as_float,stbir__max_uint8_as_float,stbir__max_uint8_as_float }; + static const stbir__simdf8 STBIR_max_uint16_as_float8 = { stbir__max_uint16_as_float,stbir__max_uint16_as_float,stbir__max_uint16_as_float,stbir__max_uint16_as_float, stbir__max_uint16_as_float,stbir__max_uint16_as_float,stbir__max_uint16_as_float,stbir__max_uint16_as_float }; +#else + #define stbir__simdfX stbir__simdf + #define stbir__simdiX stbir__simdi + #define stbir__simdfX_load stbir__simdf_load + #define stbir__simdiX_load stbir__simdi_load + #define stbir__simdfX_mult stbir__simdf_mult + #define stbir__simdfX_add_mem stbir__simdf_add_mem + #define stbir__simdfX_madd_mem stbir__simdf_madd_mem + #define stbir__simdfX_store stbir__simdf_store + #define stbir__simdiX_store stbir__simdi_store + #define stbir__simdf_frepX stbir__simdf_frep4 + #define stbir__simdfX_madd stbir__simdf_madd + #define stbir__simdfX_min stbir__simdf_min + #define stbir__simdfX_max stbir__simdf_max + #define stbir__simdfX_aaa1 stbir__simdf_aaa1 + #define stbir__simdfX_1aaa stbir__simdf_1aaa + #define stbir__simdfX_a1a1 stbir__simdf_a1a1 + #define stbir__simdfX_1a1a stbir__simdf_1a1a + #define stbir__simdfX_convert_float_to_i32 stbir__simdf_convert_float_to_i32 + #define stbir__simdfX_pack_to_words stbir__simdf_pack_to_8words + #define stbir__simdfX_zero stbir__simdf_zero + #define STBIR_onesX STBIR__CONSTF(STBIR_ones) + #define STBIR_simd_point5X STBIR__CONSTF(STBIR_simd_point5) + #define STBIR_max_uint8_as_floatX STBIR__CONSTF(STBIR_max_uint8_as_float) + #define STBIR_max_uint16_as_floatX STBIR__CONSTF(STBIR_max_uint16_as_float) + #define stbir__simdfX_float_count 4 + #define stbir__if_simdf8_cast_to_simdf4( val ) ( val ) + #define stbir__simdfX_0123to1230 stbir__simdf_0123to1230 + #define stbir__simdfX_0123to2103 stbir__simdf_0123to2103 +#endif + + +#if defined(STBIR_NEON) && !defined(_M_ARM) && !defined(__arm__) + + #if defined( _MSC_VER ) && !defined(__clang__) + typedef __int16 stbir__FP16; + #else + typedef float16_t stbir__FP16; + #endif + +#else // no NEON, or 32-bit ARM for MSVC + + typedef union stbir__FP16 + { + unsigned short u; + } stbir__FP16; + +#endif + +#if (!defined(STBIR_NEON) && !defined(STBIR_FP16C)) || (defined(STBIR_NEON) && defined(_M_ARM)) || (defined(STBIR_NEON) && defined(__arm__)) + + // Fabian's half float routines, see: https://gist.github.com/rygorous/2156668 + + static stbir__inline float stbir__half_to_float( stbir__FP16 h ) + { + static const stbir__FP32 magic = { (254 - 15) << 23 }; + static const stbir__FP32 was_infnan = { (127 + 16) << 23 }; + stbir__FP32 o; + + o.u = (h.u & 0x7fff) << 13; // exponent/mantissa bits + o.f *= magic.f; // exponent adjust + if (o.f >= was_infnan.f) // make sure Inf/NaN survive + o.u |= 255 << 23; + o.u |= (h.u & 0x8000) << 16; // sign bit + return o.f; + } + + static stbir__inline stbir__FP16 stbir__float_to_half(float val) + { + stbir__FP32 f32infty = { 255 << 23 }; + stbir__FP32 f16max = { (127 + 16) << 23 }; + stbir__FP32 denorm_magic = { ((127 - 15) + (23 - 10) + 1) << 23 }; + unsigned int sign_mask = 0x80000000u; + stbir__FP16 o = { 0 }; + stbir__FP32 f; + unsigned int sign; + + f.f = val; + sign = f.u & sign_mask; + f.u ^= sign; + + if (f.u >= f16max.u) // result is Inf or NaN (all exponent bits set) + o.u = (f.u > f32infty.u) ? 0x7e00 : 0x7c00; // NaN->qNaN and Inf->Inf + else // (De)normalized number or zero + { + if (f.u < (113 << 23)) // resulting FP16 is subnormal or zero + { + // use a magic value to align our 10 mantissa bits at the bottom of + // the float. as long as FP addition is round-to-nearest-even this + // just works. + f.f += denorm_magic.f; + // and one integer subtract of the bias later, we have our final float! + o.u = (unsigned short) ( f.u - denorm_magic.u ); + } + else + { + unsigned int mant_odd = (f.u >> 13) & 1; // resulting mantissa is odd + // update exponent, rounding bias part 1 + f.u = f.u + ((15u - 127) << 23) + 0xfff; + // rounding bias part 2 + f.u += mant_odd; + // take the bits! + o.u = (unsigned short) ( f.u >> 13 ); + } + } + + o.u |= sign >> 16; + return o; + } + +#endif + + +#if defined(STBIR_FP16C) + + #include + + static stbir__inline void stbir__half_to_float_SIMD(float * output, stbir__FP16 const * input) + { + _mm256_storeu_ps( (float*)output, _mm256_cvtph_ps( _mm_loadu_si128( (__m128i const* )input ) ) ); + } + + static stbir__inline void stbir__float_to_half_SIMD(stbir__FP16 * output, float const * input) + { + _mm_storeu_si128( (__m128i*)output, _mm256_cvtps_ph( _mm256_loadu_ps( input ), 0 ) ); + } + + static stbir__inline float stbir__half_to_float( stbir__FP16 h ) + { + return _mm_cvtss_f32( _mm_cvtph_ps( _mm_cvtsi32_si128( (int)h.u ) ) ); + } + + static stbir__inline stbir__FP16 stbir__float_to_half( float f ) + { + stbir__FP16 h; + h.u = (unsigned short) _mm_cvtsi128_si32( _mm_cvtps_ph( _mm_set_ss( f ), 0 ) ); + return h; + } + +#elif defined(STBIR_SSE2) + + // Fabian's half float routines, see: https://gist.github.com/rygorous/2156668 + stbir__inline static void stbir__half_to_float_SIMD(float * output, void const * input) + { + static const STBIR__SIMDI_CONST(mask_nosign, 0x7fff); + static const STBIR__SIMDI_CONST(smallest_normal, 0x0400); + static const STBIR__SIMDI_CONST(infinity, 0x7c00); + static const STBIR__SIMDI_CONST(expadjust_normal, (127 - 15) << 23); + static const STBIR__SIMDI_CONST(magic_denorm, 113 << 23); + + __m128i i = _mm_loadu_si128 ( (__m128i const*)(input) ); + __m128i h = _mm_unpacklo_epi16 ( i, _mm_setzero_si128() ); + __m128i mnosign = STBIR__CONSTI(mask_nosign); + __m128i eadjust = STBIR__CONSTI(expadjust_normal); + __m128i smallest = STBIR__CONSTI(smallest_normal); + __m128i infty = STBIR__CONSTI(infinity); + __m128i expmant = _mm_and_si128(mnosign, h); + __m128i justsign = _mm_xor_si128(h, expmant); + __m128i b_notinfnan = _mm_cmpgt_epi32(infty, expmant); + __m128i b_isdenorm = _mm_cmpgt_epi32(smallest, expmant); + __m128i shifted = _mm_slli_epi32(expmant, 13); + __m128i adj_infnan = _mm_andnot_si128(b_notinfnan, eadjust); + __m128i adjusted = _mm_add_epi32(eadjust, shifted); + __m128i den1 = _mm_add_epi32(shifted, STBIR__CONSTI(magic_denorm)); + __m128i adjusted2 = _mm_add_epi32(adjusted, adj_infnan); + __m128 den2 = _mm_sub_ps(_mm_castsi128_ps(den1), *(const __m128 *)&magic_denorm); + __m128 adjusted3 = _mm_and_ps(den2, _mm_castsi128_ps(b_isdenorm)); + __m128 adjusted4 = _mm_andnot_ps(_mm_castsi128_ps(b_isdenorm), _mm_castsi128_ps(adjusted2)); + __m128 adjusted5 = _mm_or_ps(adjusted3, adjusted4); + __m128i sign = _mm_slli_epi32(justsign, 16); + __m128 final = _mm_or_ps(adjusted5, _mm_castsi128_ps(sign)); + stbir__simdf_store( output + 0, final ); + + h = _mm_unpackhi_epi16 ( i, _mm_setzero_si128() ); + expmant = _mm_and_si128(mnosign, h); + justsign = _mm_xor_si128(h, expmant); + b_notinfnan = _mm_cmpgt_epi32(infty, expmant); + b_isdenorm = _mm_cmpgt_epi32(smallest, expmant); + shifted = _mm_slli_epi32(expmant, 13); + adj_infnan = _mm_andnot_si128(b_notinfnan, eadjust); + adjusted = _mm_add_epi32(eadjust, shifted); + den1 = _mm_add_epi32(shifted, STBIR__CONSTI(magic_denorm)); + adjusted2 = _mm_add_epi32(adjusted, adj_infnan); + den2 = _mm_sub_ps(_mm_castsi128_ps(den1), *(const __m128 *)&magic_denorm); + adjusted3 = _mm_and_ps(den2, _mm_castsi128_ps(b_isdenorm)); + adjusted4 = _mm_andnot_ps(_mm_castsi128_ps(b_isdenorm), _mm_castsi128_ps(adjusted2)); + adjusted5 = _mm_or_ps(adjusted3, adjusted4); + sign = _mm_slli_epi32(justsign, 16); + final = _mm_or_ps(adjusted5, _mm_castsi128_ps(sign)); + stbir__simdf_store( output + 4, final ); + + // ~38 SSE2 ops for 8 values + } + + // Fabian's round-to-nearest-even float to half + // ~48 SSE2 ops for 8 output + stbir__inline static void stbir__float_to_half_SIMD(void * output, float const * input) + { + static const STBIR__SIMDI_CONST(mask_sign, 0x80000000u); + static const STBIR__SIMDI_CONST(c_f16max, (127 + 16) << 23); // all FP32 values >=this round to +inf + static const STBIR__SIMDI_CONST(c_nanbit, 0x200); + static const STBIR__SIMDI_CONST(c_infty_as_fp16, 0x7c00); + static const STBIR__SIMDI_CONST(c_min_normal, (127 - 14) << 23); // smallest FP32 that yields a normalized FP16 + static const STBIR__SIMDI_CONST(c_subnorm_magic, ((127 - 15) + (23 - 10) + 1) << 23); + static const STBIR__SIMDI_CONST(c_normal_bias, 0xfff - ((127 - 15) << 23)); // adjust exponent and add mantissa rounding + + __m128 f = _mm_loadu_ps(input); + __m128 msign = _mm_castsi128_ps(STBIR__CONSTI(mask_sign)); + __m128 justsign = _mm_and_ps(msign, f); + __m128 absf = _mm_xor_ps(f, justsign); + __m128i absf_int = _mm_castps_si128(absf); // the cast is "free" (extra bypass latency, but no thruput hit) + __m128i f16max = STBIR__CONSTI(c_f16max); + __m128 b_isnan = _mm_cmpunord_ps(absf, absf); // is this a NaN? + __m128i b_isregular = _mm_cmpgt_epi32(f16max, absf_int); // (sub)normalized or special? + __m128i nanbit = _mm_and_si128(_mm_castps_si128(b_isnan), STBIR__CONSTI(c_nanbit)); + __m128i inf_or_nan = _mm_or_si128(nanbit, STBIR__CONSTI(c_infty_as_fp16)); // output for specials + + __m128i min_normal = STBIR__CONSTI(c_min_normal); + __m128i b_issub = _mm_cmpgt_epi32(min_normal, absf_int); + + // "result is subnormal" path + __m128 subnorm1 = _mm_add_ps(absf, _mm_castsi128_ps(STBIR__CONSTI(c_subnorm_magic))); // magic value to round output mantissa + __m128i subnorm2 = _mm_sub_epi32(_mm_castps_si128(subnorm1), STBIR__CONSTI(c_subnorm_magic)); // subtract out bias + + // "result is normal" path + __m128i mantoddbit = _mm_slli_epi32(absf_int, 31 - 13); // shift bit 13 (mantissa LSB) to sign + __m128i mantodd = _mm_srai_epi32(mantoddbit, 31); // -1 if FP16 mantissa odd, else 0 + + __m128i round1 = _mm_add_epi32(absf_int, STBIR__CONSTI(c_normal_bias)); + __m128i round2 = _mm_sub_epi32(round1, mantodd); // if mantissa LSB odd, bias towards rounding up (RTNE) + __m128i normal = _mm_srli_epi32(round2, 13); // rounded result + + // combine the two non-specials + __m128i nonspecial = _mm_or_si128(_mm_and_si128(subnorm2, b_issub), _mm_andnot_si128(b_issub, normal)); + + // merge in specials as well + __m128i joined = _mm_or_si128(_mm_and_si128(nonspecial, b_isregular), _mm_andnot_si128(b_isregular, inf_or_nan)); + + __m128i sign_shift = _mm_srai_epi32(_mm_castps_si128(justsign), 16); + __m128i final2, final= _mm_or_si128(joined, sign_shift); + + f = _mm_loadu_ps(input+4); + justsign = _mm_and_ps(msign, f); + absf = _mm_xor_ps(f, justsign); + absf_int = _mm_castps_si128(absf); // the cast is "free" (extra bypass latency, but no thruput hit) + b_isnan = _mm_cmpunord_ps(absf, absf); // is this a NaN? + b_isregular = _mm_cmpgt_epi32(f16max, absf_int); // (sub)normalized or special? + nanbit = _mm_and_si128(_mm_castps_si128(b_isnan), c_nanbit); + inf_or_nan = _mm_or_si128(nanbit, STBIR__CONSTI(c_infty_as_fp16)); // output for specials + + b_issub = _mm_cmpgt_epi32(min_normal, absf_int); + + // "result is subnormal" path + subnorm1 = _mm_add_ps(absf, _mm_castsi128_ps(STBIR__CONSTI(c_subnorm_magic))); // magic value to round output mantissa + subnorm2 = _mm_sub_epi32(_mm_castps_si128(subnorm1), STBIR__CONSTI(c_subnorm_magic)); // subtract out bias + + // "result is normal" path + mantoddbit = _mm_slli_epi32(absf_int, 31 - 13); // shift bit 13 (mantissa LSB) to sign + mantodd = _mm_srai_epi32(mantoddbit, 31); // -1 if FP16 mantissa odd, else 0 + + round1 = _mm_add_epi32(absf_int, STBIR__CONSTI(c_normal_bias)); + round2 = _mm_sub_epi32(round1, mantodd); // if mantissa LSB odd, bias towards rounding up (RTNE) + normal = _mm_srli_epi32(round2, 13); // rounded result + + // combine the two non-specials + nonspecial = _mm_or_si128(_mm_and_si128(subnorm2, b_issub), _mm_andnot_si128(b_issub, normal)); + + // merge in specials as well + joined = _mm_or_si128(_mm_and_si128(nonspecial, b_isregular), _mm_andnot_si128(b_isregular, inf_or_nan)); + + sign_shift = _mm_srai_epi32(_mm_castps_si128(justsign), 16); + final2 = _mm_or_si128(joined, sign_shift); + final = _mm_packs_epi32(final, final2); + stbir__simdi_store( output,final ); + } + +#elif defined(STBIR_NEON) && defined(_MSC_VER) && defined(_M_ARM64) && !defined(__clang__) // 64-bit ARM on MSVC (not clang) + + static stbir__inline void stbir__half_to_float_SIMD(float * output, stbir__FP16 const * input) + { + float16x4_t in0 = vld1_f16(input + 0); + float16x4_t in1 = vld1_f16(input + 4); + vst1q_f32(output + 0, vcvt_f32_f16(in0)); + vst1q_f32(output + 4, vcvt_f32_f16(in1)); + } + + static stbir__inline void stbir__float_to_half_SIMD(stbir__FP16 * output, float const * input) + { + float16x4_t out0 = vcvt_f16_f32(vld1q_f32(input + 0)); + float16x4_t out1 = vcvt_f16_f32(vld1q_f32(input + 4)); + vst1_f16(output+0, out0); + vst1_f16(output+4, out1); + } + + static stbir__inline float stbir__half_to_float( stbir__FP16 h ) + { + return vgetq_lane_f32(vcvt_f32_f16(vld1_dup_f16(&h)), 0); + } + + static stbir__inline stbir__FP16 stbir__float_to_half( float f ) + { + return vget_lane_f16(vcvt_f16_f32(vdupq_n_f32(f)), 0).n16_u16[0]; + } + +#elif defined(STBIR_NEON) && ( defined( _M_ARM64 ) || defined( __aarch64__ ) || defined( __arm64__ ) ) // 64-bit ARM + + static stbir__inline void stbir__half_to_float_SIMD(float * output, stbir__FP16 const * input) + { + float16x8_t in = vld1q_f16(input); + vst1q_f32(output + 0, vcvt_f32_f16(vget_low_f16(in))); + vst1q_f32(output + 4, vcvt_f32_f16(vget_high_f16(in))); + } + + static stbir__inline void stbir__float_to_half_SIMD(stbir__FP16 * output, float const * input) + { + float16x4_t out0 = vcvt_f16_f32(vld1q_f32(input + 0)); + float16x4_t out1 = vcvt_f16_f32(vld1q_f32(input + 4)); + vst1q_f16(output, vcombine_f16(out0, out1)); + } + + static stbir__inline float stbir__half_to_float( stbir__FP16 h ) + { + return vgetq_lane_f32(vcvt_f32_f16(vdup_n_f16(h)), 0); + } + + static stbir__inline stbir__FP16 stbir__float_to_half( float f ) + { + return vget_lane_f16(vcvt_f16_f32(vdupq_n_f32(f)), 0); + } + +#elif defined(STBIR_WASM) || (defined(STBIR_NEON) && (defined(_MSC_VER) || defined(_M_ARM) || defined(__arm__))) // WASM or 32-bit ARM on MSVC/clang + + static stbir__inline void stbir__half_to_float_SIMD(float * output, stbir__FP16 const * input) + { + for (int i=0; i<8; i++) + { + output[i] = stbir__half_to_float(input[i]); + } + } + static stbir__inline void stbir__float_to_half_SIMD(stbir__FP16 * output, float const * input) + { + for (int i=0; i<8; i++) + { + output[i] = stbir__float_to_half(input[i]); + } + } + +#endif + + +#ifdef STBIR_SIMD + +#define stbir__simdf_0123to3333( out, reg ) (out) = stbir__simdf_swiz( reg, 3,3,3,3 ) +#define stbir__simdf_0123to2222( out, reg ) (out) = stbir__simdf_swiz( reg, 2,2,2,2 ) +#define stbir__simdf_0123to1111( out, reg ) (out) = stbir__simdf_swiz( reg, 1,1,1,1 ) +#define stbir__simdf_0123to0000( out, reg ) (out) = stbir__simdf_swiz( reg, 0,0,0,0 ) +#define stbir__simdf_0123to0003( out, reg ) (out) = stbir__simdf_swiz( reg, 0,0,0,3 ) +#define stbir__simdf_0123to0001( out, reg ) (out) = stbir__simdf_swiz( reg, 0,0,0,1 ) +#define stbir__simdf_0123to1122( out, reg ) (out) = stbir__simdf_swiz( reg, 1,1,2,2 ) +#define stbir__simdf_0123to2333( out, reg ) (out) = stbir__simdf_swiz( reg, 2,3,3,3 ) +#define stbir__simdf_0123to0023( out, reg ) (out) = stbir__simdf_swiz( reg, 0,0,2,3 ) +#define stbir__simdf_0123to1230( out, reg ) (out) = stbir__simdf_swiz( reg, 1,2,3,0 ) +#define stbir__simdf_0123to2103( out, reg ) (out) = stbir__simdf_swiz( reg, 2,1,0,3 ) +#define stbir__simdf_0123to3210( out, reg ) (out) = stbir__simdf_swiz( reg, 3,2,1,0 ) +#define stbir__simdf_0123to2301( out, reg ) (out) = stbir__simdf_swiz( reg, 2,3,0,1 ) +#define stbir__simdf_0123to3012( out, reg ) (out) = stbir__simdf_swiz( reg, 3,0,1,2 ) +#define stbir__simdf_0123to0011( out, reg ) (out) = stbir__simdf_swiz( reg, 0,0,1,1 ) +#define stbir__simdf_0123to1100( out, reg ) (out) = stbir__simdf_swiz( reg, 1,1,0,0 ) +#define stbir__simdf_0123to2233( out, reg ) (out) = stbir__simdf_swiz( reg, 2,2,3,3 ) +#define stbir__simdf_0123to1133( out, reg ) (out) = stbir__simdf_swiz( reg, 1,1,3,3 ) +#define stbir__simdf_0123to0022( out, reg ) (out) = stbir__simdf_swiz( reg, 0,0,2,2 ) +#define stbir__simdf_0123to1032( out, reg ) (out) = stbir__simdf_swiz( reg, 1,0,3,2 ) + +typedef union stbir__simdi_u32 +{ + stbir_uint32 m128i_u32[4]; + int m128i_i32[4]; + stbir__simdi m128i_i128; +} stbir__simdi_u32; + +static const int STBIR_mask[9] = { 0,0,0,-1,-1,-1,0,0,0 }; + +static const STBIR__SIMDF_CONST(STBIR_max_uint8_as_float, stbir__max_uint8_as_float); +static const STBIR__SIMDF_CONST(STBIR_max_uint16_as_float, stbir__max_uint16_as_float); +static const STBIR__SIMDF_CONST(STBIR_max_uint8_as_float_inverted, stbir__max_uint8_as_float_inverted); +static const STBIR__SIMDF_CONST(STBIR_max_uint16_as_float_inverted, stbir__max_uint16_as_float_inverted); + +static const STBIR__SIMDF_CONST(STBIR_simd_point5, 0.5f); +static const STBIR__SIMDF_CONST(STBIR_ones, 1.0f); +static const STBIR__SIMDI_CONST(STBIR_almost_zero, (127 - 13) << 23); +static const STBIR__SIMDI_CONST(STBIR_almost_one, 0x3f7fffff); +static const STBIR__SIMDI_CONST(STBIR_mantissa_mask, 0xff); +static const STBIR__SIMDI_CONST(STBIR_topscale, 0x02000000); + +// Basically, in simd mode, we unroll the proper amount, and we don't want +// the non-simd remnant loops to be unroll because they only run a few times +// Adding this switch saves about 5K on clang which is Captain Unroll the 3rd. +#define STBIR_SIMD_STREAMOUT_PTR( star ) STBIR_STREAMOUT_PTR( star ) +#define STBIR_SIMD_NO_UNROLL(ptr) STBIR_NO_UNROLL(ptr) +#define STBIR_SIMD_NO_UNROLL_LOOP_START STBIR_NO_UNROLL_LOOP_START +#define STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR STBIR_NO_UNROLL_LOOP_START_INF_FOR + +#ifdef STBIR_MEMCPY +#undef STBIR_MEMCPY +#endif +#define STBIR_MEMCPY stbir_simd_memcpy + +// override normal use of memcpy with much simpler copy (faster and smaller with our sized copies) +static void stbir_simd_memcpy( void * dest, void const * src, size_t bytes ) +{ + char STBIR_SIMD_STREAMOUT_PTR (*) d = (char*) dest; + char STBIR_SIMD_STREAMOUT_PTR( * ) d_end = ((char*) dest) + bytes; + ptrdiff_t ofs_to_src = (char*)src - (char*)dest; + + // check overlaps + STBIR_ASSERT( ( ( d >= ( (char*)src) + bytes ) ) || ( ( d + bytes ) <= (char*)src ) ); + + if ( bytes < (16*stbir__simdfX_float_count) ) + { + if ( bytes < 16 ) + { + if ( bytes ) + { + STBIR_SIMD_NO_UNROLL_LOOP_START + do + { + STBIR_SIMD_NO_UNROLL(d); + d[ 0 ] = d[ ofs_to_src ]; + ++d; + } while ( d < d_end ); + } + } + else + { + stbir__simdf x; + // do one unaligned to get us aligned for the stream out below + stbir__simdf_load( x, ( d + ofs_to_src ) ); + stbir__simdf_store( d, x ); + d = (char*)( ( ( (size_t)d ) + 16 ) & ~15 ); + + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + STBIR_SIMD_NO_UNROLL(d); + + if ( d > ( d_end - 16 ) ) + { + if ( d == d_end ) + return; + d = d_end - 16; + } + + stbir__simdf_load( x, ( d + ofs_to_src ) ); + stbir__simdf_store( d, x ); + d += 16; + } + } + } + else + { + stbir__simdfX x0,x1,x2,x3; + + // do one unaligned to get us aligned for the stream out below + stbir__simdfX_load( x0, ( d + ofs_to_src ) + 0*stbir__simdfX_float_count ); + stbir__simdfX_load( x1, ( d + ofs_to_src ) + 4*stbir__simdfX_float_count ); + stbir__simdfX_load( x2, ( d + ofs_to_src ) + 8*stbir__simdfX_float_count ); + stbir__simdfX_load( x3, ( d + ofs_to_src ) + 12*stbir__simdfX_float_count ); + stbir__simdfX_store( d + 0*stbir__simdfX_float_count, x0 ); + stbir__simdfX_store( d + 4*stbir__simdfX_float_count, x1 ); + stbir__simdfX_store( d + 8*stbir__simdfX_float_count, x2 ); + stbir__simdfX_store( d + 12*stbir__simdfX_float_count, x3 ); + d = (char*)( ( ( (size_t)d ) + (16*stbir__simdfX_float_count) ) & ~((16*stbir__simdfX_float_count)-1) ); + + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + STBIR_SIMD_NO_UNROLL(d); + + if ( d > ( d_end - (16*stbir__simdfX_float_count) ) ) + { + if ( d == d_end ) + return; + d = d_end - (16*stbir__simdfX_float_count); + } + + stbir__simdfX_load( x0, ( d + ofs_to_src ) + 0*stbir__simdfX_float_count ); + stbir__simdfX_load( x1, ( d + ofs_to_src ) + 4*stbir__simdfX_float_count ); + stbir__simdfX_load( x2, ( d + ofs_to_src ) + 8*stbir__simdfX_float_count ); + stbir__simdfX_load( x3, ( d + ofs_to_src ) + 12*stbir__simdfX_float_count ); + stbir__simdfX_store( d + 0*stbir__simdfX_float_count, x0 ); + stbir__simdfX_store( d + 4*stbir__simdfX_float_count, x1 ); + stbir__simdfX_store( d + 8*stbir__simdfX_float_count, x2 ); + stbir__simdfX_store( d + 12*stbir__simdfX_float_count, x3 ); + d += (16*stbir__simdfX_float_count); + } + } +} + +// memcpy that is specically intentionally overlapping (src is smaller then dest, so can be +// a normal forward copy, bytes is divisible by 4 and bytes is greater than or equal to +// the diff between dest and src) +static void stbir_overlapping_memcpy( void * dest, void const * src, size_t bytes ) +{ + char STBIR_SIMD_STREAMOUT_PTR (*) sd = (char*) src; + char STBIR_SIMD_STREAMOUT_PTR( * ) s_end = ((char*) src) + bytes; + ptrdiff_t ofs_to_dest = (char*)dest - (char*)src; + + if ( ofs_to_dest >= 16 ) // is the overlap more than 16 away? + { + char STBIR_SIMD_STREAMOUT_PTR( * ) s_end16 = ((char*) src) + (bytes&~15); + STBIR_SIMD_NO_UNROLL_LOOP_START + do + { + stbir__simdf x; + STBIR_SIMD_NO_UNROLL(sd); + stbir__simdf_load( x, sd ); + stbir__simdf_store( ( sd + ofs_to_dest ), x ); + sd += 16; + } while ( sd < s_end16 ); + + if ( sd == s_end ) + return; + } + + do + { + STBIR_SIMD_NO_UNROLL(sd); + *(int*)( sd + ofs_to_dest ) = *(int*) sd; + sd += 4; + } while ( sd < s_end ); +} + +#else // no SSE2 + +// when in scalar mode, we let unrolling happen, so this macro just does the __restrict +#define STBIR_SIMD_STREAMOUT_PTR( star ) STBIR_STREAMOUT_PTR( star ) +#define STBIR_SIMD_NO_UNROLL(ptr) +#define STBIR_SIMD_NO_UNROLL_LOOP_START +#define STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + +#endif // SSE2 + + +#ifdef STBIR_PROFILE + +#ifndef STBIR_PROFILE_FUNC + +#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined(__x86_64) || defined(__SSE2__) || defined(STBIR_SSE) || defined( _M_IX86_FP ) || defined(__i386) || defined( __i386__ ) || defined( _M_IX86 ) || defined( _X86_ ) + +#ifdef _MSC_VER + + STBIRDEF stbir_uint64 __rdtsc(); + #define STBIR_PROFILE_FUNC() __rdtsc() + +#else // non msvc + + static stbir__inline stbir_uint64 STBIR_PROFILE_FUNC() + { + stbir_uint32 lo, hi; + asm volatile ("rdtsc" : "=a" (lo), "=d" (hi) ); + return ( ( (stbir_uint64) hi ) << 32 ) | ( (stbir_uint64) lo ); + } + +#endif // msvc + +#elif defined( _M_ARM64 ) || defined( __aarch64__ ) || defined( __arm64__ ) || defined(__ARM_NEON__) + +#if defined( _MSC_VER ) && !defined(__clang__) + + #define STBIR_PROFILE_FUNC() _ReadStatusReg(ARM64_CNTVCT) + +#else + + static stbir__inline stbir_uint64 STBIR_PROFILE_FUNC() + { + stbir_uint64 tsc; + asm volatile("mrs %0, cntvct_el0" : "=r" (tsc)); + return tsc; + } + +#endif + +#else // x64, arm + +#error Unknown platform for profiling. + +#endif // x64, arm + +#endif // STBIR_PROFILE_FUNC + +#define STBIR_ONLY_PROFILE_GET_SPLIT_INFO ,stbir__per_split_info * split_info +#define STBIR_ONLY_PROFILE_SET_SPLIT_INFO ,split_info + +#define STBIR_ONLY_PROFILE_BUILD_GET_INFO ,stbir__info * profile_info +#define STBIR_ONLY_PROFILE_BUILD_SET_INFO ,profile_info + +// super light-weight micro profiler +#define STBIR_PROFILE_START_ll( info, wh ) { stbir_uint64 wh##thiszonetime = STBIR_PROFILE_FUNC(); stbir_uint64 * wh##save_parent_excluded_ptr = info->current_zone_excluded_ptr; stbir_uint64 wh##current_zone_excluded = 0; info->current_zone_excluded_ptr = &wh##current_zone_excluded; +#define STBIR_PROFILE_END_ll( info, wh ) wh##thiszonetime = STBIR_PROFILE_FUNC() - wh##thiszonetime; info->profile.named.wh += wh##thiszonetime - wh##current_zone_excluded; *wh##save_parent_excluded_ptr += wh##thiszonetime; info->current_zone_excluded_ptr = wh##save_parent_excluded_ptr; } +#define STBIR_PROFILE_FIRST_START_ll( info, wh ) { int i; info->current_zone_excluded_ptr = &info->profile.named.total; for(i=0;iprofile.array);i++) info->profile.array[i]=0; } STBIR_PROFILE_START_ll( info, wh ); +#define STBIR_PROFILE_CLEAR_EXTRAS_ll( info, num ) { int extra; for(extra=1;extra<(num);extra++) { int i; for(i=0;iprofile.array);i++) (info)[extra].profile.array[i]=0; } } + +// for thread data +#define STBIR_PROFILE_START( wh ) STBIR_PROFILE_START_ll( split_info, wh ) +#define STBIR_PROFILE_END( wh ) STBIR_PROFILE_END_ll( split_info, wh ) +#define STBIR_PROFILE_FIRST_START( wh ) STBIR_PROFILE_FIRST_START_ll( split_info, wh ) +#define STBIR_PROFILE_CLEAR_EXTRAS() STBIR_PROFILE_CLEAR_EXTRAS_ll( split_info, split_count ) + +// for build data +#define STBIR_PROFILE_BUILD_START( wh ) STBIR_PROFILE_START_ll( profile_info, wh ) +#define STBIR_PROFILE_BUILD_END( wh ) STBIR_PROFILE_END_ll( profile_info, wh ) +#define STBIR_PROFILE_BUILD_FIRST_START( wh ) STBIR_PROFILE_FIRST_START_ll( profile_info, wh ) +#define STBIR_PROFILE_BUILD_CLEAR( info ) { int i; for(i=0;iprofile.array);i++) info->profile.array[i]=0; } + +#else // no profile + +#define STBIR_ONLY_PROFILE_GET_SPLIT_INFO +#define STBIR_ONLY_PROFILE_SET_SPLIT_INFO + +#define STBIR_ONLY_PROFILE_BUILD_GET_INFO +#define STBIR_ONLY_PROFILE_BUILD_SET_INFO + +#define STBIR_PROFILE_START( wh ) +#define STBIR_PROFILE_END( wh ) +#define STBIR_PROFILE_FIRST_START( wh ) +#define STBIR_PROFILE_CLEAR_EXTRAS( ) + +#define STBIR_PROFILE_BUILD_START( wh ) +#define STBIR_PROFILE_BUILD_END( wh ) +#define STBIR_PROFILE_BUILD_FIRST_START( wh ) +#define STBIR_PROFILE_BUILD_CLEAR( info ) + +#endif // stbir_profile + +#ifndef STBIR_CEILF +#include +#if _MSC_VER <= 1200 // support VC6 for Sean +#define STBIR_CEILF(x) ((float)ceil((float)(x))) +#define STBIR_FLOORF(x) ((float)floor((float)(x))) +#else +#define STBIR_CEILF(x) ceilf(x) +#define STBIR_FLOORF(x) floorf(x) +#endif +#endif + +#ifndef STBIR_MEMCPY +// For memcpy +#include +#define STBIR_MEMCPY( dest, src, len ) memcpy( dest, src, len ) +#endif + +#ifndef STBIR_SIMD + +// memcpy that is specifically intentionally overlapping (src is smaller then dest, so can be +// a normal forward copy, bytes is divisible by 4 and bytes is greater than or equal to +// the diff between dest and src) +static void stbir_overlapping_memcpy( void * dest, void const * src, size_t bytes ) +{ + char STBIR_SIMD_STREAMOUT_PTR (*) sd = (char*) src; + char STBIR_SIMD_STREAMOUT_PTR( * ) s_end = ((char*) src) + bytes; + ptrdiff_t ofs_to_dest = (char*)dest - (char*)src; + + if ( ofs_to_dest >= 8 ) // is the overlap more than 8 away + { + char STBIR_SIMD_STREAMOUT_PTR( * ) s_end8 = ((char*) src) + (bytes&~7); + + if ( ( ( ((ptrdiff_t)dest)|((ptrdiff_t)src) ) & 7 ) == 0 ) // is it 8byte aligned? + { + STBIR_NO_UNROLL_LOOP_START + do + { + STBIR_NO_UNROLL(sd); + *(stbir_uint64*)( sd + ofs_to_dest ) = *(stbir_uint64*) sd; + sd += 8; + } while ( sd < s_end8 ); + } + else + { + STBIR_NO_UNROLL_LOOP_START + do + { + int a,b; + STBIR_NO_UNROLL(sd); + a = ((int*)sd)[0]; + b = ((int*)sd)[1]; + ((int*)( sd + ofs_to_dest ))[0] = a; + ((int*)( sd + ofs_to_dest ))[1] = b; + sd += 8; + } while ( sd < s_end8 ); + } + + if ( sd == s_end ) + return; + } + + STBIR_NO_UNROLL_LOOP_START + do + { + STBIR_NO_UNROLL(sd); + *(int*)( sd + ofs_to_dest ) = *(int*) sd; + sd += 4; + } while ( sd < s_end ); +} + +#endif + +static float stbir__filter_trapezoid(float x, float scale, void * user_data) +{ + float halfscale = scale / 2; + float t = 0.5f + halfscale; + STBIR_ASSERT(scale <= 1); + STBIR__UNUSED(user_data); + + if ( x < 0.0f ) x = -x; + + if (x >= t) + return 0.0f; + else + { + float r = 0.5f - halfscale; + if (x <= r) + return 1.0f; + else + return (t - x) / scale; + } +} + +static float stbir__support_trapezoid(float scale, void * user_data) +{ + STBIR__UNUSED(user_data); + return 0.5f + scale / 2.0f; +} + +static float stbir__filter_triangle(float x, float s, void * user_data) +{ + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + + if ( x < 0.0f ) x = -x; + + if (x <= 1.0f) + return 1.0f - x; + else + return 0.0f; +} + +static float stbir__filter_point(float x, float s, void * user_data) +{ + STBIR__UNUSED(x); + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + + return 1.0f; +} + +static float stbir__filter_cubic(float x, float s, void * user_data) +{ + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + + if ( x < 0.0f ) x = -x; + + if (x < 1.0f) + return (4.0f + x*x*(3.0f*x - 6.0f))/6.0f; + else if (x < 2.0f) + return (8.0f + x*(-12.0f + x*(6.0f - x)))/6.0f; + + return (0.0f); +} + +static float stbir__filter_catmullrom(float x, float s, void * user_data) +{ + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + + if ( x < 0.0f ) x = -x; + + if (x < 1.0f) + return 1.0f - x*x*(2.5f - 1.5f*x); + else if (x < 2.0f) + return 2.0f - x*(4.0f + x*(0.5f*x - 2.5f)); + + return (0.0f); +} + +static float stbir__filter_mitchell(float x, float s, void * user_data) +{ + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + + if ( x < 0.0f ) x = -x; + + if (x < 1.0f) + return (16.0f + x*x*(21.0f * x - 36.0f))/18.0f; + else if (x < 2.0f) + return (32.0f + x*(-60.0f + x*(36.0f - 7.0f*x)))/18.0f; + + return (0.0f); +} + +static float stbir__support_zeropoint5(float s, void * user_data) +{ + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + return 0.5f; +} + +static float stbir__support_one(float s, void * user_data) +{ + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + return 1; +} + +static float stbir__support_two(float s, void * user_data) +{ + STBIR__UNUSED(s); + STBIR__UNUSED(user_data); + return 2; +} + +// This is the maximum number of input samples that can affect an output sample +// with the given filter from the output pixel's perspective +static int stbir__get_filter_pixel_width(stbir__support_callback * support, float scale, void * user_data) +{ + STBIR_ASSERT(support != 0); + + if ( scale >= ( 1.0f-stbir__small_float ) ) // upscale + return (int)STBIR_CEILF(support(1.0f/scale,user_data) * 2.0f); + else + return (int)STBIR_CEILF(support(scale,user_data) * 2.0f / scale); +} + +// this is how many coefficents per run of the filter (which is different +// from the filter_pixel_width depending on if we are scattering or gathering) +static int stbir__get_coefficient_width(stbir__sampler * samp, int is_gather, void * user_data) +{ + float scale = samp->scale_info.scale; + stbir__support_callback * support = samp->filter_support; + + switch( is_gather ) + { + case 1: + return (int)STBIR_CEILF(support(1.0f / scale, user_data) * 2.0f); + case 2: + return (int)STBIR_CEILF(support(scale, user_data) * 2.0f / scale); + case 0: + return (int)STBIR_CEILF(support(scale, user_data) * 2.0f); + default: + STBIR_ASSERT( (is_gather >= 0 ) && (is_gather <= 2 ) ); + return 0; + } +} + +static int stbir__get_contributors(stbir__sampler * samp, int is_gather) +{ + if (is_gather) + return samp->scale_info.output_sub_size; + else + return (samp->scale_info.input_full_size + samp->filter_pixel_margin * 2); +} + +static int stbir__edge_zero_full( int n, int max ) +{ + STBIR__UNUSED(n); + STBIR__UNUSED(max); + return 0; // NOTREACHED +} + +static int stbir__edge_clamp_full( int n, int max ) +{ + if (n < 0) + return 0; + + if (n >= max) + return max - 1; + + return n; // NOTREACHED +} + +static int stbir__edge_reflect_full( int n, int max ) +{ + if (n < 0) + { + if (n > -max) + return -n; + else + return max - 1; + } + + if (n >= max) + { + int max2 = max * 2; + if (n >= max2) + return 0; + else + return max2 - n - 1; + } + + return n; // NOTREACHED +} + +static int stbir__edge_wrap_full( int n, int max ) +{ + if (n >= 0) + return (n % max); + else + { + int m = (-n) % max; + + if (m != 0) + m = max - m; + + return (m); + } +} + +typedef int stbir__edge_wrap_func( int n, int max ); +static stbir__edge_wrap_func * stbir__edge_wrap_slow[] = +{ + stbir__edge_clamp_full, // STBIR_EDGE_CLAMP + stbir__edge_reflect_full, // STBIR_EDGE_REFLECT + stbir__edge_wrap_full, // STBIR_EDGE_WRAP + stbir__edge_zero_full, // STBIR_EDGE_ZERO +}; + +stbir__inline static int stbir__edge_wrap(stbir_edge edge, int n, int max) +{ + // avoid per-pixel switch + if (n >= 0 && n < max) + return n; + return stbir__edge_wrap_slow[edge]( n, max ); +} + +#define STBIR__MERGE_RUNS_PIXEL_THRESHOLD 16 + +// get information on the extents of a sampler +static void stbir__get_extents( stbir__sampler * samp, stbir__extents * scanline_extents ) +{ + int j, stop; + int left_margin, right_margin; + int min_n = 0x7fffffff, max_n = -0x7fffffff; + int min_left = 0x7fffffff, max_left = -0x7fffffff; + int min_right = 0x7fffffff, max_right = -0x7fffffff; + stbir_edge edge = samp->edge; + stbir__contributors* contributors = samp->contributors; + int output_sub_size = samp->scale_info.output_sub_size; + int input_full_size = samp->scale_info.input_full_size; + int filter_pixel_margin = samp->filter_pixel_margin; + + STBIR_ASSERT( samp->is_gather ); + + stop = output_sub_size; + for (j = 0; j < stop; j++ ) + { + STBIR_ASSERT( contributors[j].n1 >= contributors[j].n0 ); + if ( contributors[j].n0 < min_n ) + { + min_n = contributors[j].n0; + stop = j + filter_pixel_margin; // if we find a new min, only scan another filter width + if ( stop > output_sub_size ) stop = output_sub_size; + } + } + + stop = 0; + for (j = output_sub_size - 1; j >= stop; j-- ) + { + STBIR_ASSERT( contributors[j].n1 >= contributors[j].n0 ); + if ( contributors[j].n1 > max_n ) + { + max_n = contributors[j].n1; + stop = j - filter_pixel_margin; // if we find a new max, only scan another filter width + if (stop<0) stop = 0; + } + } + + STBIR_ASSERT( scanline_extents->conservative.n0 <= min_n ); + STBIR_ASSERT( scanline_extents->conservative.n1 >= max_n ); + + // now calculate how much into the margins we really read + left_margin = 0; + if ( min_n < 0 ) + { + left_margin = -min_n; + min_n = 0; + } + + right_margin = 0; + if ( max_n >= input_full_size ) + { + right_margin = max_n - input_full_size + 1; + max_n = input_full_size - 1; + } + + // index 1 is margin pixel extents (how many pixels we hang over the edge) + scanline_extents->edge_sizes[0] = left_margin; + scanline_extents->edge_sizes[1] = right_margin; + + // index 2 is pixels read from the input + scanline_extents->spans[0].n0 = min_n; + scanline_extents->spans[0].n1 = max_n; + scanline_extents->spans[0].pixel_offset_for_input = min_n; + + // default to no other input range + scanline_extents->spans[1].n0 = 0; + scanline_extents->spans[1].n1 = -1; + scanline_extents->spans[1].pixel_offset_for_input = 0; + + // don't have to do edge calc for zero clamp + if ( edge == STBIR_EDGE_ZERO ) + return; + + // convert margin pixels to the pixels within the input (min and max) + for( j = -left_margin ; j < 0 ; j++ ) + { + int p = stbir__edge_wrap( edge, j, input_full_size ); + if ( p < min_left ) + min_left = p; + if ( p > max_left ) + max_left = p; + } + + for( j = input_full_size ; j < (input_full_size + right_margin) ; j++ ) + { + int p = stbir__edge_wrap( edge, j, input_full_size ); + if ( p < min_right ) + min_right = p; + if ( p > max_right ) + max_right = p; + } + + // merge the left margin pixel region if it connects within 4 pixels of main pixel region + if ( min_left != 0x7fffffff ) + { + if ( ( ( min_left <= min_n ) && ( ( max_left + STBIR__MERGE_RUNS_PIXEL_THRESHOLD ) >= min_n ) ) || + ( ( min_n <= min_left ) && ( ( max_n + STBIR__MERGE_RUNS_PIXEL_THRESHOLD ) >= max_left ) ) ) + { + scanline_extents->spans[0].n0 = min_n = stbir__min( min_n, min_left ); + scanline_extents->spans[0].n1 = max_n = stbir__max( max_n, max_left ); + scanline_extents->spans[0].pixel_offset_for_input = min_n; + left_margin = 0; + } + } + + // merge the right margin pixel region if it connects within 4 pixels of main pixel region + if ( min_right != 0x7fffffff ) + { + if ( ( ( min_right <= min_n ) && ( ( max_right + STBIR__MERGE_RUNS_PIXEL_THRESHOLD ) >= min_n ) ) || + ( ( min_n <= min_right ) && ( ( max_n + STBIR__MERGE_RUNS_PIXEL_THRESHOLD ) >= max_right ) ) ) + { + scanline_extents->spans[0].n0 = min_n = stbir__min( min_n, min_right ); + scanline_extents->spans[0].n1 = max_n = stbir__max( max_n, max_right ); + scanline_extents->spans[0].pixel_offset_for_input = min_n; + right_margin = 0; + } + } + + STBIR_ASSERT( scanline_extents->conservative.n0 <= min_n ); + STBIR_ASSERT( scanline_extents->conservative.n1 >= max_n ); + + // you get two ranges when you have the WRAP edge mode and you are doing just the a piece of the resize + // so you need to get a second run of pixels from the opposite side of the scanline (which you + // wouldn't need except for WRAP) + + + // if we can't merge the min_left range, add it as a second range + if ( ( left_margin ) && ( min_left != 0x7fffffff ) ) + { + stbir__span * newspan = scanline_extents->spans + 1; + STBIR_ASSERT( right_margin == 0 ); + if ( min_left < scanline_extents->spans[0].n0 ) + { + scanline_extents->spans[1].pixel_offset_for_input = scanline_extents->spans[0].n0; + scanline_extents->spans[1].n0 = scanline_extents->spans[0].n0; + scanline_extents->spans[1].n1 = scanline_extents->spans[0].n1; + --newspan; + } + newspan->pixel_offset_for_input = min_left; + newspan->n0 = -left_margin; + newspan->n1 = ( max_left - min_left ) - left_margin; + scanline_extents->edge_sizes[0] = 0; // don't need to copy the left margin, since we are directly decoding into the margin + } + // if we can't merge the min_right range, add it as a second range + else + if ( ( right_margin ) && ( min_right != 0x7fffffff ) ) + { + stbir__span * newspan = scanline_extents->spans + 1; + if ( min_right < scanline_extents->spans[0].n0 ) + { + scanline_extents->spans[1].pixel_offset_for_input = scanline_extents->spans[0].n0; + scanline_extents->spans[1].n0 = scanline_extents->spans[0].n0; + scanline_extents->spans[1].n1 = scanline_extents->spans[0].n1; + --newspan; + } + newspan->pixel_offset_for_input = min_right; + newspan->n0 = scanline_extents->spans[1].n1 + 1; + newspan->n1 = scanline_extents->spans[1].n1 + 1 + ( max_right - min_right ); + scanline_extents->edge_sizes[1] = 0; // don't need to copy the right margin, since we are directly decoding into the margin + } + + // sort the spans into write output order + if ( ( scanline_extents->spans[1].n1 > scanline_extents->spans[1].n0 ) && ( scanline_extents->spans[0].n0 > scanline_extents->spans[1].n0 ) ) + { + stbir__span tspan = scanline_extents->spans[0]; + scanline_extents->spans[0] = scanline_extents->spans[1]; + scanline_extents->spans[1] = tspan; + } +} + +static void stbir__calculate_in_pixel_range( int * first_pixel, int * last_pixel, float out_pixel_center, float out_filter_radius, float inv_scale, float out_shift, int input_size, stbir_edge edge ) +{ + int first, last; + float out_pixel_influence_lowerbound = out_pixel_center - out_filter_radius; + float out_pixel_influence_upperbound = out_pixel_center + out_filter_radius; + + float in_pixel_influence_lowerbound = (out_pixel_influence_lowerbound + out_shift) * inv_scale; + float in_pixel_influence_upperbound = (out_pixel_influence_upperbound + out_shift) * inv_scale; + + first = (int)(STBIR_FLOORF(in_pixel_influence_lowerbound + 0.5f)); + last = (int)(STBIR_FLOORF(in_pixel_influence_upperbound - 0.5f)); + if ( last < first ) last = first; // point sample mode can span a value *right* at 0.5, and cause these to cross + + if ( edge == STBIR_EDGE_WRAP ) + { + if ( first < -input_size ) + first = -input_size; + if ( last >= (input_size*2)) + last = (input_size*2) - 1; + } + + *first_pixel = first; + *last_pixel = last; +} + +static void stbir__calculate_coefficients_for_gather_upsample( float out_filter_radius, stbir__kernel_callback * kernel, stbir__scale_info * scale_info, int num_contributors, stbir__contributors* contributors, float* coefficient_group, int coefficient_width, stbir_edge edge, void * user_data ) +{ + int n, end; + float inv_scale = scale_info->inv_scale; + float out_shift = scale_info->pixel_shift; + int input_size = scale_info->input_full_size; + int numerator = scale_info->scale_numerator; + int polyphase = ( ( scale_info->scale_is_rational ) && ( numerator < num_contributors ) ); + + // Looping through out pixels + end = num_contributors; if ( polyphase ) end = numerator; + for (n = 0; n < end; n++) + { + int i; + int last_non_zero; + float out_pixel_center = (float)n + 0.5f; + float in_center_of_out = (out_pixel_center + out_shift) * inv_scale; + + int in_first_pixel, in_last_pixel; + + stbir__calculate_in_pixel_range( &in_first_pixel, &in_last_pixel, out_pixel_center, out_filter_radius, inv_scale, out_shift, input_size, edge ); + + // make sure we never generate a range larger than our precalculated coeff width + // this only happens in point sample mode, but it's a good safe thing to do anyway + if ( ( in_last_pixel - in_first_pixel + 1 ) > coefficient_width ) + in_last_pixel = in_first_pixel + coefficient_width - 1; + + last_non_zero = -1; + for (i = 0; i <= in_last_pixel - in_first_pixel; i++) + { + float in_pixel_center = (float)(i + in_first_pixel) + 0.5f; + float coeff = kernel(in_center_of_out - in_pixel_center, inv_scale, user_data); + + // kill denormals + if ( ( ( coeff < stbir__small_float ) && ( coeff > -stbir__small_float ) ) ) + { + if ( i == 0 ) // if we're at the front, just eat zero contributors + { + STBIR_ASSERT ( ( in_last_pixel - in_first_pixel ) != 0 ); // there should be at least one contrib + ++in_first_pixel; + i--; + continue; + } + coeff = 0; // make sure is fully zero (should keep denormals away) + } + else + last_non_zero = i; + + coefficient_group[i] = coeff; + } + + in_last_pixel = last_non_zero+in_first_pixel; // kills trailing zeros + contributors->n0 = in_first_pixel; + contributors->n1 = in_last_pixel; + + STBIR_ASSERT(contributors->n1 >= contributors->n0); + + ++contributors; + coefficient_group += coefficient_width; + } +} + +static void stbir__insert_coeff( stbir__contributors * contribs, float * coeffs, int new_pixel, float new_coeff, int max_width ) +{ + if ( contribs->n1 < contribs->n0 ) // this first clause should never happen, but handle in case + { + contribs->n0 = contribs->n1 = new_pixel; + coeffs[0] = new_coeff; + } + else if ( new_pixel <= contribs->n1 ) // before the end + { + if ( new_pixel < contribs->n0 ) // before the front? + { + if ( ( contribs->n1 - new_pixel + 1 ) <= max_width ) + { + int j, o = contribs->n0 - new_pixel; + for ( j = contribs->n1 - contribs->n0 ; j >= 0 ; j-- ) + coeffs[ j + o ] = coeffs[ j ]; + for ( j = 1 ; j < o ; j++ ) + coeffs[ j ] = 0; + coeffs[ 0 ] = new_coeff; + contribs->n0 = new_pixel; + } + } + else + { + // add new weight to existing coeff if already there + coeffs[ new_pixel - contribs->n0 ] += new_coeff; + } + } + else + { + if ( ( new_pixel - contribs->n0 + 1 ) <= max_width ) + { + int j, e = new_pixel - contribs->n0; + for( j = ( contribs->n1 - contribs->n0 ) + 1 ; j < e ; j++ ) // clear in-betweens coeffs if there are any + coeffs[j] = 0; + + coeffs[ e ] = new_coeff; + contribs->n1 = new_pixel; + } + } +} + +static void stbir__calculate_out_pixel_range( int * first_pixel, int * last_pixel, float in_pixel_center, float in_pixels_radius, float scale, float out_shift, int out_size ) +{ + float in_pixel_influence_lowerbound = in_pixel_center - in_pixels_radius; + float in_pixel_influence_upperbound = in_pixel_center + in_pixels_radius; + float out_pixel_influence_lowerbound = in_pixel_influence_lowerbound * scale - out_shift; + float out_pixel_influence_upperbound = in_pixel_influence_upperbound * scale - out_shift; + int out_first_pixel = (int)(STBIR_FLOORF(out_pixel_influence_lowerbound + 0.5f)); + int out_last_pixel = (int)(STBIR_FLOORF(out_pixel_influence_upperbound - 0.5f)); + + if ( out_first_pixel < 0 ) + out_first_pixel = 0; + if ( out_last_pixel >= out_size ) + out_last_pixel = out_size - 1; + *first_pixel = out_first_pixel; + *last_pixel = out_last_pixel; +} + +static void stbir__calculate_coefficients_for_gather_downsample( int start, int end, float in_pixels_radius, stbir__kernel_callback * kernel, stbir__scale_info * scale_info, int coefficient_width, int num_contributors, stbir__contributors * contributors, float * coefficient_group, void * user_data ) +{ + int in_pixel; + int i; + int first_out_inited = -1; + float scale = scale_info->scale; + float out_shift = scale_info->pixel_shift; + int out_size = scale_info->output_sub_size; + int numerator = scale_info->scale_numerator; + int polyphase = ( ( scale_info->scale_is_rational ) && ( numerator < out_size ) ); + + STBIR__UNUSED(num_contributors); + + // Loop through the input pixels + for (in_pixel = start; in_pixel < end; in_pixel++) + { + float in_pixel_center = (float)in_pixel + 0.5f; + float out_center_of_in = in_pixel_center * scale - out_shift; + int out_first_pixel, out_last_pixel; + + stbir__calculate_out_pixel_range( &out_first_pixel, &out_last_pixel, in_pixel_center, in_pixels_radius, scale, out_shift, out_size ); + + if ( out_first_pixel > out_last_pixel ) + continue; + + // clamp or exit if we are using polyphase filtering, and the limit is up + if ( polyphase ) + { + // when polyphase, you only have to do coeffs up to the numerator count + if ( out_first_pixel == numerator ) + break; + + // don't do any extra work, clamp last pixel at numerator too + if ( out_last_pixel >= numerator ) + out_last_pixel = numerator - 1; + } + + for (i = 0; i <= out_last_pixel - out_first_pixel; i++) + { + float out_pixel_center = (float)(i + out_first_pixel) + 0.5f; + float x = out_pixel_center - out_center_of_in; + float coeff = kernel(x, scale, user_data) * scale; + + // kill the coeff if it's too small (avoid denormals) + if ( ( ( coeff < stbir__small_float ) && ( coeff > -stbir__small_float ) ) ) + coeff = 0.0f; + + { + int out = i + out_first_pixel; + float * coeffs = coefficient_group + out * coefficient_width; + stbir__contributors * contribs = contributors + out; + + // is this the first time this output pixel has been seen? Init it. + if ( out > first_out_inited ) + { + STBIR_ASSERT( out == ( first_out_inited + 1 ) ); // ensure we have only advanced one at time + first_out_inited = out; + contribs->n0 = in_pixel; + contribs->n1 = in_pixel; + coeffs[0] = coeff; + } + else + { + // insert on end (always in order) + if ( coeffs[0] == 0.0f ) // if the first coefficent is zero, then zap it for this coeffs + { + STBIR_ASSERT( ( in_pixel - contribs->n0 ) == 1 ); // ensure that when we zap, we're at the 2nd pos + contribs->n0 = in_pixel; + } + contribs->n1 = in_pixel; + STBIR_ASSERT( ( in_pixel - contribs->n0 ) < coefficient_width ); + coeffs[in_pixel - contribs->n0] = coeff; + } + } + } + } +} + +#ifdef STBIR_RENORMALIZE_IN_FLOAT +#define STBIR_RENORM_TYPE float +#else +#define STBIR_RENORM_TYPE double +#endif + +static void stbir__cleanup_gathered_coefficients( stbir_edge edge, stbir__filter_extent_info* filter_info, stbir__scale_info * scale_info, int num_contributors, stbir__contributors* contributors, float * coefficient_group, int coefficient_width ) +{ + int input_size = scale_info->input_full_size; + int input_last_n1 = input_size - 1; + int n, end; + int lowest = 0x7fffffff; + int highest = -0x7fffffff; + int widest = -1; + int numerator = scale_info->scale_numerator; + int denominator = scale_info->scale_denominator; + int polyphase = ( ( scale_info->scale_is_rational ) && ( numerator < num_contributors ) ); + float * coeffs; + stbir__contributors * contribs; + + // weight all the coeffs for each sample + coeffs = coefficient_group; + contribs = contributors; + end = num_contributors; if ( polyphase ) end = numerator; + for (n = 0; n < end; n++) + { + int i; + STBIR_RENORM_TYPE filter_scale, total_filter = 0; + int e; + + // add all contribs + e = contribs->n1 - contribs->n0; + for( i = 0 ; i <= e ; i++ ) + { + total_filter += (STBIR_RENORM_TYPE) coeffs[i]; + STBIR_ASSERT( ( coeffs[i] >= -2.0f ) && ( coeffs[i] <= 2.0f ) ); // check for wonky weights + } + + // rescale + if ( ( total_filter < stbir__small_float ) && ( total_filter > -stbir__small_float ) ) + { + // all coeffs are extremely small, just zero it + contribs->n1 = contribs->n0; + coeffs[0] = 0.0f; + } + else + { + // if the total isn't 1.0, rescale everything + if ( ( total_filter < (1.0f-stbir__small_float) ) || ( total_filter > (1.0f+stbir__small_float) ) ) + { + filter_scale = ((STBIR_RENORM_TYPE)1.0) / total_filter; + + // scale them all + for (i = 0; i <= e; i++) + coeffs[i] = (float) ( coeffs[i] * filter_scale ); + } + } + ++contribs; + coeffs += coefficient_width; + } + + // if we have a rational for the scale, we can exploit the polyphaseness to not calculate + // most of the coefficients, so we copy them here + if ( polyphase ) + { + stbir__contributors * prev_contribs = contributors; + stbir__contributors * cur_contribs = contributors + numerator; + + for( n = numerator ; n < num_contributors ; n++ ) + { + cur_contribs->n0 = prev_contribs->n0 + denominator; + cur_contribs->n1 = prev_contribs->n1 + denominator; + ++cur_contribs; + ++prev_contribs; + } + stbir_overlapping_memcpy( coefficient_group + numerator * coefficient_width, coefficient_group, ( num_contributors - numerator ) * coefficient_width * sizeof( coeffs[ 0 ] ) ); + } + + coeffs = coefficient_group; + contribs = contributors; + + for (n = 0; n < num_contributors; n++) + { + int i; + + // in zero edge mode, just remove out of bounds contribs completely (since their weights are accounted for now) + if ( edge == STBIR_EDGE_ZERO ) + { + // shrink the right side if necessary + if ( contribs->n1 > input_last_n1 ) + contribs->n1 = input_last_n1; + + // shrink the left side + if ( contribs->n0 < 0 ) + { + int j, left, skips = 0; + + skips = -contribs->n0; + contribs->n0 = 0; + + // now move down the weights + left = contribs->n1 - contribs->n0 + 1; + if ( left > 0 ) + { + for( j = 0 ; j < left ; j++ ) + coeffs[ j ] = coeffs[ j + skips ]; + } + } + } + else if ( ( edge == STBIR_EDGE_CLAMP ) || ( edge == STBIR_EDGE_REFLECT ) ) + { + // for clamp and reflect, calculate the true inbounds position (based on edge type) and just add that to the existing weight + + // right hand side first + if ( contribs->n1 > input_last_n1 ) + { + int start = contribs->n0; + int endi = contribs->n1; + contribs->n1 = input_last_n1; + for( i = input_size; i <= endi; i++ ) + stbir__insert_coeff( contribs, coeffs, stbir__edge_wrap_slow[edge]( i, input_size ), coeffs[i-start], coefficient_width ); + } + + // now check left hand edge + if ( contribs->n0 < 0 ) + { + int save_n0; + float save_n0_coeff; + float * c = coeffs - ( contribs->n0 + 1 ); + + // reinsert the coeffs with it reflected or clamped (insert accumulates, if the coeffs exist) + for( i = -1 ; i > contribs->n0 ; i-- ) + stbir__insert_coeff( contribs, coeffs, stbir__edge_wrap_slow[edge]( i, input_size ), *c--, coefficient_width ); + save_n0 = contribs->n0; + save_n0_coeff = c[0]; // save it, since we didn't do the final one (i==n0), because there might be too many coeffs to hold (before we resize)! + + // now slide all the coeffs down (since we have accumulated them in the positive contribs) and reset the first contrib + contribs->n0 = 0; + for(i = 0 ; i <= contribs->n1 ; i++ ) + coeffs[i] = coeffs[i-save_n0]; + + // now that we have shrunk down the contribs, we insert the first one safely + stbir__insert_coeff( contribs, coeffs, stbir__edge_wrap_slow[edge]( save_n0, input_size ), save_n0_coeff, coefficient_width ); + } + } + + if ( contribs->n0 <= contribs->n1 ) + { + int diff = contribs->n1 - contribs->n0 + 1; + while ( diff && ( coeffs[ diff-1 ] == 0.0f ) ) + --diff; + + contribs->n1 = contribs->n0 + diff - 1; + + if ( contribs->n0 <= contribs->n1 ) + { + if ( contribs->n0 < lowest ) + lowest = contribs->n0; + if ( contribs->n1 > highest ) + highest = contribs->n1; + if ( diff > widest ) + widest = diff; + } + + // re-zero out unused coefficients (if any) + for( i = diff ; i < coefficient_width ; i++ ) + coeffs[i] = 0.0f; + } + + ++contribs; + coeffs += coefficient_width; + } + filter_info->lowest = lowest; + filter_info->highest = highest; + filter_info->widest = widest; +} + +#undef STBIR_RENORM_TYPE + +static int stbir__pack_coefficients( int num_contributors, stbir__contributors* contributors, float * coefficents, int coefficient_width, int widest, int row0, int row1 ) +{ + #define STBIR_MOVE_1( dest, src ) { STBIR_NO_UNROLL(dest); ((stbir_uint32*)(dest))[0] = ((stbir_uint32*)(src))[0]; } + #define STBIR_MOVE_2( dest, src ) { STBIR_NO_UNROLL(dest); ((stbir_uint64*)(dest))[0] = ((stbir_uint64*)(src))[0]; } + #ifdef STBIR_SIMD + #define STBIR_MOVE_4( dest, src ) { stbir__simdf t; STBIR_NO_UNROLL(dest); stbir__simdf_load( t, src ); stbir__simdf_store( dest, t ); } + #else + #define STBIR_MOVE_4( dest, src ) { STBIR_NO_UNROLL(dest); ((stbir_uint64*)(dest))[0] = ((stbir_uint64*)(src))[0]; ((stbir_uint64*)(dest))[1] = ((stbir_uint64*)(src))[1]; } + #endif + + int row_end = row1 + 1; + STBIR__UNUSED( row0 ); // only used in an assert + + if ( coefficient_width != widest ) + { + float * pc = coefficents; + float * coeffs = coefficents; + float * pc_end = coefficents + num_contributors * widest; + switch( widest ) + { + case 1: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_1( pc, coeffs ); + ++pc; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 2: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_2( pc, coeffs ); + pc += 2; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 3: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_2( pc, coeffs ); + STBIR_MOVE_1( pc+2, coeffs+2 ); + pc += 3; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 4: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + pc += 4; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 5: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_1( pc+4, coeffs+4 ); + pc += 5; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 6: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_2( pc+4, coeffs+4 ); + pc += 6; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 7: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_2( pc+4, coeffs+4 ); + STBIR_MOVE_1( pc+6, coeffs+6 ); + pc += 7; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 8: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_4( pc+4, coeffs+4 ); + pc += 8; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 9: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_4( pc+4, coeffs+4 ); + STBIR_MOVE_1( pc+8, coeffs+8 ); + pc += 9; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 10: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_4( pc+4, coeffs+4 ); + STBIR_MOVE_2( pc+8, coeffs+8 ); + pc += 10; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 11: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_4( pc+4, coeffs+4 ); + STBIR_MOVE_2( pc+8, coeffs+8 ); + STBIR_MOVE_1( pc+10, coeffs+10 ); + pc += 11; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + case 12: + STBIR_NO_UNROLL_LOOP_START + do { + STBIR_MOVE_4( pc, coeffs ); + STBIR_MOVE_4( pc+4, coeffs+4 ); + STBIR_MOVE_4( pc+8, coeffs+8 ); + pc += 12; + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + default: + STBIR_NO_UNROLL_LOOP_START + do { + float * copy_end = pc + widest - 4; + float * c = coeffs; + do { + STBIR_NO_UNROLL( pc ); + STBIR_MOVE_4( pc, c ); + pc += 4; + c += 4; + } while ( pc <= copy_end ); + copy_end += 4; + STBIR_NO_UNROLL_LOOP_START + while ( pc < copy_end ) + { + STBIR_MOVE_1( pc, c ); + ++pc; ++c; + } + coeffs += coefficient_width; + } while ( pc < pc_end ); + break; + } + } + + // some horizontal routines read one float off the end (which is then masked off), so put in a sentinel so we don't read an snan or denormal + coefficents[ widest * num_contributors ] = 8888.0f; + + // the minimum we might read for unrolled filters widths is 12. So, we need to + // make sure we never read outside the decode buffer, by possibly moving + // the sample area back into the scanline, and putting zeros weights first. + // we start on the right edge and check until we're well past the possible + // clip area (2*widest). + { + stbir__contributors * contribs = contributors + num_contributors - 1; + float * coeffs = coefficents + widest * ( num_contributors - 1 ); + + // go until no chance of clipping (this is usually less than 8 lops) + while ( ( contribs >= contributors ) && ( ( contribs->n0 + widest*2 ) >= row_end ) ) + { + // might we clip?? + if ( ( contribs->n0 + widest ) > row_end ) + { + int stop_range = widest; + + // if range is larger than 12, it will be handled by generic loops that can terminate on the exact length + // of this contrib n1, instead of a fixed widest amount - so calculate this + if ( widest > 12 ) + { + int mod; + + // how far will be read in the n_coeff loop (which depends on the widest count mod4); + mod = widest & 3; + stop_range = ( ( ( contribs->n1 - contribs->n0 + 1 ) - mod + 3 ) & ~3 ) + mod; + + // the n_coeff loops do a minimum amount of coeffs, so factor that in! + if ( stop_range < ( 8 + mod ) ) stop_range = 8 + mod; + } + + // now see if we still clip with the refined range + if ( ( contribs->n0 + stop_range ) > row_end ) + { + int new_n0 = row_end - stop_range; + int num = contribs->n1 - contribs->n0 + 1; + int backup = contribs->n0 - new_n0; + float * from_co = coeffs + num - 1; + float * to_co = from_co + backup; + + STBIR_ASSERT( ( new_n0 >= row0 ) && ( new_n0 < contribs->n0 ) ); + + // move the coeffs over + while( num ) + { + *to_co-- = *from_co--; + --num; + } + // zero new positions + while ( to_co >= coeffs ) + *to_co-- = 0; + // set new start point + contribs->n0 = new_n0; + if ( widest > 12 ) + { + int mod; + + // how far will be read in the n_coeff loop (which depends on the widest count mod4); + mod = widest & 3; + stop_range = ( ( ( contribs->n1 - contribs->n0 + 1 ) - mod + 3 ) & ~3 ) + mod; + + // the n_coeff loops do a minimum amount of coeffs, so factor that in! + if ( stop_range < ( 8 + mod ) ) stop_range = 8 + mod; + } + } + } + --contribs; + coeffs -= widest; + } + } + + return widest; + #undef STBIR_MOVE_1 + #undef STBIR_MOVE_2 + #undef STBIR_MOVE_4 +} + +static void stbir__calculate_filters( stbir__sampler * samp, stbir__sampler * other_axis_for_pivot, void * user_data STBIR_ONLY_PROFILE_BUILD_GET_INFO ) +{ + int n; + float scale = samp->scale_info.scale; + stbir__kernel_callback * kernel = samp->filter_kernel; + stbir__support_callback * support = samp->filter_support; + float inv_scale = samp->scale_info.inv_scale; + int input_full_size = samp->scale_info.input_full_size; + int gather_num_contributors = samp->num_contributors; + stbir__contributors* gather_contributors = samp->contributors; + float * gather_coeffs = samp->coefficients; + int gather_coefficient_width = samp->coefficient_width; + + switch ( samp->is_gather ) + { + case 1: // gather upsample + { + float out_pixels_radius = support(inv_scale,user_data) * scale; + + stbir__calculate_coefficients_for_gather_upsample( out_pixels_radius, kernel, &samp->scale_info, gather_num_contributors, gather_contributors, gather_coeffs, gather_coefficient_width, samp->edge, user_data ); + + STBIR_PROFILE_BUILD_START( cleanup ); + stbir__cleanup_gathered_coefficients( samp->edge, &samp->extent_info, &samp->scale_info, gather_num_contributors, gather_contributors, gather_coeffs, gather_coefficient_width ); + STBIR_PROFILE_BUILD_END( cleanup ); + } + break; + + case 0: // scatter downsample (only on vertical) + case 2: // gather downsample + { + float in_pixels_radius = support(scale,user_data) * inv_scale; + int filter_pixel_margin = samp->filter_pixel_margin; + int input_end = input_full_size + filter_pixel_margin; + + // if this is a scatter, we do a downsample gather to get the coeffs, and then pivot after + if ( !samp->is_gather ) + { + // check if we are using the same gather downsample on the horizontal as this vertical, + // if so, then we don't have to generate them, we can just pivot from the horizontal. + if ( other_axis_for_pivot ) + { + gather_contributors = other_axis_for_pivot->contributors; + gather_coeffs = other_axis_for_pivot->coefficients; + gather_coefficient_width = other_axis_for_pivot->coefficient_width; + gather_num_contributors = other_axis_for_pivot->num_contributors; + samp->extent_info.lowest = other_axis_for_pivot->extent_info.lowest; + samp->extent_info.highest = other_axis_for_pivot->extent_info.highest; + samp->extent_info.widest = other_axis_for_pivot->extent_info.widest; + goto jump_right_to_pivot; + } + + gather_contributors = samp->gather_prescatter_contributors; + gather_coeffs = samp->gather_prescatter_coefficients; + gather_coefficient_width = samp->gather_prescatter_coefficient_width; + gather_num_contributors = samp->gather_prescatter_num_contributors; + } + + stbir__calculate_coefficients_for_gather_downsample( -filter_pixel_margin, input_end, in_pixels_radius, kernel, &samp->scale_info, gather_coefficient_width, gather_num_contributors, gather_contributors, gather_coeffs, user_data ); + + STBIR_PROFILE_BUILD_START( cleanup ); + stbir__cleanup_gathered_coefficients( samp->edge, &samp->extent_info, &samp->scale_info, gather_num_contributors, gather_contributors, gather_coeffs, gather_coefficient_width ); + STBIR_PROFILE_BUILD_END( cleanup ); + + if ( !samp->is_gather ) + { + // if this is a scatter (vertical only), then we need to pivot the coeffs + stbir__contributors * scatter_contributors; + int highest_set; + + jump_right_to_pivot: + + STBIR_PROFILE_BUILD_START( pivot ); + + highest_set = (-filter_pixel_margin) - 1; + for (n = 0; n < gather_num_contributors; n++) + { + int k; + int gn0 = gather_contributors->n0, gn1 = gather_contributors->n1; + int scatter_coefficient_width = samp->coefficient_width; + float * scatter_coeffs = samp->coefficients + ( gn0 + filter_pixel_margin ) * scatter_coefficient_width; + float * g_coeffs = gather_coeffs; + scatter_contributors = samp->contributors + ( gn0 + filter_pixel_margin ); + + for (k = gn0 ; k <= gn1 ; k++ ) + { + float gc = *g_coeffs++; + + // skip zero and denormals - must skip zeros to avoid adding coeffs beyond scatter_coefficient_width + // (which happens when pivoting from horizontal, which might have dummy zeros) + if ( ( ( gc >= stbir__small_float ) || ( gc <= -stbir__small_float ) ) ) + { + if ( ( k > highest_set ) || ( scatter_contributors->n0 > scatter_contributors->n1 ) ) + { + { + // if we are skipping over several contributors, we need to clear the skipped ones + stbir__contributors * clear_contributors = samp->contributors + ( highest_set + filter_pixel_margin + 1); + while ( clear_contributors < scatter_contributors ) + { + clear_contributors->n0 = 0; + clear_contributors->n1 = -1; + ++clear_contributors; + } + } + scatter_contributors->n0 = n; + scatter_contributors->n1 = n; + scatter_coeffs[0] = gc; + highest_set = k; + } + else + { + stbir__insert_coeff( scatter_contributors, scatter_coeffs, n, gc, scatter_coefficient_width ); + } + STBIR_ASSERT( ( scatter_contributors->n1 - scatter_contributors->n0 + 1 ) <= scatter_coefficient_width ); + } + ++scatter_contributors; + scatter_coeffs += scatter_coefficient_width; + } + + ++gather_contributors; + gather_coeffs += gather_coefficient_width; + } + + // now clear any unset contribs + { + stbir__contributors * clear_contributors = samp->contributors + ( highest_set + filter_pixel_margin + 1); + stbir__contributors * end_contributors = samp->contributors + samp->num_contributors; + while ( clear_contributors < end_contributors ) + { + clear_contributors->n0 = 0; + clear_contributors->n1 = -1; + ++clear_contributors; + } + } + + STBIR_PROFILE_BUILD_END( pivot ); + } + } + break; + } +} + + +//======================================================================================================== +// scanline decoders and encoders + +#define stbir__coder_min_num 1 +#define STB_IMAGE_RESIZE_DO_CODERS +#include STBIR__HEADER_FILENAME + +#define stbir__decode_suffix BGRA +#define stbir__decode_swizzle +#define stbir__decode_order0 2 +#define stbir__decode_order1 1 +#define stbir__decode_order2 0 +#define stbir__decode_order3 3 +#define stbir__encode_order0 2 +#define stbir__encode_order1 1 +#define stbir__encode_order2 0 +#define stbir__encode_order3 3 +#define stbir__coder_min_num 4 +#define STB_IMAGE_RESIZE_DO_CODERS +#include STBIR__HEADER_FILENAME + +#define stbir__decode_suffix ARGB +#define stbir__decode_swizzle +#define stbir__decode_order0 1 +#define stbir__decode_order1 2 +#define stbir__decode_order2 3 +#define stbir__decode_order3 0 +#define stbir__encode_order0 3 +#define stbir__encode_order1 0 +#define stbir__encode_order2 1 +#define stbir__encode_order3 2 +#define stbir__coder_min_num 4 +#define STB_IMAGE_RESIZE_DO_CODERS +#include STBIR__HEADER_FILENAME + +#define stbir__decode_suffix ABGR +#define stbir__decode_swizzle +#define stbir__decode_order0 3 +#define stbir__decode_order1 2 +#define stbir__decode_order2 1 +#define stbir__decode_order3 0 +#define stbir__encode_order0 3 +#define stbir__encode_order1 2 +#define stbir__encode_order2 1 +#define stbir__encode_order3 0 +#define stbir__coder_min_num 4 +#define STB_IMAGE_RESIZE_DO_CODERS +#include STBIR__HEADER_FILENAME + +#define stbir__decode_suffix AR +#define stbir__decode_swizzle +#define stbir__decode_order0 1 +#define stbir__decode_order1 0 +#define stbir__decode_order2 3 +#define stbir__decode_order3 2 +#define stbir__encode_order0 1 +#define stbir__encode_order1 0 +#define stbir__encode_order2 3 +#define stbir__encode_order3 2 +#define stbir__coder_min_num 2 +#define STB_IMAGE_RESIZE_DO_CODERS +#include STBIR__HEADER_FILENAME + + +// fancy alpha means we expand to keep both premultipied and non-premultiplied color channels +static void stbir__fancy_alpha_weight_4ch( float * out_buffer, int width_times_channels ) +{ + float STBIR_STREAMOUT_PTR(*) out = out_buffer; + float const * end_decode = out_buffer + ( width_times_channels / 4 ) * 7; // decode buffer aligned to end of out_buffer + float STBIR_STREAMOUT_PTR(*) decode = (float*)end_decode - width_times_channels; + + // fancy alpha is stored internally as R G B A Rpm Gpm Bpm + + #ifdef STBIR_SIMD + + #ifdef STBIR_SIMD8 + decode += 16; + STBIR_NO_UNROLL_LOOP_START + while ( decode <= end_decode ) + { + stbir__simdf8 d0,d1,a0,a1,p0,p1; + STBIR_NO_UNROLL(decode); + stbir__simdf8_load( d0, decode-16 ); + stbir__simdf8_load( d1, decode-16+8 ); + stbir__simdf8_0123to33333333( a0, d0 ); + stbir__simdf8_0123to33333333( a1, d1 ); + stbir__simdf8_mult( p0, a0, d0 ); + stbir__simdf8_mult( p1, a1, d1 ); + stbir__simdf8_bot4s( a0, d0, p0 ); + stbir__simdf8_bot4s( a1, d1, p1 ); + stbir__simdf8_top4s( d0, d0, p0 ); + stbir__simdf8_top4s( d1, d1, p1 ); + stbir__simdf8_store ( out, a0 ); + stbir__simdf8_store ( out+7, d0 ); + stbir__simdf8_store ( out+14, a1 ); + stbir__simdf8_store ( out+21, d1 ); + decode += 16; + out += 28; + } + decode -= 16; + #else + decode += 8; + STBIR_NO_UNROLL_LOOP_START + while ( decode <= end_decode ) + { + stbir__simdf d0,a0,d1,a1,p0,p1; + STBIR_NO_UNROLL(decode); + stbir__simdf_load( d0, decode-8 ); + stbir__simdf_load( d1, decode-8+4 ); + stbir__simdf_0123to3333( a0, d0 ); + stbir__simdf_0123to3333( a1, d1 ); + stbir__simdf_mult( p0, a0, d0 ); + stbir__simdf_mult( p1, a1, d1 ); + stbir__simdf_store ( out, d0 ); + stbir__simdf_store ( out+4, p0 ); + stbir__simdf_store ( out+7, d1 ); + stbir__simdf_store ( out+7+4, p1 ); + decode += 8; + out += 14; + } + decode -= 8; + #endif + + // might be one last odd pixel + #ifdef STBIR_SIMD8 + STBIR_NO_UNROLL_LOOP_START + while ( decode < end_decode ) + #else + if ( decode < end_decode ) + #endif + { + stbir__simdf d,a,p; + STBIR_NO_UNROLL(decode); + stbir__simdf_load( d, decode ); + stbir__simdf_0123to3333( a, d ); + stbir__simdf_mult( p, a, d ); + stbir__simdf_store ( out, d ); + stbir__simdf_store ( out+4, p ); + decode += 4; + out += 7; + } + + #else + + while( decode < end_decode ) + { + float r = decode[0], g = decode[1], b = decode[2], alpha = decode[3]; + out[0] = r; + out[1] = g; + out[2] = b; + out[3] = alpha; + out[4] = r * alpha; + out[5] = g * alpha; + out[6] = b * alpha; + out += 7; + decode += 4; + } + + #endif +} + +static void stbir__fancy_alpha_weight_2ch( float * out_buffer, int width_times_channels ) +{ + float STBIR_STREAMOUT_PTR(*) out = out_buffer; + float const * end_decode = out_buffer + ( width_times_channels / 2 ) * 3; + float STBIR_STREAMOUT_PTR(*) decode = (float*)end_decode - width_times_channels; + + // for fancy alpha, turns into: [X A Xpm][X A Xpm],etc + + #ifdef STBIR_SIMD + + decode += 8; + if ( decode <= end_decode ) + { + STBIR_NO_UNROLL_LOOP_START + do { + #ifdef STBIR_SIMD8 + stbir__simdf8 d0,a0,p0; + STBIR_NO_UNROLL(decode); + stbir__simdf8_load( d0, decode-8 ); + stbir__simdf8_0123to11331133( p0, d0 ); + stbir__simdf8_0123to00220022( a0, d0 ); + stbir__simdf8_mult( p0, p0, a0 ); + + stbir__simdf_store2( out, stbir__if_simdf8_cast_to_simdf4( d0 ) ); + stbir__simdf_store( out+2, stbir__if_simdf8_cast_to_simdf4( p0 ) ); + stbir__simdf_store2h( out+3, stbir__if_simdf8_cast_to_simdf4( d0 ) ); + + stbir__simdf_store2( out+6, stbir__simdf8_gettop4( d0 ) ); + stbir__simdf_store( out+8, stbir__simdf8_gettop4( p0 ) ); + stbir__simdf_store2h( out+9, stbir__simdf8_gettop4( d0 ) ); + #else + stbir__simdf d0,a0,d1,a1,p0,p1; + STBIR_NO_UNROLL(decode); + stbir__simdf_load( d0, decode-8 ); + stbir__simdf_load( d1, decode-8+4 ); + stbir__simdf_0123to1133( p0, d0 ); + stbir__simdf_0123to1133( p1, d1 ); + stbir__simdf_0123to0022( a0, d0 ); + stbir__simdf_0123to0022( a1, d1 ); + stbir__simdf_mult( p0, p0, a0 ); + stbir__simdf_mult( p1, p1, a1 ); + + stbir__simdf_store2( out, d0 ); + stbir__simdf_store( out+2, p0 ); + stbir__simdf_store2h( out+3, d0 ); + + stbir__simdf_store2( out+6, d1 ); + stbir__simdf_store( out+8, p1 ); + stbir__simdf_store2h( out+9, d1 ); + #endif + decode += 8; + out += 12; + } while ( decode <= end_decode ); + } + decode -= 8; + #endif + + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode < end_decode ) + { + float x = decode[0], y = decode[1]; + STBIR_SIMD_NO_UNROLL(decode); + out[0] = x; + out[1] = y; + out[2] = x * y; + out += 3; + decode += 2; + } +} + +static void stbir__fancy_alpha_unweight_4ch( float * encode_buffer, int width_times_channels ) +{ + float STBIR_SIMD_STREAMOUT_PTR(*) encode = encode_buffer; + float STBIR_SIMD_STREAMOUT_PTR(*) input = encode_buffer; + float const * end_output = encode_buffer + width_times_channels; + + // fancy RGBA is stored internally as R G B A Rpm Gpm Bpm + + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float alpha = input[3]; +#ifdef STBIR_SIMD + stbir__simdf i,ia; + STBIR_SIMD_NO_UNROLL(encode); + if ( alpha < stbir__small_float ) + { + stbir__simdf_load( i, input ); + stbir__simdf_store( encode, i ); + } + else + { + stbir__simdf_load1frep4( ia, 1.0f / alpha ); + stbir__simdf_load( i, input+4 ); + stbir__simdf_mult( i, i, ia ); + stbir__simdf_store( encode, i ); + encode[3] = alpha; + } +#else + if ( alpha < stbir__small_float ) + { + encode[0] = input[0]; + encode[1] = input[1]; + encode[2] = input[2]; + } + else + { + float ialpha = 1.0f / alpha; + encode[0] = input[4] * ialpha; + encode[1] = input[5] * ialpha; + encode[2] = input[6] * ialpha; + } + encode[3] = alpha; +#endif + + input += 7; + encode += 4; + } while ( encode < end_output ); +} + +// format: [X A Xpm][X A Xpm] etc +static void stbir__fancy_alpha_unweight_2ch( float * encode_buffer, int width_times_channels ) +{ + float STBIR_SIMD_STREAMOUT_PTR(*) encode = encode_buffer; + float STBIR_SIMD_STREAMOUT_PTR(*) input = encode_buffer; + float const * end_output = encode_buffer + width_times_channels; + + do { + float alpha = input[1]; + encode[0] = input[0]; + if ( alpha >= stbir__small_float ) + encode[0] = input[2] / alpha; + encode[1] = alpha; + + input += 3; + encode += 2; + } while ( encode < end_output ); +} + +static void stbir__simple_alpha_weight_4ch( float * decode_buffer, int width_times_channels ) +{ + float STBIR_STREAMOUT_PTR(*) decode = decode_buffer; + float const * end_decode = decode_buffer + width_times_channels; + + #ifdef STBIR_SIMD + { + decode += 2 * stbir__simdfX_float_count; + STBIR_NO_UNROLL_LOOP_START + while ( decode <= end_decode ) + { + stbir__simdfX d0,a0,d1,a1; + STBIR_NO_UNROLL(decode); + stbir__simdfX_load( d0, decode-2*stbir__simdfX_float_count ); + stbir__simdfX_load( d1, decode-2*stbir__simdfX_float_count+stbir__simdfX_float_count ); + stbir__simdfX_aaa1( a0, d0, STBIR_onesX ); + stbir__simdfX_aaa1( a1, d1, STBIR_onesX ); + stbir__simdfX_mult( d0, d0, a0 ); + stbir__simdfX_mult( d1, d1, a1 ); + stbir__simdfX_store ( decode-2*stbir__simdfX_float_count, d0 ); + stbir__simdfX_store ( decode-2*stbir__simdfX_float_count+stbir__simdfX_float_count, d1 ); + decode += 2 * stbir__simdfX_float_count; + } + decode -= 2 * stbir__simdfX_float_count; + + // few last pixels remnants + #ifdef STBIR_SIMD8 + STBIR_NO_UNROLL_LOOP_START + while ( decode < end_decode ) + #else + if ( decode < end_decode ) + #endif + { + stbir__simdf d,a; + stbir__simdf_load( d, decode ); + stbir__simdf_aaa1( a, d, STBIR__CONSTF(STBIR_ones) ); + stbir__simdf_mult( d, d, a ); + stbir__simdf_store ( decode, d ); + decode += 4; + } + } + + #else + + while( decode < end_decode ) + { + float alpha = decode[3]; + decode[0] *= alpha; + decode[1] *= alpha; + decode[2] *= alpha; + decode += 4; + } + + #endif +} + +static void stbir__simple_alpha_weight_2ch( float * decode_buffer, int width_times_channels ) +{ + float STBIR_STREAMOUT_PTR(*) decode = decode_buffer; + float const * end_decode = decode_buffer + width_times_channels; + + #ifdef STBIR_SIMD + decode += 2 * stbir__simdfX_float_count; + STBIR_NO_UNROLL_LOOP_START + while ( decode <= end_decode ) + { + stbir__simdfX d0,a0,d1,a1; + STBIR_NO_UNROLL(decode); + stbir__simdfX_load( d0, decode-2*stbir__simdfX_float_count ); + stbir__simdfX_load( d1, decode-2*stbir__simdfX_float_count+stbir__simdfX_float_count ); + stbir__simdfX_a1a1( a0, d0, STBIR_onesX ); + stbir__simdfX_a1a1( a1, d1, STBIR_onesX ); + stbir__simdfX_mult( d0, d0, a0 ); + stbir__simdfX_mult( d1, d1, a1 ); + stbir__simdfX_store ( decode-2*stbir__simdfX_float_count, d0 ); + stbir__simdfX_store ( decode-2*stbir__simdfX_float_count+stbir__simdfX_float_count, d1 ); + decode += 2 * stbir__simdfX_float_count; + } + decode -= 2 * stbir__simdfX_float_count; + #endif + + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode < end_decode ) + { + float alpha = decode[1]; + STBIR_SIMD_NO_UNROLL(decode); + decode[0] *= alpha; + decode += 2; + } +} + +static void stbir__simple_alpha_unweight_4ch( float * encode_buffer, int width_times_channels ) +{ + float STBIR_SIMD_STREAMOUT_PTR(*) encode = encode_buffer; + float const * end_output = encode_buffer + width_times_channels; + + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float alpha = encode[3]; + +#ifdef STBIR_SIMD + stbir__simdf i,ia; + STBIR_SIMD_NO_UNROLL(encode); + if ( alpha >= stbir__small_float ) + { + stbir__simdf_load1frep4( ia, 1.0f / alpha ); + stbir__simdf_load( i, encode ); + stbir__simdf_mult( i, i, ia ); + stbir__simdf_store( encode, i ); + encode[3] = alpha; + } +#else + if ( alpha >= stbir__small_float ) + { + float ialpha = 1.0f / alpha; + encode[0] *= ialpha; + encode[1] *= ialpha; + encode[2] *= ialpha; + } +#endif + encode += 4; + } while ( encode < end_output ); +} + +static void stbir__simple_alpha_unweight_2ch( float * encode_buffer, int width_times_channels ) +{ + float STBIR_SIMD_STREAMOUT_PTR(*) encode = encode_buffer; + float const * end_output = encode_buffer + width_times_channels; + + do { + float alpha = encode[1]; + if ( alpha >= stbir__small_float ) + encode[0] /= alpha; + encode += 2; + } while ( encode < end_output ); +} + + +// only used in RGB->BGR or BGR->RGB +static void stbir__simple_flip_3ch( float * decode_buffer, int width_times_channels ) +{ + float STBIR_STREAMOUT_PTR(*) decode = decode_buffer; + float const * end_decode = decode_buffer + width_times_channels; + +#ifdef STBIR_SIMD + #ifdef stbir__simdf_swiz2 // do we have two argument swizzles? + end_decode -= 12; + STBIR_NO_UNROLL_LOOP_START + while( decode <= end_decode ) + { + // on arm64 8 instructions, no overlapping stores + stbir__simdf a,b,c,na,nb; + STBIR_SIMD_NO_UNROLL(decode); + stbir__simdf_load( a, decode ); + stbir__simdf_load( b, decode+4 ); + stbir__simdf_load( c, decode+8 ); + + na = stbir__simdf_swiz2( a, b, 2, 1, 0, 5 ); + b = stbir__simdf_swiz2( a, b, 4, 3, 6, 7 ); + nb = stbir__simdf_swiz2( b, c, 0, 1, 4, 3 ); + c = stbir__simdf_swiz2( b, c, 2, 7, 6, 5 ); + + stbir__simdf_store( decode, na ); + stbir__simdf_store( decode+4, nb ); + stbir__simdf_store( decode+8, c ); + decode += 12; + } + end_decode += 12; + #else + end_decode -= 24; + STBIR_NO_UNROLL_LOOP_START + while( decode <= end_decode ) + { + // 26 instructions on x64 + stbir__simdf a,b,c,d,e,f,g; + float i21, i23; + STBIR_SIMD_NO_UNROLL(decode); + stbir__simdf_load( a, decode ); + stbir__simdf_load( b, decode+3 ); + stbir__simdf_load( c, decode+6 ); + stbir__simdf_load( d, decode+9 ); + stbir__simdf_load( e, decode+12 ); + stbir__simdf_load( f, decode+15 ); + stbir__simdf_load( g, decode+18 ); + + a = stbir__simdf_swiz( a, 2, 1, 0, 3 ); + b = stbir__simdf_swiz( b, 2, 1, 0, 3 ); + c = stbir__simdf_swiz( c, 2, 1, 0, 3 ); + d = stbir__simdf_swiz( d, 2, 1, 0, 3 ); + e = stbir__simdf_swiz( e, 2, 1, 0, 3 ); + f = stbir__simdf_swiz( f, 2, 1, 0, 3 ); + g = stbir__simdf_swiz( g, 2, 1, 0, 3 ); + + // stores overlap, need to be in order, + stbir__simdf_store( decode, a ); + i21 = decode[21]; + stbir__simdf_store( decode+3, b ); + i23 = decode[23]; + stbir__simdf_store( decode+6, c ); + stbir__simdf_store( decode+9, d ); + stbir__simdf_store( decode+12, e ); + stbir__simdf_store( decode+15, f ); + stbir__simdf_store( decode+18, g ); + decode[21] = i23; + decode[23] = i21; + decode += 24; + } + end_decode += 24; + #endif +#else + end_decode -= 12; + STBIR_NO_UNROLL_LOOP_START + while( decode <= end_decode ) + { + // 16 instructions + float t0,t1,t2,t3; + STBIR_NO_UNROLL(decode); + t0 = decode[0]; t1 = decode[3]; t2 = decode[6]; t3 = decode[9]; + decode[0] = decode[2]; decode[3] = decode[5]; decode[6] = decode[8]; decode[9] = decode[11]; + decode[2] = t0; decode[5] = t1; decode[8] = t2; decode[11] = t3; + decode += 12; + } + end_decode += 12; +#endif + + STBIR_NO_UNROLL_LOOP_START + while( decode < end_decode ) + { + float t = decode[0]; + STBIR_NO_UNROLL(decode); + decode[0] = decode[2]; + decode[2] = t; + decode += 3; + } +} + + + +static void stbir__decode_scanline(stbir__info const * stbir_info, int n, float * output_buffer STBIR_ONLY_PROFILE_GET_SPLIT_INFO ) +{ + int channels = stbir_info->channels; + int effective_channels = stbir_info->effective_channels; + int input_sample_in_bytes = stbir__type_size[stbir_info->input_type] * channels; + stbir_edge edge_horizontal = stbir_info->horizontal.edge; + stbir_edge edge_vertical = stbir_info->vertical.edge; + int row = stbir__edge_wrap(edge_vertical, n, stbir_info->vertical.scale_info.input_full_size); + const void* input_plane_data = ( (char *) stbir_info->input_data ) + (size_t)row * (size_t) stbir_info->input_stride_bytes; + stbir__span const * spans = stbir_info->scanline_extents.spans; + float * full_decode_buffer = output_buffer - stbir_info->scanline_extents.conservative.n0 * effective_channels; + float * last_decoded = 0; + + // if we are on edge_zero, and we get in here with an out of bounds n, then the calculate filters has failed + STBIR_ASSERT( !(edge_vertical == STBIR_EDGE_ZERO && (n < 0 || n >= stbir_info->vertical.scale_info.input_full_size)) ); + + do + { + float * decode_buffer; + void const * input_data; + float * end_decode; + int width_times_channels; + int width; + + if ( spans->n1 < spans->n0 ) + break; + + width = spans->n1 + 1 - spans->n0; + decode_buffer = full_decode_buffer + spans->n0 * effective_channels; + end_decode = full_decode_buffer + ( spans->n1 + 1 ) * effective_channels; + width_times_channels = width * channels; + + // read directly out of input plane by default + input_data = ( (char*)input_plane_data ) + spans->pixel_offset_for_input * input_sample_in_bytes; + + // if we have an input callback, call it to get the input data + if ( stbir_info->in_pixels_cb ) + { + // call the callback with a temp buffer (that they can choose to use or not). the temp is just right aligned memory in the decode_buffer itself + input_data = stbir_info->in_pixels_cb( ( (char*) end_decode ) - ( width * input_sample_in_bytes ) + ( ( stbir_info->input_type != STBIR_TYPE_FLOAT ) ? ( sizeof(float)*STBIR_INPUT_CALLBACK_PADDING ) : 0 ), input_plane_data, width, spans->pixel_offset_for_input, row, stbir_info->user_data ); + } + + STBIR_PROFILE_START( decode ); + // convert the pixels info the float decode_buffer, (we index from end_decode, so that when channelsdecode_pixels( (float*)end_decode - width_times_channels, width_times_channels, input_data ); + STBIR_PROFILE_END( decode ); + + if (stbir_info->alpha_weight) + { + STBIR_PROFILE_START( alpha ); + stbir_info->alpha_weight( decode_buffer, width_times_channels ); + STBIR_PROFILE_END( alpha ); + } + + ++spans; + } while ( spans <= ( &stbir_info->scanline_extents.spans[1] ) ); + + // handle the edge_wrap filter (all other types are handled back out at the calculate_filter stage) + // basically the idea here is that if we have the whole scanline in memory, we don't redecode the + // wrapped edge pixels, and instead just memcpy them from the scanline into the edge positions + if ( ( edge_horizontal == STBIR_EDGE_WRAP ) && ( stbir_info->scanline_extents.edge_sizes[0] | stbir_info->scanline_extents.edge_sizes[1] ) ) + { + // this code only runs if we're in edge_wrap, and we're doing the entire scanline + int e, start_x[2]; + int input_full_size = stbir_info->horizontal.scale_info.input_full_size; + + start_x[0] = -stbir_info->scanline_extents.edge_sizes[0]; // left edge start x + start_x[1] = input_full_size; // right edge + + for( e = 0; e < 2 ; e++ ) + { + // do each margin + int margin = stbir_info->scanline_extents.edge_sizes[e]; + if ( margin ) + { + int x = start_x[e]; + float * marg = full_decode_buffer + x * effective_channels; + float const * src = full_decode_buffer + stbir__edge_wrap(edge_horizontal, x, input_full_size) * effective_channels; + STBIR_MEMCPY( marg, src, margin * effective_channels * sizeof(float) ); + if ( e == 1 ) last_decoded = marg + margin * effective_channels; + } + } + } + + // some of the horizontal gathers read one float off the edge (which is masked out), but we force a zero here to make sure no NaNs leak in + // (we can't pre-zero it, because the input callback can use that area as padding) + last_decoded[0] = 0.0f; + + // we clear this extra float, because the final output pixel filter kernel might have used one less coeff than the max filter width + // when this happens, we do read that pixel from the input, so it too could be Nan, so just zero an extra one. + // this fits because each scanline is padded by three floats (STBIR_INPUT_CALLBACK_PADDING) + last_decoded[1] = 0.0f; +} + + +//================= +// Do 1 channel horizontal routines + +#ifdef STBIR_SIMD + +#define stbir__1_coeff_only() \ + stbir__simdf tot,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1( c, hc ); \ + stbir__simdf_mult1_mem( tot, c, decode ); + +#define stbir__2_coeff_only() \ + stbir__simdf tot,c,d; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2z( c, hc ); \ + stbir__simdf_load2( d, decode ); \ + stbir__simdf_mult( tot, c, d ); \ + stbir__simdf_0123to1230( c, tot ); \ + stbir__simdf_add1( tot, tot, c ); + +#define stbir__3_coeff_only() \ + stbir__simdf tot,c,t; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( c, hc ); \ + stbir__simdf_mult_mem( tot, c, decode ); \ + stbir__simdf_0123to1230( c, tot ); \ + stbir__simdf_0123to2301( t, tot ); \ + stbir__simdf_add1( tot, tot, c ); \ + stbir__simdf_add1( tot, tot, t ); + +#define stbir__store_output_tiny() \ + stbir__simdf_store1( output, tot ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 1; + +#define stbir__4_coeff_start() \ + stbir__simdf tot,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( c, hc ); \ + stbir__simdf_mult_mem( tot, c, decode ); \ + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( c, hc + (ofs) ); \ + stbir__simdf_madd_mem( tot, tot, c, decode+(ofs) ); + +#define stbir__1_coeff_remnant( ofs ) \ + { stbir__simdf d; \ + stbir__simdf_load1z( c, hc + (ofs) ); \ + stbir__simdf_load1( d, decode + (ofs) ); \ + stbir__simdf_madd( tot, tot, d, c ); } + +#define stbir__2_coeff_remnant( ofs ) \ + { stbir__simdf d; \ + stbir__simdf_load2z( c, hc+(ofs) ); \ + stbir__simdf_load2( d, decode+(ofs) ); \ + stbir__simdf_madd( tot, tot, d, c ); } + +#define stbir__3_coeff_setup() \ + stbir__simdf mask; \ + stbir__simdf_load( mask, STBIR_mask + 3 ); + +#define stbir__3_coeff_remnant( ofs ) \ + stbir__simdf_load( c, hc+(ofs) ); \ + stbir__simdf_and( c, c, mask ); \ + stbir__simdf_madd_mem( tot, tot, c, decode+(ofs) ); + +#define stbir__store_output() \ + stbir__simdf_0123to2301( c, tot ); \ + stbir__simdf_add( tot, tot, c ); \ + stbir__simdf_0123to1230( c, tot ); \ + stbir__simdf_add1( tot, tot, c ); \ + stbir__simdf_store1( output, tot ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 1; + +#else + +#define stbir__1_coeff_only() \ + float tot; \ + tot = decode[0]*hc[0]; + +#define stbir__2_coeff_only() \ + float tot; \ + tot = decode[0] * hc[0]; \ + tot += decode[1] * hc[1]; + +#define stbir__3_coeff_only() \ + float tot; \ + tot = decode[0] * hc[0]; \ + tot += decode[1] * hc[1]; \ + tot += decode[2] * hc[2]; + +#define stbir__store_output_tiny() \ + output[0] = tot; \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 1; + +#define stbir__4_coeff_start() \ + float tot0,tot1,tot2,tot3; \ + tot0 = decode[0] * hc[0]; \ + tot1 = decode[1] * hc[1]; \ + tot2 = decode[2] * hc[2]; \ + tot3 = decode[3] * hc[3]; + +#define stbir__4_coeff_continue_from_4( ofs ) \ + tot0 += decode[0+(ofs)] * hc[0+(ofs)]; \ + tot1 += decode[1+(ofs)] * hc[1+(ofs)]; \ + tot2 += decode[2+(ofs)] * hc[2+(ofs)]; \ + tot3 += decode[3+(ofs)] * hc[3+(ofs)]; + +#define stbir__1_coeff_remnant( ofs ) \ + tot0 += decode[0+(ofs)] * hc[0+(ofs)]; + +#define stbir__2_coeff_remnant( ofs ) \ + tot0 += decode[0+(ofs)] * hc[0+(ofs)]; \ + tot1 += decode[1+(ofs)] * hc[1+(ofs)]; \ + +#define stbir__3_coeff_remnant( ofs ) \ + tot0 += decode[0+(ofs)] * hc[0+(ofs)]; \ + tot1 += decode[1+(ofs)] * hc[1+(ofs)]; \ + tot2 += decode[2+(ofs)] * hc[2+(ofs)]; + +#define stbir__store_output() \ + output[0] = (tot0+tot2)+(tot1+tot3); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 1; + +#endif + +#define STBIR__horizontal_channels 1 +#define STB_IMAGE_RESIZE_DO_HORIZONTALS +#include STBIR__HEADER_FILENAME + + +//================= +// Do 2 channel horizontal routines + +#ifdef STBIR_SIMD + +#define stbir__1_coeff_only() \ + stbir__simdf tot,c,d; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1z( c, hc ); \ + stbir__simdf_0123to0011( c, c ); \ + stbir__simdf_load2( d, decode ); \ + stbir__simdf_mult( tot, d, c ); + +#define stbir__2_coeff_only() \ + stbir__simdf tot,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2( c, hc ); \ + stbir__simdf_0123to0011( c, c ); \ + stbir__simdf_mult_mem( tot, c, decode ); + +#define stbir__3_coeff_only() \ + stbir__simdf tot,c,cs,d; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0011( c, cs ); \ + stbir__simdf_mult_mem( tot, c, decode ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_load2z( d, decode+4 ); \ + stbir__simdf_madd( tot, tot, d, c ); + +#define stbir__store_output_tiny() \ + stbir__simdf_0123to2301( c, tot ); \ + stbir__simdf_add( tot, tot, c ); \ + stbir__simdf_store2( output, tot ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 2; + +#ifdef STBIR_SIMD8 + +#define stbir__4_coeff_start() \ + stbir__simdf8 tot0,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc ); \ + stbir__simdf8_0123to00112233( c, cs ); \ + stbir__simdf8_mult_mem( tot0, c, decode ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00112233( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*2 ); + +#define stbir__1_coeff_remnant( ofs ) \ + { stbir__simdf t,d; \ + stbir__simdf_load1z( t, hc + (ofs) ); \ + stbir__simdf_load2( d, decode + (ofs) * 2 ); \ + stbir__simdf_0123to0011( t, t ); \ + stbir__simdf_mult( t, t, d ); \ + stbir__simdf8_add4( tot0, tot0, t ); } + +#define stbir__2_coeff_remnant( ofs ) \ + { stbir__simdf t; \ + stbir__simdf_load2( t, hc + (ofs) ); \ + stbir__simdf_0123to0011( t, t ); \ + stbir__simdf_mult_mem( t, t, decode+(ofs)*2 ); \ + stbir__simdf8_add4( tot0, tot0, t ); } + +#define stbir__3_coeff_remnant( ofs ) \ + { stbir__simdf8 d; \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00112233( c, cs ); \ + stbir__simdf8_load6z( d, decode+(ofs)*2 ); \ + stbir__simdf8_madd( tot0, tot0, c, d ); } + +#define stbir__store_output() \ + { stbir__simdf t,d; \ + stbir__simdf8_add4halves( t, stbir__if_simdf8_cast_to_simdf4(tot0), tot0 ); \ + stbir__simdf_0123to2301( d, t ); \ + stbir__simdf_add( t, t, d ); \ + stbir__simdf_store2( output, t ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 2; } + +#else + +#define stbir__4_coeff_start() \ + stbir__simdf tot0,tot1,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0011( c, cs ); \ + stbir__simdf_mult_mem( tot0, c, decode ); \ + stbir__simdf_0123to2233( c, cs ); \ + stbir__simdf_mult_mem( tot1, c, decode+4 ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0011( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*2 ); \ + stbir__simdf_0123to2233( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*2+4 ); + +#define stbir__1_coeff_remnant( ofs ) \ + { stbir__simdf d; \ + stbir__simdf_load1z( cs, hc + (ofs) ); \ + stbir__simdf_0123to0011( c, cs ); \ + stbir__simdf_load2( d, decode + (ofs) * 2 ); \ + stbir__simdf_madd( tot0, tot0, d, c ); } + +#define stbir__2_coeff_remnant( ofs ) \ + stbir__simdf_load2( cs, hc + (ofs) ); \ + stbir__simdf_0123to0011( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*2 ); + +#define stbir__3_coeff_remnant( ofs ) \ + { stbir__simdf d; \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0011( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*2 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_load2z( d, decode + (ofs) * 2 + 4 ); \ + stbir__simdf_madd( tot1, tot1, d, c ); } + +#define stbir__store_output() \ + stbir__simdf_add( tot0, tot0, tot1 ); \ + stbir__simdf_0123to2301( c, tot0 ); \ + stbir__simdf_add( tot0, tot0, c ); \ + stbir__simdf_store2( output, tot0 ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 2; + +#endif + +#else + +#define stbir__1_coeff_only() \ + float tota,totb,c; \ + c = hc[0]; \ + tota = decode[0]*c; \ + totb = decode[1]*c; + +#define stbir__2_coeff_only() \ + float tota,totb,c; \ + c = hc[0]; \ + tota = decode[0]*c; \ + totb = decode[1]*c; \ + c = hc[1]; \ + tota += decode[2]*c; \ + totb += decode[3]*c; + +// this weird order of add matches the simd +#define stbir__3_coeff_only() \ + float tota,totb,c; \ + c = hc[0]; \ + tota = decode[0]*c; \ + totb = decode[1]*c; \ + c = hc[2]; \ + tota += decode[4]*c; \ + totb += decode[5]*c; \ + c = hc[1]; \ + tota += decode[2]*c; \ + totb += decode[3]*c; + +#define stbir__store_output_tiny() \ + output[0] = tota; \ + output[1] = totb; \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 2; + +#define stbir__4_coeff_start() \ + float tota0,tota1,tota2,tota3,totb0,totb1,totb2,totb3,c; \ + c = hc[0]; \ + tota0 = decode[0]*c; \ + totb0 = decode[1]*c; \ + c = hc[1]; \ + tota1 = decode[2]*c; \ + totb1 = decode[3]*c; \ + c = hc[2]; \ + tota2 = decode[4]*c; \ + totb2 = decode[5]*c; \ + c = hc[3]; \ + tota3 = decode[6]*c; \ + totb3 = decode[7]*c; + +#define stbir__4_coeff_continue_from_4( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*2]*c; \ + totb0 += decode[1+(ofs)*2]*c; \ + c = hc[1+(ofs)]; \ + tota1 += decode[2+(ofs)*2]*c; \ + totb1 += decode[3+(ofs)*2]*c; \ + c = hc[2+(ofs)]; \ + tota2 += decode[4+(ofs)*2]*c; \ + totb2 += decode[5+(ofs)*2]*c; \ + c = hc[3+(ofs)]; \ + tota3 += decode[6+(ofs)*2]*c; \ + totb3 += decode[7+(ofs)*2]*c; + +#define stbir__1_coeff_remnant( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*2] * c; \ + totb0 += decode[1+(ofs)*2] * c; + +#define stbir__2_coeff_remnant( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*2] * c; \ + totb0 += decode[1+(ofs)*2] * c; \ + c = hc[1+(ofs)]; \ + tota1 += decode[2+(ofs)*2] * c; \ + totb1 += decode[3+(ofs)*2] * c; + +#define stbir__3_coeff_remnant( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*2] * c; \ + totb0 += decode[1+(ofs)*2] * c; \ + c = hc[1+(ofs)]; \ + tota1 += decode[2+(ofs)*2] * c; \ + totb1 += decode[3+(ofs)*2] * c; \ + c = hc[2+(ofs)]; \ + tota2 += decode[4+(ofs)*2] * c; \ + totb2 += decode[5+(ofs)*2] * c; + +#define stbir__store_output() \ + output[0] = (tota0+tota2)+(tota1+tota3); \ + output[1] = (totb0+totb2)+(totb1+totb3); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 2; + +#endif + +#define STBIR__horizontal_channels 2 +#define STB_IMAGE_RESIZE_DO_HORIZONTALS +#include STBIR__HEADER_FILENAME + + +//================= +// Do 3 channel horizontal routines + +#ifdef STBIR_SIMD + +#define stbir__1_coeff_only() \ + stbir__simdf tot,c,d; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1z( c, hc ); \ + stbir__simdf_0123to0001( c, c ); \ + stbir__simdf_load( d, decode ); \ + stbir__simdf_mult( tot, d, c ); + +#define stbir__2_coeff_only() \ + stbir__simdf tot,c,cs,d; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_load( d, decode ); \ + stbir__simdf_mult( tot, d, c ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_load( d, decode+3 ); \ + stbir__simdf_madd( tot, tot, d, c ); + +#define stbir__3_coeff_only() \ + stbir__simdf tot,c,d,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_load( d, decode ); \ + stbir__simdf_mult( tot, d, c ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_load( d, decode+3 ); \ + stbir__simdf_madd( tot, tot, d, c ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_load( d, decode+6 ); \ + stbir__simdf_madd( tot, tot, d, c ); + +#define stbir__store_output_tiny() \ + stbir__simdf_store2( output, tot ); \ + stbir__simdf_0123to2301( tot, tot ); \ + stbir__simdf_store1( output+2, tot ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 3; + +#ifdef STBIR_SIMD8 + +// we're loading from the XXXYYY decode by -1 to get the XXXYYY into different halves of the AVX reg fyi +#define stbir__4_coeff_start() \ + stbir__simdf8 tot0,tot1,c,cs; stbir__simdf t; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc ); \ + stbir__simdf8_0123to00001111( c, cs ); \ + stbir__simdf8_mult_mem( tot0, c, decode - 1 ); \ + stbir__simdf8_0123to22223333( c, cs ); \ + stbir__simdf8_mult_mem( tot1, c, decode+6 - 1 ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00001111( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*3 - 1 ); \ + stbir__simdf8_0123to22223333( c, cs ); \ + stbir__simdf8_madd_mem( tot1, tot1, c, decode+(ofs)*3 + 6 - 1 ); + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1rep4( t, hc + (ofs) ); \ + stbir__simdf8_madd_mem4( tot0, tot0, t, decode+(ofs)*3 - 1 ); + +#define stbir__2_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) - 2 ); \ + stbir__simdf8_0123to22223333( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*3 - 1 ); + + #define stbir__3_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00001111( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*3 - 1 ); \ + stbir__simdf8_0123to2222( t, cs ); \ + stbir__simdf8_madd_mem4( tot1, tot1, t, decode+(ofs)*3 + 6 - 1 ); + +#define stbir__store_output() \ + stbir__simdf8_add( tot0, tot0, tot1 ); \ + stbir__simdf_0123to1230( t, stbir__if_simdf8_cast_to_simdf4( tot0 ) ); \ + stbir__simdf8_add4halves( t, t, tot0 ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 3; \ + if ( output < output_end ) \ + { \ + stbir__simdf_store( output-3, t ); \ + continue; \ + } \ + { stbir__simdf tt; stbir__simdf_0123to2301( tt, t ); \ + stbir__simdf_store2( output-3, t ); \ + stbir__simdf_store1( output+2-3, tt ); } \ + break; + + +#else + +#define stbir__4_coeff_start() \ + stbir__simdf tot0,tot1,tot2,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0001( c, cs ); \ + stbir__simdf_mult_mem( tot0, c, decode ); \ + stbir__simdf_0123to1122( c, cs ); \ + stbir__simdf_mult_mem( tot1, c, decode+4 ); \ + stbir__simdf_0123to2333( c, cs ); \ + stbir__simdf_mult_mem( tot2, c, decode+8 ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0001( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*3 ); \ + stbir__simdf_0123to1122( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*3+4 ); \ + stbir__simdf_0123to2333( c, cs ); \ + stbir__simdf_madd_mem( tot2, tot2, c, decode+(ofs)*3+8 ); + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1z( c, hc + (ofs) ); \ + stbir__simdf_0123to0001( c, c ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*3 ); + +#define stbir__2_coeff_remnant( ofs ) \ + { stbir__simdf d; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2z( cs, hc + (ofs) ); \ + stbir__simdf_0123to0001( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*3 ); \ + stbir__simdf_0123to1122( c, cs ); \ + stbir__simdf_load2z( d, decode+(ofs)*3+4 ); \ + stbir__simdf_madd( tot1, tot1, c, d ); } + +#define stbir__3_coeff_remnant( ofs ) \ + { stbir__simdf d; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0001( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*3 ); \ + stbir__simdf_0123to1122( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*3+4 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_load1z( d, decode+(ofs)*3+8 ); \ + stbir__simdf_madd( tot2, tot2, c, d ); } + +#define stbir__store_output() \ + stbir__simdf_0123ABCDto3ABx( c, tot0, tot1 ); \ + stbir__simdf_0123ABCDto23Ax( cs, tot1, tot2 ); \ + stbir__simdf_0123to1230( tot2, tot2 ); \ + stbir__simdf_add( tot0, tot0, cs ); \ + stbir__simdf_add( c, c, tot2 ); \ + stbir__simdf_add( tot0, tot0, c ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 3; \ + if ( output < output_end ) \ + { \ + stbir__simdf_store( output-3, tot0 ); \ + continue; \ + } \ + stbir__simdf_0123to2301( tot1, tot0 ); \ + stbir__simdf_store2( output-3, tot0 ); \ + stbir__simdf_store1( output+2-3, tot1 ); \ + break; + +#endif + +#else + +#define stbir__1_coeff_only() \ + float tot0, tot1, tot2, c; \ + c = hc[0]; \ + tot0 = decode[0]*c; \ + tot1 = decode[1]*c; \ + tot2 = decode[2]*c; + +#define stbir__2_coeff_only() \ + float tot0, tot1, tot2, c; \ + c = hc[0]; \ + tot0 = decode[0]*c; \ + tot1 = decode[1]*c; \ + tot2 = decode[2]*c; \ + c = hc[1]; \ + tot0 += decode[3]*c; \ + tot1 += decode[4]*c; \ + tot2 += decode[5]*c; + +#define stbir__3_coeff_only() \ + float tot0, tot1, tot2, c; \ + c = hc[0]; \ + tot0 = decode[0]*c; \ + tot1 = decode[1]*c; \ + tot2 = decode[2]*c; \ + c = hc[1]; \ + tot0 += decode[3]*c; \ + tot1 += decode[4]*c; \ + tot2 += decode[5]*c; \ + c = hc[2]; \ + tot0 += decode[6]*c; \ + tot1 += decode[7]*c; \ + tot2 += decode[8]*c; + +#define stbir__store_output_tiny() \ + output[0] = tot0; \ + output[1] = tot1; \ + output[2] = tot2; \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 3; + +#define stbir__4_coeff_start() \ + float tota0,tota1,tota2,totb0,totb1,totb2,totc0,totc1,totc2,totd0,totd1,totd2,c; \ + c = hc[0]; \ + tota0 = decode[0]*c; \ + tota1 = decode[1]*c; \ + tota2 = decode[2]*c; \ + c = hc[1]; \ + totb0 = decode[3]*c; \ + totb1 = decode[4]*c; \ + totb2 = decode[5]*c; \ + c = hc[2]; \ + totc0 = decode[6]*c; \ + totc1 = decode[7]*c; \ + totc2 = decode[8]*c; \ + c = hc[3]; \ + totd0 = decode[9]*c; \ + totd1 = decode[10]*c; \ + totd2 = decode[11]*c; + +#define stbir__4_coeff_continue_from_4( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*3]*c; \ + tota1 += decode[1+(ofs)*3]*c; \ + tota2 += decode[2+(ofs)*3]*c; \ + c = hc[1+(ofs)]; \ + totb0 += decode[3+(ofs)*3]*c; \ + totb1 += decode[4+(ofs)*3]*c; \ + totb2 += decode[5+(ofs)*3]*c; \ + c = hc[2+(ofs)]; \ + totc0 += decode[6+(ofs)*3]*c; \ + totc1 += decode[7+(ofs)*3]*c; \ + totc2 += decode[8+(ofs)*3]*c; \ + c = hc[3+(ofs)]; \ + totd0 += decode[9+(ofs)*3]*c; \ + totd1 += decode[10+(ofs)*3]*c; \ + totd2 += decode[11+(ofs)*3]*c; + +#define stbir__1_coeff_remnant( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*3]*c; \ + tota1 += decode[1+(ofs)*3]*c; \ + tota2 += decode[2+(ofs)*3]*c; + +#define stbir__2_coeff_remnant( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*3]*c; \ + tota1 += decode[1+(ofs)*3]*c; \ + tota2 += decode[2+(ofs)*3]*c; \ + c = hc[1+(ofs)]; \ + totb0 += decode[3+(ofs)*3]*c; \ + totb1 += decode[4+(ofs)*3]*c; \ + totb2 += decode[5+(ofs)*3]*c; \ + +#define stbir__3_coeff_remnant( ofs ) \ + c = hc[0+(ofs)]; \ + tota0 += decode[0+(ofs)*3]*c; \ + tota1 += decode[1+(ofs)*3]*c; \ + tota2 += decode[2+(ofs)*3]*c; \ + c = hc[1+(ofs)]; \ + totb0 += decode[3+(ofs)*3]*c; \ + totb1 += decode[4+(ofs)*3]*c; \ + totb2 += decode[5+(ofs)*3]*c; \ + c = hc[2+(ofs)]; \ + totc0 += decode[6+(ofs)*3]*c; \ + totc1 += decode[7+(ofs)*3]*c; \ + totc2 += decode[8+(ofs)*3]*c; + +#define stbir__store_output() \ + output[0] = (tota0+totc0)+(totb0+totd0); \ + output[1] = (tota1+totc1)+(totb1+totd1); \ + output[2] = (tota2+totc2)+(totb2+totd2); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 3; + +#endif + +#define STBIR__horizontal_channels 3 +#define STB_IMAGE_RESIZE_DO_HORIZONTALS +#include STBIR__HEADER_FILENAME + +//================= +// Do 4 channel horizontal routines + +#ifdef STBIR_SIMD + +#define stbir__1_coeff_only() \ + stbir__simdf tot,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1( c, hc ); \ + stbir__simdf_0123to0000( c, c ); \ + stbir__simdf_mult_mem( tot, c, decode ); + +#define stbir__2_coeff_only() \ + stbir__simdf tot,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_mult_mem( tot, c, decode ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot, tot, c, decode+4 ); + +#define stbir__3_coeff_only() \ + stbir__simdf tot,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_mult_mem( tot, c, decode ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot, tot, c, decode+4 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot, tot, c, decode+8 ); + +#define stbir__store_output_tiny() \ + stbir__simdf_store( output, tot ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 4; + +#ifdef STBIR_SIMD8 + +#define stbir__4_coeff_start() \ + stbir__simdf8 tot0,c,cs; stbir__simdf t; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc ); \ + stbir__simdf8_0123to00001111( c, cs ); \ + stbir__simdf8_mult_mem( tot0, c, decode ); \ + stbir__simdf8_0123to22223333( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+8 ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00001111( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*4 ); \ + stbir__simdf8_0123to22223333( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*4+8 ); + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1rep4( t, hc + (ofs) ); \ + stbir__simdf8_madd_mem4( tot0, tot0, t, decode+(ofs)*4 ); + +#define stbir__2_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) - 2 ); \ + stbir__simdf8_0123to22223333( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*4 ); + + #define stbir__3_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00001111( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*4 ); \ + stbir__simdf8_0123to2222( t, cs ); \ + stbir__simdf8_madd_mem4( tot0, tot0, t, decode+(ofs)*4+8 ); + +#define stbir__store_output() \ + stbir__simdf8_add4halves( t, stbir__if_simdf8_cast_to_simdf4(tot0), tot0 ); \ + stbir__simdf_store( output, t ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 4; + +#else + +#define stbir__4_coeff_start() \ + stbir__simdf tot0,tot1,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_mult_mem( tot0, c, decode ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_mult_mem( tot1, c, decode+4 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+8 ); \ + stbir__simdf_0123to3333( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+12 ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*4 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*4+4 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*4+8 ); \ + stbir__simdf_0123to3333( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*4+12 ); + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1( c, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, c ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*4 ); + +#define stbir__2_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2( cs, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*4 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*4+4 ); + +#define stbir__3_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*4 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*4+4 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*4+8 ); + +#define stbir__store_output() \ + stbir__simdf_add( tot0, tot0, tot1 ); \ + stbir__simdf_store( output, tot0 ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 4; + +#endif + +#else + +#define stbir__1_coeff_only() \ + float p0,p1,p2,p3,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0]; \ + p0 = decode[0] * c; \ + p1 = decode[1] * c; \ + p2 = decode[2] * c; \ + p3 = decode[3] * c; + +#define stbir__2_coeff_only() \ + float p0,p1,p2,p3,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0]; \ + p0 = decode[0] * c; \ + p1 = decode[1] * c; \ + p2 = decode[2] * c; \ + p3 = decode[3] * c; \ + c = hc[1]; \ + p0 += decode[4] * c; \ + p1 += decode[5] * c; \ + p2 += decode[6] * c; \ + p3 += decode[7] * c; + +#define stbir__3_coeff_only() \ + float p0,p1,p2,p3,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0]; \ + p0 = decode[0] * c; \ + p1 = decode[1] * c; \ + p2 = decode[2] * c; \ + p3 = decode[3] * c; \ + c = hc[1]; \ + p0 += decode[4] * c; \ + p1 += decode[5] * c; \ + p2 += decode[6] * c; \ + p3 += decode[7] * c; \ + c = hc[2]; \ + p0 += decode[8] * c; \ + p1 += decode[9] * c; \ + p2 += decode[10] * c; \ + p3 += decode[11] * c; + +#define stbir__store_output_tiny() \ + output[0] = p0; \ + output[1] = p1; \ + output[2] = p2; \ + output[3] = p3; \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 4; + +#define stbir__4_coeff_start() \ + float x0,x1,x2,x3,y0,y1,y2,y3,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0]; \ + x0 = decode[0] * c; \ + x1 = decode[1] * c; \ + x2 = decode[2] * c; \ + x3 = decode[3] * c; \ + c = hc[1]; \ + y0 = decode[4] * c; \ + y1 = decode[5] * c; \ + y2 = decode[6] * c; \ + y3 = decode[7] * c; \ + c = hc[2]; \ + x0 += decode[8] * c; \ + x1 += decode[9] * c; \ + x2 += decode[10] * c; \ + x3 += decode[11] * c; \ + c = hc[3]; \ + y0 += decode[12] * c; \ + y1 += decode[13] * c; \ + y2 += decode[14] * c; \ + y3 += decode[15] * c; + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*4] * c; \ + x1 += decode[1+(ofs)*4] * c; \ + x2 += decode[2+(ofs)*4] * c; \ + x3 += decode[3+(ofs)*4] * c; \ + c = hc[1+(ofs)]; \ + y0 += decode[4+(ofs)*4] * c; \ + y1 += decode[5+(ofs)*4] * c; \ + y2 += decode[6+(ofs)*4] * c; \ + y3 += decode[7+(ofs)*4] * c; \ + c = hc[2+(ofs)]; \ + x0 += decode[8+(ofs)*4] * c; \ + x1 += decode[9+(ofs)*4] * c; \ + x2 += decode[10+(ofs)*4] * c; \ + x3 += decode[11+(ofs)*4] * c; \ + c = hc[3+(ofs)]; \ + y0 += decode[12+(ofs)*4] * c; \ + y1 += decode[13+(ofs)*4] * c; \ + y2 += decode[14+(ofs)*4] * c; \ + y3 += decode[15+(ofs)*4] * c; + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*4] * c; \ + x1 += decode[1+(ofs)*4] * c; \ + x2 += decode[2+(ofs)*4] * c; \ + x3 += decode[3+(ofs)*4] * c; + +#define stbir__2_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*4] * c; \ + x1 += decode[1+(ofs)*4] * c; \ + x2 += decode[2+(ofs)*4] * c; \ + x3 += decode[3+(ofs)*4] * c; \ + c = hc[1+(ofs)]; \ + y0 += decode[4+(ofs)*4] * c; \ + y1 += decode[5+(ofs)*4] * c; \ + y2 += decode[6+(ofs)*4] * c; \ + y3 += decode[7+(ofs)*4] * c; + +#define stbir__3_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*4] * c; \ + x1 += decode[1+(ofs)*4] * c; \ + x2 += decode[2+(ofs)*4] * c; \ + x3 += decode[3+(ofs)*4] * c; \ + c = hc[1+(ofs)]; \ + y0 += decode[4+(ofs)*4] * c; \ + y1 += decode[5+(ofs)*4] * c; \ + y2 += decode[6+(ofs)*4] * c; \ + y3 += decode[7+(ofs)*4] * c; \ + c = hc[2+(ofs)]; \ + x0 += decode[8+(ofs)*4] * c; \ + x1 += decode[9+(ofs)*4] * c; \ + x2 += decode[10+(ofs)*4] * c; \ + x3 += decode[11+(ofs)*4] * c; + +#define stbir__store_output() \ + output[0] = x0 + y0; \ + output[1] = x1 + y1; \ + output[2] = x2 + y2; \ + output[3] = x3 + y3; \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 4; + +#endif + +#define STBIR__horizontal_channels 4 +#define STB_IMAGE_RESIZE_DO_HORIZONTALS +#include STBIR__HEADER_FILENAME + + + +//================= +// Do 7 channel horizontal routines + +#ifdef STBIR_SIMD + +#define stbir__1_coeff_only() \ + stbir__simdf tot0,tot1,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1( c, hc ); \ + stbir__simdf_0123to0000( c, c ); \ + stbir__simdf_mult_mem( tot0, c, decode ); \ + stbir__simdf_mult_mem( tot1, c, decode+3 ); + +#define stbir__2_coeff_only() \ + stbir__simdf tot0,tot1,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_mult_mem( tot0, c, decode ); \ + stbir__simdf_mult_mem( tot1, c, decode+3 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+7 ); \ + stbir__simdf_madd_mem( tot1, tot1, c,decode+10 ); + +#define stbir__3_coeff_only() \ + stbir__simdf tot0,tot1,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_mult_mem( tot0, c, decode ); \ + stbir__simdf_mult_mem( tot1, c, decode+3 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+7 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+10 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+14 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+17 ); + +#define stbir__store_output_tiny() \ + stbir__simdf_store( output+3, tot1 ); \ + stbir__simdf_store( output, tot0 ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 7; + +#ifdef STBIR_SIMD8 + +#define stbir__4_coeff_start() \ + stbir__simdf8 tot0,tot1,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc ); \ + stbir__simdf8_0123to00000000( c, cs ); \ + stbir__simdf8_mult_mem( tot0, c, decode ); \ + stbir__simdf8_0123to11111111( c, cs ); \ + stbir__simdf8_mult_mem( tot1, c, decode+7 ); \ + stbir__simdf8_0123to22222222( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+14 ); \ + stbir__simdf8_0123to33333333( c, cs ); \ + stbir__simdf8_madd_mem( tot1, tot1, c, decode+21 ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00000000( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); \ + stbir__simdf8_0123to11111111( c, cs ); \ + stbir__simdf8_madd_mem( tot1, tot1, c, decode+(ofs)*7+7 ); \ + stbir__simdf8_0123to22222222( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*7+14 ); \ + stbir__simdf8_0123to33333333( c, cs ); \ + stbir__simdf8_madd_mem( tot1, tot1, c, decode+(ofs)*7+21 ); + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load1b( c, hc + (ofs) ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); + +#define stbir__2_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load1b( c, hc + (ofs) ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); \ + stbir__simdf8_load1b( c, hc + (ofs)+1 ); \ + stbir__simdf8_madd_mem( tot1, tot1, c, decode+(ofs)*7+7 ); + +#define stbir__3_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf8_load4b( cs, hc + (ofs) ); \ + stbir__simdf8_0123to00000000( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); \ + stbir__simdf8_0123to11111111( c, cs ); \ + stbir__simdf8_madd_mem( tot1, tot1, c, decode+(ofs)*7+7 ); \ + stbir__simdf8_0123to22222222( c, cs ); \ + stbir__simdf8_madd_mem( tot0, tot0, c, decode+(ofs)*7+14 ); + +#define stbir__store_output() \ + stbir__simdf8_add( tot0, tot0, tot1 ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 7; \ + if ( output < output_end ) \ + { \ + stbir__simdf8_store( output-7, tot0 ); \ + continue; \ + } \ + stbir__simdf_store( output-7+3, stbir__simdf_swiz(stbir__simdf8_gettop4(tot0),0,0,1,2) ); \ + stbir__simdf_store( output-7, stbir__if_simdf8_cast_to_simdf4(tot0) ); \ + break; + +#else + +#define stbir__4_coeff_start() \ + stbir__simdf tot0,tot1,tot2,tot3,c,cs; \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_mult_mem( tot0, c, decode ); \ + stbir__simdf_mult_mem( tot1, c, decode+3 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_mult_mem( tot2, c, decode+7 ); \ + stbir__simdf_mult_mem( tot3, c, decode+10 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+14 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+17 ); \ + stbir__simdf_0123to3333( c, cs ); \ + stbir__simdf_madd_mem( tot2, tot2, c, decode+21 ); \ + stbir__simdf_madd_mem( tot3, tot3, c, decode+24 ); + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*7+3 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot2, tot2, c, decode+(ofs)*7+7 ); \ + stbir__simdf_madd_mem( tot3, tot3, c, decode+(ofs)*7+10 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*7+14 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*7+17 ); \ + stbir__simdf_0123to3333( c, cs ); \ + stbir__simdf_madd_mem( tot2, tot2, c, decode+(ofs)*7+21 ); \ + stbir__simdf_madd_mem( tot3, tot3, c, decode+(ofs)*7+24 ); + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load1( c, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, c ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*7+3 ); \ + +#define stbir__2_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load2( cs, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*7+3 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot2, tot2, c, decode+(ofs)*7+7 ); \ + stbir__simdf_madd_mem( tot3, tot3, c, decode+(ofs)*7+10 ); + +#define stbir__3_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + stbir__simdf_load( cs, hc + (ofs) ); \ + stbir__simdf_0123to0000( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*7 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*7+3 ); \ + stbir__simdf_0123to1111( c, cs ); \ + stbir__simdf_madd_mem( tot2, tot2, c, decode+(ofs)*7+7 ); \ + stbir__simdf_madd_mem( tot3, tot3, c, decode+(ofs)*7+10 ); \ + stbir__simdf_0123to2222( c, cs ); \ + stbir__simdf_madd_mem( tot0, tot0, c, decode+(ofs)*7+14 ); \ + stbir__simdf_madd_mem( tot1, tot1, c, decode+(ofs)*7+17 ); + +#define stbir__store_output() \ + stbir__simdf_add( tot0, tot0, tot2 ); \ + stbir__simdf_add( tot1, tot1, tot3 ); \ + stbir__simdf_store( output+3, tot1 ); \ + stbir__simdf_store( output, tot0 ); \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 7; + +#endif + +#else + +#define stbir__1_coeff_only() \ + float tot0, tot1, tot2, tot3, tot4, tot5, tot6, c; \ + c = hc[0]; \ + tot0 = decode[0]*c; \ + tot1 = decode[1]*c; \ + tot2 = decode[2]*c; \ + tot3 = decode[3]*c; \ + tot4 = decode[4]*c; \ + tot5 = decode[5]*c; \ + tot6 = decode[6]*c; + +#define stbir__2_coeff_only() \ + float tot0, tot1, tot2, tot3, tot4, tot5, tot6, c; \ + c = hc[0]; \ + tot0 = decode[0]*c; \ + tot1 = decode[1]*c; \ + tot2 = decode[2]*c; \ + tot3 = decode[3]*c; \ + tot4 = decode[4]*c; \ + tot5 = decode[5]*c; \ + tot6 = decode[6]*c; \ + c = hc[1]; \ + tot0 += decode[7]*c; \ + tot1 += decode[8]*c; \ + tot2 += decode[9]*c; \ + tot3 += decode[10]*c; \ + tot4 += decode[11]*c; \ + tot5 += decode[12]*c; \ + tot6 += decode[13]*c; \ + +#define stbir__3_coeff_only() \ + float tot0, tot1, tot2, tot3, tot4, tot5, tot6, c; \ + c = hc[0]; \ + tot0 = decode[0]*c; \ + tot1 = decode[1]*c; \ + tot2 = decode[2]*c; \ + tot3 = decode[3]*c; \ + tot4 = decode[4]*c; \ + tot5 = decode[5]*c; \ + tot6 = decode[6]*c; \ + c = hc[1]; \ + tot0 += decode[7]*c; \ + tot1 += decode[8]*c; \ + tot2 += decode[9]*c; \ + tot3 += decode[10]*c; \ + tot4 += decode[11]*c; \ + tot5 += decode[12]*c; \ + tot6 += decode[13]*c; \ + c = hc[2]; \ + tot0 += decode[14]*c; \ + tot1 += decode[15]*c; \ + tot2 += decode[16]*c; \ + tot3 += decode[17]*c; \ + tot4 += decode[18]*c; \ + tot5 += decode[19]*c; \ + tot6 += decode[20]*c; \ + +#define stbir__store_output_tiny() \ + output[0] = tot0; \ + output[1] = tot1; \ + output[2] = tot2; \ + output[3] = tot3; \ + output[4] = tot4; \ + output[5] = tot5; \ + output[6] = tot6; \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 7; + +#define stbir__4_coeff_start() \ + float x0,x1,x2,x3,x4,x5,x6,y0,y1,y2,y3,y4,y5,y6,c; \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0]; \ + x0 = decode[0] * c; \ + x1 = decode[1] * c; \ + x2 = decode[2] * c; \ + x3 = decode[3] * c; \ + x4 = decode[4] * c; \ + x5 = decode[5] * c; \ + x6 = decode[6] * c; \ + c = hc[1]; \ + y0 = decode[7] * c; \ + y1 = decode[8] * c; \ + y2 = decode[9] * c; \ + y3 = decode[10] * c; \ + y4 = decode[11] * c; \ + y5 = decode[12] * c; \ + y6 = decode[13] * c; \ + c = hc[2]; \ + x0 += decode[14] * c; \ + x1 += decode[15] * c; \ + x2 += decode[16] * c; \ + x3 += decode[17] * c; \ + x4 += decode[18] * c; \ + x5 += decode[19] * c; \ + x6 += decode[20] * c; \ + c = hc[3]; \ + y0 += decode[21] * c; \ + y1 += decode[22] * c; \ + y2 += decode[23] * c; \ + y3 += decode[24] * c; \ + y4 += decode[25] * c; \ + y5 += decode[26] * c; \ + y6 += decode[27] * c; + +#define stbir__4_coeff_continue_from_4( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*7] * c; \ + x1 += decode[1+(ofs)*7] * c; \ + x2 += decode[2+(ofs)*7] * c; \ + x3 += decode[3+(ofs)*7] * c; \ + x4 += decode[4+(ofs)*7] * c; \ + x5 += decode[5+(ofs)*7] * c; \ + x6 += decode[6+(ofs)*7] * c; \ + c = hc[1+(ofs)]; \ + y0 += decode[7+(ofs)*7] * c; \ + y1 += decode[8+(ofs)*7] * c; \ + y2 += decode[9+(ofs)*7] * c; \ + y3 += decode[10+(ofs)*7] * c; \ + y4 += decode[11+(ofs)*7] * c; \ + y5 += decode[12+(ofs)*7] * c; \ + y6 += decode[13+(ofs)*7] * c; \ + c = hc[2+(ofs)]; \ + x0 += decode[14+(ofs)*7] * c; \ + x1 += decode[15+(ofs)*7] * c; \ + x2 += decode[16+(ofs)*7] * c; \ + x3 += decode[17+(ofs)*7] * c; \ + x4 += decode[18+(ofs)*7] * c; \ + x5 += decode[19+(ofs)*7] * c; \ + x6 += decode[20+(ofs)*7] * c; \ + c = hc[3+(ofs)]; \ + y0 += decode[21+(ofs)*7] * c; \ + y1 += decode[22+(ofs)*7] * c; \ + y2 += decode[23+(ofs)*7] * c; \ + y3 += decode[24+(ofs)*7] * c; \ + y4 += decode[25+(ofs)*7] * c; \ + y5 += decode[26+(ofs)*7] * c; \ + y6 += decode[27+(ofs)*7] * c; + +#define stbir__1_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*7] * c; \ + x1 += decode[1+(ofs)*7] * c; \ + x2 += decode[2+(ofs)*7] * c; \ + x3 += decode[3+(ofs)*7] * c; \ + x4 += decode[4+(ofs)*7] * c; \ + x5 += decode[5+(ofs)*7] * c; \ + x6 += decode[6+(ofs)*7] * c; \ + +#define stbir__2_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*7] * c; \ + x1 += decode[1+(ofs)*7] * c; \ + x2 += decode[2+(ofs)*7] * c; \ + x3 += decode[3+(ofs)*7] * c; \ + x4 += decode[4+(ofs)*7] * c; \ + x5 += decode[5+(ofs)*7] * c; \ + x6 += decode[6+(ofs)*7] * c; \ + c = hc[1+(ofs)]; \ + y0 += decode[7+(ofs)*7] * c; \ + y1 += decode[8+(ofs)*7] * c; \ + y2 += decode[9+(ofs)*7] * c; \ + y3 += decode[10+(ofs)*7] * c; \ + y4 += decode[11+(ofs)*7] * c; \ + y5 += decode[12+(ofs)*7] * c; \ + y6 += decode[13+(ofs)*7] * c; \ + +#define stbir__3_coeff_remnant( ofs ) \ + STBIR_SIMD_NO_UNROLL(decode); \ + c = hc[0+(ofs)]; \ + x0 += decode[0+(ofs)*7] * c; \ + x1 += decode[1+(ofs)*7] * c; \ + x2 += decode[2+(ofs)*7] * c; \ + x3 += decode[3+(ofs)*7] * c; \ + x4 += decode[4+(ofs)*7] * c; \ + x5 += decode[5+(ofs)*7] * c; \ + x6 += decode[6+(ofs)*7] * c; \ + c = hc[1+(ofs)]; \ + y0 += decode[7+(ofs)*7] * c; \ + y1 += decode[8+(ofs)*7] * c; \ + y2 += decode[9+(ofs)*7] * c; \ + y3 += decode[10+(ofs)*7] * c; \ + y4 += decode[11+(ofs)*7] * c; \ + y5 += decode[12+(ofs)*7] * c; \ + y6 += decode[13+(ofs)*7] * c; \ + c = hc[2+(ofs)]; \ + x0 += decode[14+(ofs)*7] * c; \ + x1 += decode[15+(ofs)*7] * c; \ + x2 += decode[16+(ofs)*7] * c; \ + x3 += decode[17+(ofs)*7] * c; \ + x4 += decode[18+(ofs)*7] * c; \ + x5 += decode[19+(ofs)*7] * c; \ + x6 += decode[20+(ofs)*7] * c; \ + +#define stbir__store_output() \ + output[0] = x0 + y0; \ + output[1] = x1 + y1; \ + output[2] = x2 + y2; \ + output[3] = x3 + y3; \ + output[4] = x4 + y4; \ + output[5] = x5 + y5; \ + output[6] = x6 + y6; \ + horizontal_coefficients += coefficient_width; \ + ++horizontal_contributors; \ + output += 7; + +#endif + +#define STBIR__horizontal_channels 7 +#define STB_IMAGE_RESIZE_DO_HORIZONTALS +#include STBIR__HEADER_FILENAME + + +// include all of the vertical resamplers (both scatter and gather versions) + +#define STBIR__vertical_channels 1 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 1 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 2 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 2 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 3 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 3 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 4 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 4 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 5 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 5 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 6 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 6 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 7 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 7 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 8 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#include STBIR__HEADER_FILENAME + +#define STBIR__vertical_channels 8 +#define STB_IMAGE_RESIZE_DO_VERTICALS +#define STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#include STBIR__HEADER_FILENAME + +typedef void STBIR_VERTICAL_GATHERFUNC( float * output, float const * coeffs, float const ** inputs, float const * input0_end ); + +static STBIR_VERTICAL_GATHERFUNC * stbir__vertical_gathers[ 8 ] = +{ + stbir__vertical_gather_with_1_coeffs,stbir__vertical_gather_with_2_coeffs,stbir__vertical_gather_with_3_coeffs,stbir__vertical_gather_with_4_coeffs,stbir__vertical_gather_with_5_coeffs,stbir__vertical_gather_with_6_coeffs,stbir__vertical_gather_with_7_coeffs,stbir__vertical_gather_with_8_coeffs +}; + +static STBIR_VERTICAL_GATHERFUNC * stbir__vertical_gathers_continues[ 8 ] = +{ + stbir__vertical_gather_with_1_coeffs_cont,stbir__vertical_gather_with_2_coeffs_cont,stbir__vertical_gather_with_3_coeffs_cont,stbir__vertical_gather_with_4_coeffs_cont,stbir__vertical_gather_with_5_coeffs_cont,stbir__vertical_gather_with_6_coeffs_cont,stbir__vertical_gather_with_7_coeffs_cont,stbir__vertical_gather_with_8_coeffs_cont +}; + +typedef void STBIR_VERTICAL_SCATTERFUNC( float ** outputs, float const * coeffs, float const * input, float const * input_end ); + +static STBIR_VERTICAL_SCATTERFUNC * stbir__vertical_scatter_sets[ 8 ] = +{ + stbir__vertical_scatter_with_1_coeffs,stbir__vertical_scatter_with_2_coeffs,stbir__vertical_scatter_with_3_coeffs,stbir__vertical_scatter_with_4_coeffs,stbir__vertical_scatter_with_5_coeffs,stbir__vertical_scatter_with_6_coeffs,stbir__vertical_scatter_with_7_coeffs,stbir__vertical_scatter_with_8_coeffs +}; + +static STBIR_VERTICAL_SCATTERFUNC * stbir__vertical_scatter_blends[ 8 ] = +{ + stbir__vertical_scatter_with_1_coeffs_cont,stbir__vertical_scatter_with_2_coeffs_cont,stbir__vertical_scatter_with_3_coeffs_cont,stbir__vertical_scatter_with_4_coeffs_cont,stbir__vertical_scatter_with_5_coeffs_cont,stbir__vertical_scatter_with_6_coeffs_cont,stbir__vertical_scatter_with_7_coeffs_cont,stbir__vertical_scatter_with_8_coeffs_cont +}; + + +static void stbir__encode_scanline( stbir__info const * stbir_info, void *output_buffer_data, float * encode_buffer, int row STBIR_ONLY_PROFILE_GET_SPLIT_INFO ) +{ + int num_pixels = stbir_info->horizontal.scale_info.output_sub_size; + int channels = stbir_info->channels; + int width_times_channels = num_pixels * channels; + void * output_buffer; + + // un-alpha weight if we need to + if ( stbir_info->alpha_unweight ) + { + STBIR_PROFILE_START( unalpha ); + stbir_info->alpha_unweight( encode_buffer, width_times_channels ); + STBIR_PROFILE_END( unalpha ); + } + + // write directly into output by default + output_buffer = output_buffer_data; + + // if we have an output callback, we first convert the decode buffer in place (and then hand that to the callback) + if ( stbir_info->out_pixels_cb ) + output_buffer = encode_buffer; + + STBIR_PROFILE_START( encode ); + // convert into the output buffer + stbir_info->encode_pixels( output_buffer, width_times_channels, encode_buffer ); + STBIR_PROFILE_END( encode ); + + // if we have an output callback, call it to send the data + if ( stbir_info->out_pixels_cb ) + stbir_info->out_pixels_cb( output_buffer, num_pixels, row, stbir_info->user_data ); +} + + +// Get the ring buffer pointer for an index +static float* stbir__get_ring_buffer_entry(stbir__info const * stbir_info, stbir__per_split_info const * split_info, int index ) +{ + STBIR_ASSERT( index < stbir_info->ring_buffer_num_entries ); + + #ifdef STBIR__SEPARATE_ALLOCATIONS + return split_info->ring_buffers[ index ]; + #else + return (float*) ( ( (char*) split_info->ring_buffer ) + ( index * stbir_info->ring_buffer_length_bytes ) ); + #endif +} + +// Get the specified scan line from the ring buffer +static float* stbir__get_ring_buffer_scanline(stbir__info const * stbir_info, stbir__per_split_info const * split_info, int get_scanline) +{ + int ring_buffer_index = (split_info->ring_buffer_begin_index + (get_scanline - split_info->ring_buffer_first_scanline)) % stbir_info->ring_buffer_num_entries; + return stbir__get_ring_buffer_entry( stbir_info, split_info, ring_buffer_index ); +} + +static void stbir__resample_horizontal_gather(stbir__info const * stbir_info, float* output_buffer, float const * input_buffer STBIR_ONLY_PROFILE_GET_SPLIT_INFO ) +{ + float const * decode_buffer = input_buffer - ( stbir_info->scanline_extents.conservative.n0 * stbir_info->effective_channels ); + + STBIR_PROFILE_START( horizontal ); + if ( ( stbir_info->horizontal.filter_enum == STBIR_FILTER_POINT_SAMPLE ) && ( stbir_info->horizontal.scale_info.scale == 1.0f ) ) + STBIR_MEMCPY( output_buffer, input_buffer, stbir_info->horizontal.scale_info.output_sub_size * sizeof( float ) * stbir_info->effective_channels ); + else + stbir_info->horizontal_gather_channels( output_buffer, stbir_info->horizontal.scale_info.output_sub_size, decode_buffer, stbir_info->horizontal.contributors, stbir_info->horizontal.coefficients, stbir_info->horizontal.coefficient_width ); + STBIR_PROFILE_END( horizontal ); +} + +static void stbir__resample_vertical_gather(stbir__info const * stbir_info, stbir__per_split_info* split_info, int n, int contrib_n0, int contrib_n1, float const * vertical_coefficients ) +{ + float* encode_buffer = split_info->vertical_buffer; + float* decode_buffer = split_info->decode_buffer; + int vertical_first = stbir_info->vertical_first; + int width = (vertical_first) ? ( stbir_info->scanline_extents.conservative.n1-stbir_info->scanline_extents.conservative.n0+1 ) : stbir_info->horizontal.scale_info.output_sub_size; + int width_times_channels = stbir_info->effective_channels * width; + + STBIR_ASSERT( stbir_info->vertical.is_gather ); + + // loop over the contributing scanlines and scale into the buffer + STBIR_PROFILE_START( vertical ); + { + int k = 0, total = contrib_n1 - contrib_n0 + 1; + STBIR_ASSERT( total > 0 ); + do { + float const * inputs[8]; + int i, cnt = total; if ( cnt > 8 ) cnt = 8; + for( i = 0 ; i < cnt ; i++ ) + inputs[ i ] = stbir__get_ring_buffer_scanline(stbir_info, split_info, k+i+contrib_n0 ); + + // call the N scanlines at a time function (up to 8 scanlines of blending at once) + ((k==0)?stbir__vertical_gathers:stbir__vertical_gathers_continues)[cnt-1]( (vertical_first) ? decode_buffer : encode_buffer, vertical_coefficients + k, inputs, inputs[0] + width_times_channels ); + k += cnt; + total -= cnt; + } while ( total ); + } + STBIR_PROFILE_END( vertical ); + + if ( vertical_first ) + { + // Now resample the gathered vertical data in the horizontal axis into the encode buffer + decode_buffer[ width_times_channels ] = 0.0f; // clear two over for horizontals with a remnant of 3 + decode_buffer[ width_times_channels+1 ] = 0.0f; + stbir__resample_horizontal_gather(stbir_info, encode_buffer, decode_buffer STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + } + + stbir__encode_scanline( stbir_info, ( (char *) stbir_info->output_data ) + ((size_t)n * (size_t)stbir_info->output_stride_bytes), + encode_buffer, n STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); +} + +static void stbir__decode_and_resample_for_vertical_gather_loop(stbir__info const * stbir_info, stbir__per_split_info* split_info, int n) +{ + int ring_buffer_index; + float* ring_buffer; + + // Decode the nth scanline from the source image into the decode buffer. + stbir__decode_scanline( stbir_info, n, split_info->decode_buffer STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + + // update new end scanline + split_info->ring_buffer_last_scanline = n; + + // get ring buffer + ring_buffer_index = (split_info->ring_buffer_begin_index + (split_info->ring_buffer_last_scanline - split_info->ring_buffer_first_scanline)) % stbir_info->ring_buffer_num_entries; + ring_buffer = stbir__get_ring_buffer_entry(stbir_info, split_info, ring_buffer_index); + + // Now resample it into the ring buffer. + stbir__resample_horizontal_gather( stbir_info, ring_buffer, split_info->decode_buffer STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + + // Now it's sitting in the ring buffer ready to be used as source for the vertical sampling. +} + +static void stbir__vertical_gather_loop( stbir__info const * stbir_info, stbir__per_split_info* split_info, int split_count ) +{ + int y, start_output_y, end_output_y; + stbir__contributors* vertical_contributors = stbir_info->vertical.contributors; + float const * vertical_coefficients = stbir_info->vertical.coefficients; + + STBIR_ASSERT( stbir_info->vertical.is_gather ); + + start_output_y = split_info->start_output_y; + end_output_y = split_info[split_count-1].end_output_y; + + vertical_contributors += start_output_y; + vertical_coefficients += start_output_y * stbir_info->vertical.coefficient_width; + + // initialize the ring buffer for gathering + split_info->ring_buffer_begin_index = 0; + split_info->ring_buffer_first_scanline = vertical_contributors->n0; + split_info->ring_buffer_last_scanline = split_info->ring_buffer_first_scanline - 1; // means "empty" + + for (y = start_output_y; y < end_output_y; y++) + { + int in_first_scanline, in_last_scanline; + + in_first_scanline = vertical_contributors->n0; + in_last_scanline = vertical_contributors->n1; + + // make sure the indexing hasn't broken + STBIR_ASSERT( in_first_scanline >= split_info->ring_buffer_first_scanline ); + + // Load in new scanlines + while (in_last_scanline > split_info->ring_buffer_last_scanline) + { + STBIR_ASSERT( ( split_info->ring_buffer_last_scanline - split_info->ring_buffer_first_scanline + 1 ) <= stbir_info->ring_buffer_num_entries ); + + // make sure there was room in the ring buffer when we add new scanlines + if ( ( split_info->ring_buffer_last_scanline - split_info->ring_buffer_first_scanline + 1 ) == stbir_info->ring_buffer_num_entries ) + { + split_info->ring_buffer_first_scanline++; + split_info->ring_buffer_begin_index++; + } + + if ( stbir_info->vertical_first ) + { + float * ring_buffer = stbir__get_ring_buffer_scanline( stbir_info, split_info, ++split_info->ring_buffer_last_scanline ); + // Decode the nth scanline from the source image into the decode buffer. + stbir__decode_scanline( stbir_info, split_info->ring_buffer_last_scanline, ring_buffer STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + } + else + { + stbir__decode_and_resample_for_vertical_gather_loop(stbir_info, split_info, split_info->ring_buffer_last_scanline + 1); + } + } + + // Now all buffers should be ready to write a row of vertical sampling, so do it. + stbir__resample_vertical_gather(stbir_info, split_info, y, in_first_scanline, in_last_scanline, vertical_coefficients ); + + ++vertical_contributors; + vertical_coefficients += stbir_info->vertical.coefficient_width; + } +} + +#define STBIR__FLOAT_EMPTY_MARKER 3.0e+38F +#define STBIR__FLOAT_BUFFER_IS_EMPTY(ptr) ((ptr)[0]==STBIR__FLOAT_EMPTY_MARKER) + +static void stbir__encode_first_scanline_from_scatter(stbir__info const * stbir_info, stbir__per_split_info* split_info) +{ + // evict a scanline out into the output buffer + float* ring_buffer_entry = stbir__get_ring_buffer_entry(stbir_info, split_info, split_info->ring_buffer_begin_index ); + + // dump the scanline out + stbir__encode_scanline( stbir_info, ( (char *)stbir_info->output_data ) + ( (size_t)split_info->ring_buffer_first_scanline * (size_t)stbir_info->output_stride_bytes ), ring_buffer_entry, split_info->ring_buffer_first_scanline STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + + // mark it as empty + ring_buffer_entry[ 0 ] = STBIR__FLOAT_EMPTY_MARKER; + + // advance the first scanline + split_info->ring_buffer_first_scanline++; + if ( ++split_info->ring_buffer_begin_index == stbir_info->ring_buffer_num_entries ) + split_info->ring_buffer_begin_index = 0; +} + +static void stbir__horizontal_resample_and_encode_first_scanline_from_scatter(stbir__info const * stbir_info, stbir__per_split_info* split_info) +{ + // evict a scanline out into the output buffer + + float* ring_buffer_entry = stbir__get_ring_buffer_entry(stbir_info, split_info, split_info->ring_buffer_begin_index ); + + // Now resample it into the buffer. + stbir__resample_horizontal_gather( stbir_info, split_info->vertical_buffer, ring_buffer_entry STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + + // dump the scanline out + stbir__encode_scanline( stbir_info, ( (char *)stbir_info->output_data ) + ( (size_t)split_info->ring_buffer_first_scanline * (size_t)stbir_info->output_stride_bytes ), split_info->vertical_buffer, split_info->ring_buffer_first_scanline STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + + // mark it as empty + ring_buffer_entry[ 0 ] = STBIR__FLOAT_EMPTY_MARKER; + + // advance the first scanline + split_info->ring_buffer_first_scanline++; + if ( ++split_info->ring_buffer_begin_index == stbir_info->ring_buffer_num_entries ) + split_info->ring_buffer_begin_index = 0; +} + +static void stbir__resample_vertical_scatter(stbir__info const * stbir_info, stbir__per_split_info* split_info, int n0, int n1, float const * vertical_coefficients, float const * vertical_buffer, float const * vertical_buffer_end ) +{ + STBIR_ASSERT( !stbir_info->vertical.is_gather ); + + STBIR_PROFILE_START( vertical ); + { + int k = 0, total = n1 - n0 + 1; + STBIR_ASSERT( total > 0 ); + do { + float * outputs[8]; + int i, n = total; if ( n > 8 ) n = 8; + for( i = 0 ; i < n ; i++ ) + { + outputs[ i ] = stbir__get_ring_buffer_scanline(stbir_info, split_info, k+i+n0 ); + if ( ( i ) && ( STBIR__FLOAT_BUFFER_IS_EMPTY( outputs[i] ) != STBIR__FLOAT_BUFFER_IS_EMPTY( outputs[0] ) ) ) // make sure runs are of the same type + { + n = i; + break; + } + } + // call the scatter to N scanlines at a time function (up to 8 scanlines of scattering at once) + ((STBIR__FLOAT_BUFFER_IS_EMPTY( outputs[0] ))?stbir__vertical_scatter_sets:stbir__vertical_scatter_blends)[n-1]( outputs, vertical_coefficients + k, vertical_buffer, vertical_buffer_end ); + k += n; + total -= n; + } while ( total ); + } + + STBIR_PROFILE_END( vertical ); +} + +typedef void stbir__handle_scanline_for_scatter_func(stbir__info const * stbir_info, stbir__per_split_info* split_info); + +static void stbir__vertical_scatter_loop( stbir__info const * stbir_info, stbir__per_split_info* split_info, int split_count ) +{ + int y, start_output_y, end_output_y, start_input_y, end_input_y; + stbir__contributors* vertical_contributors = stbir_info->vertical.contributors; + float const * vertical_coefficients = stbir_info->vertical.coefficients; + stbir__handle_scanline_for_scatter_func * handle_scanline_for_scatter; + void * scanline_scatter_buffer; + void * scanline_scatter_buffer_end; + int on_first_input_y, last_input_y; + int width = (stbir_info->vertical_first) ? ( stbir_info->scanline_extents.conservative.n1-stbir_info->scanline_extents.conservative.n0+1 ) : stbir_info->horizontal.scale_info.output_sub_size; + int width_times_channels = stbir_info->effective_channels * width; + + STBIR_ASSERT( !stbir_info->vertical.is_gather ); + + start_output_y = split_info->start_output_y; + end_output_y = split_info[split_count-1].end_output_y; // may do multiple split counts + + start_input_y = split_info->start_input_y; + end_input_y = split_info[split_count-1].end_input_y; + + // adjust for starting offset start_input_y + y = start_input_y + stbir_info->vertical.filter_pixel_margin; + vertical_contributors += y ; + vertical_coefficients += stbir_info->vertical.coefficient_width * y; + + if ( stbir_info->vertical_first ) + { + handle_scanline_for_scatter = stbir__horizontal_resample_and_encode_first_scanline_from_scatter; + scanline_scatter_buffer = split_info->decode_buffer; + scanline_scatter_buffer_end = ( (char*) scanline_scatter_buffer ) + sizeof( float ) * stbir_info->effective_channels * (stbir_info->scanline_extents.conservative.n1-stbir_info->scanline_extents.conservative.n0+1); + } + else + { + handle_scanline_for_scatter = stbir__encode_first_scanline_from_scatter; + scanline_scatter_buffer = split_info->vertical_buffer; + scanline_scatter_buffer_end = ( (char*) scanline_scatter_buffer ) + sizeof( float ) * stbir_info->effective_channels * stbir_info->horizontal.scale_info.output_sub_size; + } + + // initialize the ring buffer for scattering + split_info->ring_buffer_first_scanline = start_output_y; + split_info->ring_buffer_last_scanline = -1; + split_info->ring_buffer_begin_index = -1; + + // mark all the buffers as empty to start + for( y = 0 ; y < stbir_info->ring_buffer_num_entries ; y++ ) + { + float * decode_buffer = stbir__get_ring_buffer_entry( stbir_info, split_info, y ); + decode_buffer[ width_times_channels ] = 0.0f; // clear two over for horizontals with a remnant of 3 + decode_buffer[ width_times_channels+1 ] = 0.0f; + decode_buffer[0] = STBIR__FLOAT_EMPTY_MARKER; // only used on scatter + } + + // do the loop in input space + on_first_input_y = 1; last_input_y = start_input_y; + for (y = start_input_y ; y < end_input_y; y++) + { + int out_first_scanline, out_last_scanline; + + out_first_scanline = vertical_contributors->n0; + out_last_scanline = vertical_contributors->n1; + + STBIR_ASSERT(out_last_scanline - out_first_scanline + 1 <= stbir_info->ring_buffer_num_entries); + + if ( ( out_last_scanline >= out_first_scanline ) && ( ( ( out_first_scanline >= start_output_y ) && ( out_first_scanline < end_output_y ) ) || ( ( out_last_scanline >= start_output_y ) && ( out_last_scanline < end_output_y ) ) ) ) + { + float const * vc = vertical_coefficients; + + // keep track of the range actually seen for the next resize + last_input_y = y; + if ( ( on_first_input_y ) && ( y > start_input_y ) ) + split_info->start_input_y = y; + on_first_input_y = 0; + + // clip the region + if ( out_first_scanline < start_output_y ) + { + vc += start_output_y - out_first_scanline; + out_first_scanline = start_output_y; + } + + if ( out_last_scanline >= end_output_y ) + out_last_scanline = end_output_y - 1; + + // if very first scanline, init the index + if (split_info->ring_buffer_begin_index < 0) + split_info->ring_buffer_begin_index = out_first_scanline - start_output_y; + + STBIR_ASSERT( split_info->ring_buffer_begin_index <= out_first_scanline ); + + // Decode the nth scanline from the source image into the decode buffer. + stbir__decode_scanline( stbir_info, y, split_info->decode_buffer STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + + // When horizontal first, we resample horizontally into the vertical buffer before we scatter it out + if ( !stbir_info->vertical_first ) + stbir__resample_horizontal_gather( stbir_info, split_info->vertical_buffer, split_info->decode_buffer STBIR_ONLY_PROFILE_SET_SPLIT_INFO ); + + // Now it's sitting in the buffer ready to be distributed into the ring buffers. + + // evict from the ringbuffer, if we need are full + if ( ( ( split_info->ring_buffer_last_scanline - split_info->ring_buffer_first_scanline + 1 ) == stbir_info->ring_buffer_num_entries ) && + ( out_last_scanline > split_info->ring_buffer_last_scanline ) ) + handle_scanline_for_scatter( stbir_info, split_info ); + + // Now the horizontal buffer is ready to write to all ring buffer rows, so do it. + stbir__resample_vertical_scatter(stbir_info, split_info, out_first_scanline, out_last_scanline, vc, (float*)scanline_scatter_buffer, (float*)scanline_scatter_buffer_end ); + + // update the end of the buffer + if ( out_last_scanline > split_info->ring_buffer_last_scanline ) + split_info->ring_buffer_last_scanline = out_last_scanline; + } + ++vertical_contributors; + vertical_coefficients += stbir_info->vertical.coefficient_width; + } + + // now evict the scanlines that are left over in the ring buffer + while ( split_info->ring_buffer_first_scanline < end_output_y ) + handle_scanline_for_scatter(stbir_info, split_info); + + // update the end_input_y if we do multiple resizes with the same data + ++last_input_y; + for( y = 0 ; y < split_count; y++ ) + if ( split_info[y].end_input_y > last_input_y ) + split_info[y].end_input_y = last_input_y; +} + + +static stbir__kernel_callback * stbir__builtin_kernels[] = { 0, stbir__filter_trapezoid, stbir__filter_triangle, stbir__filter_cubic, stbir__filter_catmullrom, stbir__filter_mitchell, stbir__filter_point }; +static stbir__support_callback * stbir__builtin_supports[] = { 0, stbir__support_trapezoid, stbir__support_one, stbir__support_two, stbir__support_two, stbir__support_two, stbir__support_zeropoint5 }; + +static void stbir__set_sampler(stbir__sampler * samp, stbir_filter filter, stbir__kernel_callback * kernel, stbir__support_callback * support, stbir_edge edge, stbir__scale_info * scale_info, int always_gather, void * user_data ) +{ + // set filter + if (filter == 0) + { + filter = STBIR_DEFAULT_FILTER_DOWNSAMPLE; // default to downsample + if (scale_info->scale >= ( 1.0f - stbir__small_float ) ) + { + if ( (scale_info->scale <= ( 1.0f + stbir__small_float ) ) && ( STBIR_CEILF(scale_info->pixel_shift) == scale_info->pixel_shift ) ) + filter = STBIR_FILTER_POINT_SAMPLE; + else + filter = STBIR_DEFAULT_FILTER_UPSAMPLE; + } + } + samp->filter_enum = filter; + + STBIR_ASSERT(samp->filter_enum != 0); + STBIR_ASSERT((unsigned)samp->filter_enum < STBIR_FILTER_OTHER); + samp->filter_kernel = stbir__builtin_kernels[ filter ]; + samp->filter_support = stbir__builtin_supports[ filter ]; + + if ( kernel && support ) + { + samp->filter_kernel = kernel; + samp->filter_support = support; + samp->filter_enum = STBIR_FILTER_OTHER; + } + + samp->edge = edge; + samp->filter_pixel_width = stbir__get_filter_pixel_width (samp->filter_support, scale_info->scale, user_data ); + // Gather is always better, but in extreme downsamples, you have to most or all of the data in memory + // For horizontal, we always have all the pixels, so we always use gather here (always_gather==1). + // For vertical, we use gather if scaling up (which means we will have samp->filter_pixel_width + // scanlines in memory at once). + samp->is_gather = 0; + if ( scale_info->scale >= ( 1.0f - stbir__small_float ) ) + samp->is_gather = 1; + else if ( ( always_gather ) || ( samp->filter_pixel_width <= STBIR_FORCE_GATHER_FILTER_SCANLINES_AMOUNT ) ) + samp->is_gather = 2; + + // pre calculate stuff based on the above + samp->coefficient_width = stbir__get_coefficient_width(samp, samp->is_gather, user_data); + + // filter_pixel_width is the conservative size in pixels of input that affect an output pixel. + // In rare cases (only with 2 pix to 1 pix with the default filters), it's possible that the + // filter will extend before or after the scanline beyond just one extra entire copy of the + // scanline (we would hit the edge twice). We don't let you do that, so we clamp the total + // width to 3x the total of input pixel (once for the scanline, once for the left side + // overhang, and once for the right side). We only do this for edge mode, since the other + // modes can just re-edge clamp back in again. + if ( edge == STBIR_EDGE_WRAP ) + if ( samp->filter_pixel_width > ( scale_info->input_full_size * 3 ) ) + samp->filter_pixel_width = scale_info->input_full_size * 3; + + // This is how much to expand buffers to account for filters seeking outside + // the image boundaries. + samp->filter_pixel_margin = samp->filter_pixel_width / 2; + + // filter_pixel_margin is the amount that this filter can overhang on just one side of either + // end of the scanline (left or the right). Since we only allow you to overhang 1 scanline's + // worth of pixels, we clamp this one side of overhang to the input scanline size. Again, + // this clamping only happens in rare cases with the default filters (2 pix to 1 pix). + if ( edge == STBIR_EDGE_WRAP ) + if ( samp->filter_pixel_margin > scale_info->input_full_size ) + samp->filter_pixel_margin = scale_info->input_full_size; + + samp->num_contributors = stbir__get_contributors(samp, samp->is_gather); + + samp->contributors_size = samp->num_contributors * sizeof(stbir__contributors); + samp->coefficients_size = samp->num_contributors * samp->coefficient_width * sizeof(float) + sizeof(float)*STBIR_INPUT_CALLBACK_PADDING; // extra sizeof(float) is padding + + samp->gather_prescatter_contributors = 0; + samp->gather_prescatter_coefficients = 0; + if ( samp->is_gather == 0 ) + { + samp->gather_prescatter_coefficient_width = samp->filter_pixel_width; + samp->gather_prescatter_num_contributors = stbir__get_contributors(samp, 2); + samp->gather_prescatter_contributors_size = samp->gather_prescatter_num_contributors * sizeof(stbir__contributors); + samp->gather_prescatter_coefficients_size = samp->gather_prescatter_num_contributors * samp->gather_prescatter_coefficient_width * sizeof(float); + } +} + +static void stbir__get_conservative_extents( stbir__sampler * samp, stbir__contributors * range, void * user_data ) +{ + float scale = samp->scale_info.scale; + float out_shift = samp->scale_info.pixel_shift; + stbir__support_callback * support = samp->filter_support; + int input_full_size = samp->scale_info.input_full_size; + stbir_edge edge = samp->edge; + float inv_scale = samp->scale_info.inv_scale; + + STBIR_ASSERT( samp->is_gather != 0 ); + + if ( samp->is_gather == 1 ) + { + int in_first_pixel, in_last_pixel; + float out_filter_radius = support(inv_scale, user_data) * scale; + + stbir__calculate_in_pixel_range( &in_first_pixel, &in_last_pixel, 0.5, out_filter_radius, inv_scale, out_shift, input_full_size, edge ); + range->n0 = in_first_pixel; + stbir__calculate_in_pixel_range( &in_first_pixel, &in_last_pixel, ( (float)(samp->scale_info.output_sub_size-1) ) + 0.5f, out_filter_radius, inv_scale, out_shift, input_full_size, edge ); + range->n1 = in_last_pixel; + } + else if ( samp->is_gather == 2 ) // downsample gather, refine + { + float in_pixels_radius = support(scale, user_data) * inv_scale; + int filter_pixel_margin = samp->filter_pixel_margin; + int output_sub_size = samp->scale_info.output_sub_size; + int input_end; + int n; + int in_first_pixel, in_last_pixel; + + // get a conservative area of the input range + stbir__calculate_in_pixel_range( &in_first_pixel, &in_last_pixel, 0, 0, inv_scale, out_shift, input_full_size, edge ); + range->n0 = in_first_pixel; + stbir__calculate_in_pixel_range( &in_first_pixel, &in_last_pixel, (float)output_sub_size, 0, inv_scale, out_shift, input_full_size, edge ); + range->n1 = in_last_pixel; + + // now go through the margin to the start of area to find bottom + n = range->n0 + 1; + input_end = -filter_pixel_margin; + while( n >= input_end ) + { + int out_first_pixel, out_last_pixel; + stbir__calculate_out_pixel_range( &out_first_pixel, &out_last_pixel, ((float)n)+0.5f, in_pixels_radius, scale, out_shift, output_sub_size ); + if ( out_first_pixel > out_last_pixel ) + break; + + if ( ( out_first_pixel < output_sub_size ) || ( out_last_pixel >= 0 ) ) + range->n0 = n; + --n; + } + + // now go through the end of the area through the margin to find top + n = range->n1 - 1; + input_end = n + 1 + filter_pixel_margin; + while( n <= input_end ) + { + int out_first_pixel, out_last_pixel; + stbir__calculate_out_pixel_range( &out_first_pixel, &out_last_pixel, ((float)n)+0.5f, in_pixels_radius, scale, out_shift, output_sub_size ); + if ( out_first_pixel > out_last_pixel ) + break; + if ( ( out_first_pixel < output_sub_size ) || ( out_last_pixel >= 0 ) ) + range->n1 = n; + ++n; + } + } + + if ( samp->edge == STBIR_EDGE_WRAP ) + { + // if we are wrapping, and we are very close to the image size (so the edges might merge), just use the scanline up to the edge + if ( ( range->n0 > 0 ) && ( range->n1 >= input_full_size ) ) + { + int marg = range->n1 - input_full_size + 1; + if ( ( marg + STBIR__MERGE_RUNS_PIXEL_THRESHOLD ) >= range->n0 ) + range->n0 = 0; + } + if ( ( range->n0 < 0 ) && ( range->n1 < (input_full_size-1) ) ) + { + int marg = -range->n0; + if ( ( input_full_size - marg - STBIR__MERGE_RUNS_PIXEL_THRESHOLD - 1 ) <= range->n1 ) + range->n1 = input_full_size - 1; + } + } + else + { + // for non-edge-wrap modes, we never read over the edge, so clamp + if ( range->n0 < 0 ) + range->n0 = 0; + if ( range->n1 >= input_full_size ) + range->n1 = input_full_size - 1; + } +} + +static void stbir__get_split_info( stbir__per_split_info* split_info, int splits, int output_height, int vertical_pixel_margin, int input_full_height, int is_gather, stbir__contributors * contribs ) +{ + int i, cur; + int left = output_height; + + cur = 0; + for( i = 0 ; i < splits ; i++ ) + { + int each; + + split_info[i].start_output_y = cur; + each = left / ( splits - i ); + split_info[i].end_output_y = cur + each; + + // ok, when we are gathering, we need to make sure we are starting on a y offset that doesn't have + // a "special" set of coefficients. Basically, with exactly the right filter at exactly the right + // resize at exactly the right phase, some of the coefficents can be zero. When they are zero, we + // don't process them at all. But this leads to a tricky thing with the thread splits, where we + // might have a set of two coeffs like this for example: (4,4) and (3,6). The 4,4 means there was + // just one single coeff because things worked out perfectly (normally, they all have 4 coeffs + // like the range 3,6. The problem is that if we start right on the (4,4) on a brand new thread, + // then when we get to (3,6), we don't have the "3" sample in memory (because we didn't load + // it on the initial (4,4) range because it didn't have a 3 (we only add new samples that are + // larger than our existing samples - it's just how the eviction works). So, our solution here + // is pretty simple, if we start right on a range that has samples that start earlier, then we + // simply bump up our previous thread split range to include it, and then start this threads + // range with the smaller sample. It just moves one scanline from one thread split to another, + // so that we end with the unusual one, instead of start with it. To do this, we check 2-4 + // sample at each thread split start and then occassionally move them. + + if ( ( is_gather ) && ( i ) ) + { + stbir__contributors * small_contribs; + int j, smallest, stop, start_n0; + stbir__contributors * split_contribs = contribs + cur; + + // scan for a max of 3x the filter width or until the next thread split + stop = vertical_pixel_margin * 3; + if ( each < stop ) + stop = each; + + // loops a few times before early out + smallest = 0; + small_contribs = split_contribs; + start_n0 = small_contribs->n0; + for( j = 1 ; j <= stop ; j++ ) + { + ++split_contribs; + if ( split_contribs->n0 > start_n0 ) + break; + if ( split_contribs->n0 < small_contribs->n0 ) + { + small_contribs = split_contribs; + smallest = j; + } + } + + split_info[i-1].end_output_y += smallest; + split_info[i].start_output_y += smallest; + } + + cur += each; + left -= each; + + // scatter range (updated to minimum as you run it) + split_info[i].start_input_y = -vertical_pixel_margin; + split_info[i].end_input_y = input_full_height + vertical_pixel_margin; + } +} + +static void stbir__free_internal_mem( stbir__info *info ) +{ + #define STBIR__FREE_AND_CLEAR( ptr ) { if ( ptr ) { void * p = (ptr); (ptr) = 0; STBIR_FREE( p, info->user_data); } } + + if ( info ) + { + #ifndef STBIR__SEPARATE_ALLOCATIONS + STBIR__FREE_AND_CLEAR( info->alloced_mem ); + #else + int i,j; + + if ( ( info->vertical.gather_prescatter_contributors ) && ( (void*)info->vertical.gather_prescatter_contributors != (void*)info->split_info[0].decode_buffer ) ) + { + STBIR__FREE_AND_CLEAR( info->vertical.gather_prescatter_coefficients ); + STBIR__FREE_AND_CLEAR( info->vertical.gather_prescatter_contributors ); + } + for( i = 0 ; i < info->splits ; i++ ) + { + for( j = 0 ; j < info->alloc_ring_buffer_num_entries ; j++ ) + { + #ifdef STBIR_SIMD8 + if ( info->effective_channels == 3 ) + --info->split_info[i].ring_buffers[j]; // avx in 3 channel mode needs one float at the start of the buffer + #endif + STBIR__FREE_AND_CLEAR( info->split_info[i].ring_buffers[j] ); + } + + #ifdef STBIR_SIMD8 + if ( info->effective_channels == 3 ) + --info->split_info[i].decode_buffer; // avx in 3 channel mode needs one float at the start of the buffer + #endif + STBIR__FREE_AND_CLEAR( info->split_info[i].decode_buffer ); + STBIR__FREE_AND_CLEAR( info->split_info[i].ring_buffers ); + STBIR__FREE_AND_CLEAR( info->split_info[i].vertical_buffer ); + } + STBIR__FREE_AND_CLEAR( info->split_info ); + if ( info->vertical.coefficients != info->horizontal.coefficients ) + { + STBIR__FREE_AND_CLEAR( info->vertical.coefficients ); + STBIR__FREE_AND_CLEAR( info->vertical.contributors ); + } + STBIR__FREE_AND_CLEAR( info->horizontal.coefficients ); + STBIR__FREE_AND_CLEAR( info->horizontal.contributors ); + STBIR__FREE_AND_CLEAR( info->alloced_mem ); + STBIR_FREE( info, info->user_data ); + #endif + } + + #undef STBIR__FREE_AND_CLEAR +} + +static int stbir__get_max_split( int splits, int height ) +{ + int i; + int max = 0; + + for( i = 0 ; i < splits ; i++ ) + { + int each = height / ( splits - i ); + if ( each > max ) + max = each; + height -= each; + } + return max; +} + +static stbir__horizontal_gather_channels_func ** stbir__horizontal_gather_n_coeffs_funcs[8] = +{ + 0, stbir__horizontal_gather_1_channels_with_n_coeffs_funcs, stbir__horizontal_gather_2_channels_with_n_coeffs_funcs, stbir__horizontal_gather_3_channels_with_n_coeffs_funcs, stbir__horizontal_gather_4_channels_with_n_coeffs_funcs, 0,0, stbir__horizontal_gather_7_channels_with_n_coeffs_funcs +}; + +static stbir__horizontal_gather_channels_func ** stbir__horizontal_gather_channels_funcs[8] = +{ + 0, stbir__horizontal_gather_1_channels_funcs, stbir__horizontal_gather_2_channels_funcs, stbir__horizontal_gather_3_channels_funcs, stbir__horizontal_gather_4_channels_funcs, 0,0, stbir__horizontal_gather_7_channels_funcs +}; + +// there are six resize classifications: 0 == vertical scatter, 1 == vertical gather < 1x scale, 2 == vertical gather 1x-2x scale, 4 == vertical gather < 3x scale, 4 == vertical gather > 3x scale, 5 == <=4 pixel height, 6 == <=4 pixel wide column +#define STBIR_RESIZE_CLASSIFICATIONS 8 + +static float stbir__compute_weights[5][STBIR_RESIZE_CLASSIFICATIONS][4]= // 5 = 0=1chan, 1=2chan, 2=3chan, 3=4chan, 4=7chan +{ + { + { 1.00000f, 1.00000f, 0.31250f, 1.00000f }, + { 0.56250f, 0.59375f, 0.00000f, 0.96875f }, + { 1.00000f, 0.06250f, 0.00000f, 1.00000f }, + { 0.00000f, 0.09375f, 1.00000f, 1.00000f }, + { 1.00000f, 1.00000f, 0.31250f, 1.00000f }, + { 0.03125f, 0.12500f, 1.00000f, 1.00000f }, + { 1.00000f, 1.00000f, 0.06250f, 1.00000f }, + { 0.00000f, 1.00000f, 0.00000f, 0.03125f }, + }, { + { 0.00000f, 0.84375f, 0.00000f, 0.03125f }, + { 0.09375f, 0.93750f, 0.00000f, 0.78125f }, + { 0.87500f, 0.21875f, 0.00000f, 0.96875f }, + { 0.09375f, 0.09375f, 1.00000f, 1.00000f }, + { 0.00000f, 0.84375f, 0.00000f, 0.03125f }, + { 0.03125f, 0.12500f, 1.00000f, 1.00000f }, + { 1.00000f, 1.00000f, 0.06250f, 1.00000f }, + { 0.00000f, 1.00000f, 0.00000f, 0.53125f }, + }, { + { 0.00000f, 0.53125f, 0.00000f, 0.03125f }, + { 0.06250f, 0.96875f, 0.00000f, 0.53125f }, + { 0.87500f, 0.18750f, 0.00000f, 0.93750f }, + { 0.00000f, 0.09375f, 1.00000f, 1.00000f }, + { 0.00000f, 0.53125f, 0.00000f, 0.03125f }, + { 0.03125f, 0.12500f, 1.00000f, 1.00000f }, + { 1.00000f, 1.00000f, 0.06250f, 1.00000f }, + { 0.00000f, 1.00000f, 0.00000f, 0.56250f }, + }, { + { 0.00000f, 0.50000f, 0.00000f, 0.71875f }, + { 0.06250f, 0.84375f, 0.00000f, 0.87500f }, + { 1.00000f, 0.50000f, 0.50000f, 0.96875f }, + { 1.00000f, 0.09375f, 0.31250f, 0.50000f }, + { 0.00000f, 0.50000f, 0.00000f, 0.71875f }, + { 1.00000f, 0.03125f, 0.03125f, 0.53125f }, + { 1.00000f, 1.00000f, 0.06250f, 1.00000f }, + { 0.00000f, 1.00000f, 0.03125f, 0.18750f }, + }, { + { 0.00000f, 0.59375f, 0.00000f, 0.96875f }, + { 0.06250f, 0.81250f, 0.06250f, 0.59375f }, + { 0.75000f, 0.43750f, 0.12500f, 0.96875f }, + { 0.87500f, 0.06250f, 0.18750f, 0.43750f }, + { 0.00000f, 0.59375f, 0.00000f, 0.96875f }, + { 0.15625f, 0.12500f, 1.00000f, 1.00000f }, + { 1.00000f, 1.00000f, 0.06250f, 1.00000f }, + { 0.00000f, 1.00000f, 0.03125f, 0.34375f }, + } +}; + +// structure that allow us to query and override info for training the costs +typedef struct STBIR__V_FIRST_INFO +{ + double v_cost, h_cost; + int control_v_first; // 0 = no control, 1 = force hori, 2 = force vert + int v_first; + int v_resize_classification; + int is_gather; +} STBIR__V_FIRST_INFO; + +#ifdef STBIR__V_FIRST_INFO_BUFFER +static STBIR__V_FIRST_INFO STBIR__V_FIRST_INFO_BUFFER = {0}; +#define STBIR__V_FIRST_INFO_POINTER &STBIR__V_FIRST_INFO_BUFFER +#else +#define STBIR__V_FIRST_INFO_POINTER 0 +#endif + +// Figure out whether to scale along the horizontal or vertical first. +// This only *super* important when you are scaling by a massively +// different amount in the vertical vs the horizontal (for example, if +// you are scaling by 2x in the width, and 0.5x in the height, then you +// want to do the vertical scale first, because it's around 3x faster +// in that order. +// +// In more normal circumstances, this makes a 20-40% differences, so +// it's good to get right, but not critical. The normal way that you +// decide which direction goes first is just figuring out which +// direction does more multiplies. But with modern CPUs with their +// fancy caches and SIMD and high IPC abilities, so there's just a lot +// more that goes into it. +// +// My handwavy sort of solution is to have an app that does a whole +// bunch of timing for both vertical and horizontal first modes, +// and then another app that can read lots of these timing files +// and try to search for the best weights to use. Dotimings.c +// is the app that does a bunch of timings, and vf_train.c is the +// app that solves for the best weights (and shows how well it +// does currently). + +static int stbir__should_do_vertical_first( float weights_table[STBIR_RESIZE_CLASSIFICATIONS][4], int horizontal_filter_pixel_width, float horizontal_scale, int horizontal_output_size, int vertical_filter_pixel_width, float vertical_scale, int vertical_output_size, int is_gather, STBIR__V_FIRST_INFO * info ) +{ + double v_cost, h_cost; + float * weights; + int vertical_first; + int v_classification; + + // categorize the resize into buckets + if ( ( vertical_output_size <= 4 ) || ( horizontal_output_size <= 4 ) ) + v_classification = ( vertical_output_size < horizontal_output_size ) ? 6 : 7; + else if ( ( !is_gather ) && ( ( vertical_output_size <= 16 ) || ( horizontal_output_size <= 16 ) ) ) + v_classification = 4; + else if ( vertical_scale <= 1.0f ) + v_classification = ( is_gather ) ? 1 : 0; + else if ( vertical_scale <= 2.0f) + v_classification = 2; + else if ( vertical_scale <= 3.0f) + v_classification = 3; + else + v_classification = 5; // everything bigger than 3x + + // use the right weights + weights = weights_table[ v_classification ]; + + // this is the costs when you don't take into account modern CPUs with high ipc and simd and caches - wish we had a better estimate + h_cost = (float)horizontal_filter_pixel_width * weights[0] + horizontal_scale * (float)vertical_filter_pixel_width * weights[1]; + v_cost = (float)vertical_filter_pixel_width * weights[2] + vertical_scale * (float)horizontal_filter_pixel_width * weights[3]; + + // use computation estimate to decide vertical first or not + vertical_first = ( v_cost <= h_cost ) ? 1 : 0; + + // save these, if requested + if ( info ) + { + info->h_cost = h_cost; + info->v_cost = v_cost; + info->v_resize_classification = v_classification; + info->v_first = vertical_first; + info->is_gather = is_gather; + } + + // and this allows us to override everything for testing (see dotiming.c) + if ( ( info ) && ( info->control_v_first ) ) + vertical_first = ( info->control_v_first == 2 ) ? 1 : 0; + + return vertical_first; +} + +// layout lookups - must match stbir_internal_pixel_layout +static unsigned char stbir__pixel_channels[] = { + 1,2,3,3,4, // 1ch, 2ch, rgb, bgr, 4ch + 4,4,4,4,2,2, // RGBA,BGRA,ARGB,ABGR,RA,AR + 4,4,4,4,2,2, // RGBA_PM,BGRA_PM,ARGB_PM,ABGR_PM,RA_PM,AR_PM +}; + +// the internal pixel layout enums are in a different order, so we can easily do range comparisons of types +// the public pixel layout is ordered in a way that if you cast num_channels (1-4) to the enum, you get something sensible +static stbir_internal_pixel_layout stbir__pixel_layout_convert_public_to_internal[] = { + STBIRI_BGR, STBIRI_1CHANNEL, STBIRI_2CHANNEL, STBIRI_RGB, STBIRI_RGBA, + STBIRI_4CHANNEL, STBIRI_BGRA, STBIRI_ARGB, STBIRI_ABGR, STBIRI_RA, STBIRI_AR, + STBIRI_RGBA_PM, STBIRI_BGRA_PM, STBIRI_ARGB_PM, STBIRI_ABGR_PM, STBIRI_RA_PM, STBIRI_AR_PM, +}; + +static stbir__info * stbir__alloc_internal_mem_and_build_samplers( stbir__sampler * horizontal, stbir__sampler * vertical, stbir__contributors * conservative, stbir_pixel_layout input_pixel_layout_public, stbir_pixel_layout output_pixel_layout_public, int splits, int new_x, int new_y, int fast_alpha, void * user_data STBIR_ONLY_PROFILE_BUILD_GET_INFO ) +{ + static char stbir_channel_count_index[8]={ 9,0,1,2, 3,9,9,4 }; + + stbir__info * info = 0; + void * alloced = 0; + size_t alloced_total = 0; + int vertical_first; + size_t decode_buffer_size, ring_buffer_length_bytes, ring_buffer_size, vertical_buffer_size; + int alloc_ring_buffer_num_entries; + + int alpha_weighting_type = 0; // 0=none, 1=simple, 2=fancy + int conservative_split_output_size = stbir__get_max_split( splits, vertical->scale_info.output_sub_size ); + stbir_internal_pixel_layout input_pixel_layout = stbir__pixel_layout_convert_public_to_internal[ input_pixel_layout_public ]; + stbir_internal_pixel_layout output_pixel_layout = stbir__pixel_layout_convert_public_to_internal[ output_pixel_layout_public ]; + int channels = stbir__pixel_channels[ input_pixel_layout ]; + int effective_channels = channels; + + // first figure out what type of alpha weighting to use (if any) + if ( ( horizontal->filter_enum != STBIR_FILTER_POINT_SAMPLE ) || ( vertical->filter_enum != STBIR_FILTER_POINT_SAMPLE ) ) // no alpha weighting on point sampling + { + if ( ( input_pixel_layout >= STBIRI_RGBA ) && ( input_pixel_layout <= STBIRI_AR ) && ( output_pixel_layout >= STBIRI_RGBA ) && ( output_pixel_layout <= STBIRI_AR ) ) + { + if ( fast_alpha ) + { + alpha_weighting_type = 4; + } + else + { + static int fancy_alpha_effective_cnts[6] = { 7, 7, 7, 7, 3, 3 }; + alpha_weighting_type = 2; + effective_channels = fancy_alpha_effective_cnts[ input_pixel_layout - STBIRI_RGBA ]; + } + } + else if ( ( input_pixel_layout >= STBIRI_RGBA_PM ) && ( input_pixel_layout <= STBIRI_AR_PM ) && ( output_pixel_layout >= STBIRI_RGBA ) && ( output_pixel_layout <= STBIRI_AR ) ) + { + // input premult, output non-premult + alpha_weighting_type = 3; + } + else if ( ( input_pixel_layout >= STBIRI_RGBA ) && ( input_pixel_layout <= STBIRI_AR ) && ( output_pixel_layout >= STBIRI_RGBA_PM ) && ( output_pixel_layout <= STBIRI_AR_PM ) ) + { + // input non-premult, output premult + alpha_weighting_type = 1; + } + } + + // channel in and out count must match currently + if ( channels != stbir__pixel_channels[ output_pixel_layout ] ) + return 0; + + // get vertical first + vertical_first = stbir__should_do_vertical_first( stbir__compute_weights[ (int)stbir_channel_count_index[ effective_channels ] ], horizontal->filter_pixel_width, horizontal->scale_info.scale, horizontal->scale_info.output_sub_size, vertical->filter_pixel_width, vertical->scale_info.scale, vertical->scale_info.output_sub_size, vertical->is_gather, STBIR__V_FIRST_INFO_POINTER ); + + // sometimes read one float off in some of the unrolled loops (with a weight of zero coeff, so it doesn't have an effect) + // we use a few extra floats instead of just 1, so that input callback buffer can overlap with the decode buffer without + // the conversion routines overwriting the callback input data. + decode_buffer_size = ( conservative->n1 - conservative->n0 + 1 ) * effective_channels * sizeof(float) + sizeof(float)*STBIR_INPUT_CALLBACK_PADDING; // extra floats for input callback stagger + +#if defined( STBIR__SEPARATE_ALLOCATIONS ) && defined(STBIR_SIMD8) + if ( effective_channels == 3 ) + decode_buffer_size += sizeof(float); // avx in 3 channel mode needs one float at the start of the buffer (only with separate allocations) +#endif + + ring_buffer_length_bytes = (size_t)horizontal->scale_info.output_sub_size * (size_t)effective_channels * sizeof(float) + sizeof(float)*STBIR_INPUT_CALLBACK_PADDING; // extra floats for padding + + // if we do vertical first, the ring buffer holds a whole decoded line + if ( vertical_first ) + ring_buffer_length_bytes = ( decode_buffer_size + 15 ) & ~15; + + if ( ( ring_buffer_length_bytes & 4095 ) == 0 ) ring_buffer_length_bytes += 64*3; // avoid 4k alias + + // One extra entry because floating point precision problems sometimes cause an extra to be necessary. + alloc_ring_buffer_num_entries = vertical->filter_pixel_width + 1; + + // we never need more ring buffer entries than the scanlines we're outputting when in scatter mode + if ( ( !vertical->is_gather ) && ( alloc_ring_buffer_num_entries > conservative_split_output_size ) ) + alloc_ring_buffer_num_entries = conservative_split_output_size; + + ring_buffer_size = (size_t)alloc_ring_buffer_num_entries * (size_t)ring_buffer_length_bytes; + + // The vertical buffer is used differently, depending on whether we are scattering + // the vertical scanlines, or gathering them. + // If scattering, it's used at the temp buffer to accumulate each output. + // If gathering, it's just the output buffer. + vertical_buffer_size = (size_t)horizontal->scale_info.output_sub_size * (size_t)effective_channels * sizeof(float) + sizeof(float); // extra float for padding + + // we make two passes through this loop, 1st to add everything up, 2nd to allocate and init + for(;;) + { + int i; + void * advance_mem = alloced; + int copy_horizontal = 0; + stbir__sampler * possibly_use_horizontal_for_pivot = 0; + +#ifdef STBIR__SEPARATE_ALLOCATIONS + #define STBIR__NEXT_PTR( ptr, size, ntype ) if ( alloced ) { void * p = STBIR_MALLOC( size, user_data); if ( p == 0 ) { stbir__free_internal_mem( info ); return 0; } (ptr) = (ntype*)p; } +#else + #define STBIR__NEXT_PTR( ptr, size, ntype ) advance_mem = (void*) ( ( ((size_t)advance_mem) + 15 ) & ~15 ); if ( alloced ) ptr = (ntype*)advance_mem; advance_mem = (char*)(((size_t)advance_mem) + (size)); +#endif + + STBIR__NEXT_PTR( info, sizeof( stbir__info ), stbir__info ); + + STBIR__NEXT_PTR( info->split_info, sizeof( stbir__per_split_info ) * splits, stbir__per_split_info ); + + if ( info ) + { + static stbir__alpha_weight_func * fancy_alpha_weights[6] = { stbir__fancy_alpha_weight_4ch, stbir__fancy_alpha_weight_4ch, stbir__fancy_alpha_weight_4ch, stbir__fancy_alpha_weight_4ch, stbir__fancy_alpha_weight_2ch, stbir__fancy_alpha_weight_2ch }; + static stbir__alpha_unweight_func * fancy_alpha_unweights[6] = { stbir__fancy_alpha_unweight_4ch, stbir__fancy_alpha_unweight_4ch, stbir__fancy_alpha_unweight_4ch, stbir__fancy_alpha_unweight_4ch, stbir__fancy_alpha_unweight_2ch, stbir__fancy_alpha_unweight_2ch }; + static stbir__alpha_weight_func * simple_alpha_weights[6] = { stbir__simple_alpha_weight_4ch, stbir__simple_alpha_weight_4ch, stbir__simple_alpha_weight_4ch, stbir__simple_alpha_weight_4ch, stbir__simple_alpha_weight_2ch, stbir__simple_alpha_weight_2ch }; + static stbir__alpha_unweight_func * simple_alpha_unweights[6] = { stbir__simple_alpha_unweight_4ch, stbir__simple_alpha_unweight_4ch, stbir__simple_alpha_unweight_4ch, stbir__simple_alpha_unweight_4ch, stbir__simple_alpha_unweight_2ch, stbir__simple_alpha_unweight_2ch }; + + // initialize info fields + info->alloced_mem = alloced; + info->alloced_total = alloced_total; + + info->channels = channels; + info->effective_channels = effective_channels; + + info->offset_x = new_x; + info->offset_y = new_y; + info->alloc_ring_buffer_num_entries = (int)alloc_ring_buffer_num_entries; + info->ring_buffer_num_entries = 0; + info->ring_buffer_length_bytes = (int)ring_buffer_length_bytes; + info->splits = splits; + info->vertical_first = vertical_first; + + info->input_pixel_layout_internal = input_pixel_layout; + info->output_pixel_layout_internal = output_pixel_layout; + + // setup alpha weight functions + info->alpha_weight = 0; + info->alpha_unweight = 0; + + // handle alpha weighting functions and overrides + if ( alpha_weighting_type == 2 ) + { + // high quality alpha multiplying on the way in, dividing on the way out + info->alpha_weight = fancy_alpha_weights[ input_pixel_layout - STBIRI_RGBA ]; + info->alpha_unweight = fancy_alpha_unweights[ output_pixel_layout - STBIRI_RGBA ]; + } + else if ( alpha_weighting_type == 4 ) + { + // fast alpha multiplying on the way in, dividing on the way out + info->alpha_weight = simple_alpha_weights[ input_pixel_layout - STBIRI_RGBA ]; + info->alpha_unweight = simple_alpha_unweights[ output_pixel_layout - STBIRI_RGBA ]; + } + else if ( alpha_weighting_type == 1 ) + { + // fast alpha on the way in, leave in premultiplied form on way out + info->alpha_weight = simple_alpha_weights[ input_pixel_layout - STBIRI_RGBA ]; + } + else if ( alpha_weighting_type == 3 ) + { + // incoming is premultiplied, fast alpha dividing on the way out - non-premultiplied output + info->alpha_unweight = simple_alpha_unweights[ output_pixel_layout - STBIRI_RGBA ]; + } + + // handle 3-chan color flipping, using the alpha weight path + if ( ( ( input_pixel_layout == STBIRI_RGB ) && ( output_pixel_layout == STBIRI_BGR ) ) || + ( ( input_pixel_layout == STBIRI_BGR ) && ( output_pixel_layout == STBIRI_RGB ) ) ) + { + // do the flipping on the smaller of the two ends + if ( horizontal->scale_info.scale < 1.0f ) + info->alpha_unweight = stbir__simple_flip_3ch; + else + info->alpha_weight = stbir__simple_flip_3ch; + } + + } + + // get all the per-split buffers + for( i = 0 ; i < splits ; i++ ) + { + STBIR__NEXT_PTR( info->split_info[i].decode_buffer, decode_buffer_size, float ); + +#ifdef STBIR__SEPARATE_ALLOCATIONS + + #ifdef STBIR_SIMD8 + if ( ( info ) && ( effective_channels == 3 ) ) + ++info->split_info[i].decode_buffer; // avx in 3 channel mode needs one float at the start of the buffer + #endif + + STBIR__NEXT_PTR( info->split_info[i].ring_buffers, alloc_ring_buffer_num_entries * sizeof(float*), float* ); + { + int j; + for( j = 0 ; j < alloc_ring_buffer_num_entries ; j++ ) + { + STBIR__NEXT_PTR( info->split_info[i].ring_buffers[j], ring_buffer_length_bytes, float ); + #ifdef STBIR_SIMD8 + if ( ( info ) && ( effective_channels == 3 ) ) + ++info->split_info[i].ring_buffers[j]; // avx in 3 channel mode needs one float at the start of the buffer + #endif + } + } +#else + STBIR__NEXT_PTR( info->split_info[i].ring_buffer, ring_buffer_size, float ); +#endif + STBIR__NEXT_PTR( info->split_info[i].vertical_buffer, vertical_buffer_size, float ); + } + + // alloc memory for to-be-pivoted coeffs (if necessary) + if ( vertical->is_gather == 0 ) + { + size_t both; + size_t temp_mem_amt; + + // when in vertical scatter mode, we first build the coefficients in gather mode, and then pivot after, + // that means we need two buffers, so we try to use the decode buffer and ring buffer for this. if that + // is too small, we just allocate extra memory to use as this temp. + + both = (size_t)vertical->gather_prescatter_contributors_size + (size_t)vertical->gather_prescatter_coefficients_size; + +#ifdef STBIR__SEPARATE_ALLOCATIONS + temp_mem_amt = decode_buffer_size; + + #ifdef STBIR_SIMD8 + if ( effective_channels == 3 ) + --temp_mem_amt; // avx in 3 channel mode needs one float at the start of the buffer + #endif +#else + temp_mem_amt = (size_t)( decode_buffer_size + ring_buffer_size + vertical_buffer_size ) * (size_t)splits; +#endif + if ( temp_mem_amt >= both ) + { + if ( info ) + { + vertical->gather_prescatter_contributors = (stbir__contributors*)info->split_info[0].decode_buffer; + vertical->gather_prescatter_coefficients = (float*) ( ( (char*)info->split_info[0].decode_buffer ) + vertical->gather_prescatter_contributors_size ); + } + } + else + { + // ring+decode memory is too small, so allocate temp memory + STBIR__NEXT_PTR( vertical->gather_prescatter_contributors, vertical->gather_prescatter_contributors_size, stbir__contributors ); + STBIR__NEXT_PTR( vertical->gather_prescatter_coefficients, vertical->gather_prescatter_coefficients_size, float ); + } + } + + STBIR__NEXT_PTR( horizontal->contributors, horizontal->contributors_size, stbir__contributors ); + STBIR__NEXT_PTR( horizontal->coefficients, horizontal->coefficients_size, float ); + + // are the two filters identical?? (happens a lot with mipmap generation) + if ( ( horizontal->filter_kernel == vertical->filter_kernel ) && ( horizontal->filter_support == vertical->filter_support ) && ( horizontal->edge == vertical->edge ) && ( horizontal->scale_info.output_sub_size == vertical->scale_info.output_sub_size ) ) + { + float diff_scale = horizontal->scale_info.scale - vertical->scale_info.scale; + float diff_shift = horizontal->scale_info.pixel_shift - vertical->scale_info.pixel_shift; + if ( diff_scale < 0.0f ) diff_scale = -diff_scale; + if ( diff_shift < 0.0f ) diff_shift = -diff_shift; + if ( ( diff_scale <= stbir__small_float ) && ( diff_shift <= stbir__small_float ) ) + { + if ( horizontal->is_gather == vertical->is_gather ) + { + copy_horizontal = 1; + goto no_vert_alloc; + } + // everything matches, but vertical is scatter, horizontal is gather, use horizontal coeffs for vertical pivot coeffs + possibly_use_horizontal_for_pivot = horizontal; + } + } + + STBIR__NEXT_PTR( vertical->contributors, vertical->contributors_size, stbir__contributors ); + STBIR__NEXT_PTR( vertical->coefficients, vertical->coefficients_size, float ); + + no_vert_alloc: + + if ( info ) + { + STBIR_PROFILE_BUILD_START( horizontal ); + + stbir__calculate_filters( horizontal, 0, user_data STBIR_ONLY_PROFILE_BUILD_SET_INFO ); + + // setup the horizontal gather functions + // start with defaulting to the n_coeffs functions (specialized on channels and remnant leftover) + info->horizontal_gather_channels = stbir__horizontal_gather_n_coeffs_funcs[ effective_channels ][ horizontal->extent_info.widest & 3 ]; + // but if the number of coeffs <= 12, use another set of special cases. <=12 coeffs is any enlarging resize, or shrinking resize down to about 1/3 size + if ( horizontal->extent_info.widest <= 12 ) + info->horizontal_gather_channels = stbir__horizontal_gather_channels_funcs[ effective_channels ][ horizontal->extent_info.widest - 1 ]; + + info->scanline_extents.conservative.n0 = conservative->n0; + info->scanline_extents.conservative.n1 = conservative->n1; + + // get exact extents + stbir__get_extents( horizontal, &info->scanline_extents ); + + // pack the horizontal coeffs + horizontal->coefficient_width = stbir__pack_coefficients(horizontal->num_contributors, horizontal->contributors, horizontal->coefficients, horizontal->coefficient_width, horizontal->extent_info.widest, info->scanline_extents.conservative.n0, info->scanline_extents.conservative.n1 ); + + STBIR_MEMCPY( &info->horizontal, horizontal, sizeof( stbir__sampler ) ); + + STBIR_PROFILE_BUILD_END( horizontal ); + + if ( copy_horizontal ) + { + STBIR_MEMCPY( &info->vertical, horizontal, sizeof( stbir__sampler ) ); + } + else + { + STBIR_PROFILE_BUILD_START( vertical ); + + stbir__calculate_filters( vertical, possibly_use_horizontal_for_pivot, user_data STBIR_ONLY_PROFILE_BUILD_SET_INFO ); + STBIR_MEMCPY( &info->vertical, vertical, sizeof( stbir__sampler ) ); + + STBIR_PROFILE_BUILD_END( vertical ); + } + + // setup the vertical split ranges + stbir__get_split_info( info->split_info, info->splits, info->vertical.scale_info.output_sub_size, info->vertical.filter_pixel_margin, info->vertical.scale_info.input_full_size, info->vertical.is_gather, info->vertical.contributors ); + + // now we know precisely how many entries we need + info->ring_buffer_num_entries = info->vertical.extent_info.widest; + + // we never need more ring buffer entries than the scanlines we're outputting + if ( ( !info->vertical.is_gather ) && ( info->ring_buffer_num_entries > conservative_split_output_size ) ) + info->ring_buffer_num_entries = conservative_split_output_size; + STBIR_ASSERT( info->ring_buffer_num_entries <= info->alloc_ring_buffer_num_entries ); + } + #undef STBIR__NEXT_PTR + + + // is this the first time through loop? + if ( info == 0 ) + { + alloced_total = ( 15 + (size_t)advance_mem ); + alloced = STBIR_MALLOC( alloced_total, user_data ); + if ( alloced == 0 ) + return 0; + } + else + return info; // success + } +} + +static int stbir__perform_resize( stbir__info const * info, int split_start, int split_count ) +{ + stbir__per_split_info * split_info = info->split_info + split_start; + + STBIR_PROFILE_CLEAR_EXTRAS(); + + STBIR_PROFILE_FIRST_START( looping ); + if (info->vertical.is_gather) + stbir__vertical_gather_loop( info, split_info, split_count ); + else + stbir__vertical_scatter_loop( info, split_info, split_count ); + STBIR_PROFILE_END( looping ); + + return 1; +} + +static void stbir__update_info_from_resize( stbir__info * info, STBIR_RESIZE * resize ) +{ + static stbir__decode_pixels_func * decode_simple[STBIR_TYPE_HALF_FLOAT-STBIR_TYPE_UINT8_SRGB+1]= + { + /* 1ch-4ch */ stbir__decode_uint8_srgb, stbir__decode_uint8_srgb, 0, stbir__decode_float_linear, stbir__decode_half_float_linear, + }; + + static stbir__decode_pixels_func * decode_alphas[STBIRI_AR-STBIRI_RGBA+1][STBIR_TYPE_HALF_FLOAT-STBIR_TYPE_UINT8_SRGB+1]= + { + { /* RGBA */ stbir__decode_uint8_srgb4_linearalpha, stbir__decode_uint8_srgb, 0, stbir__decode_float_linear, stbir__decode_half_float_linear }, + { /* BGRA */ stbir__decode_uint8_srgb4_linearalpha_BGRA, stbir__decode_uint8_srgb_BGRA, 0, stbir__decode_float_linear_BGRA, stbir__decode_half_float_linear_BGRA }, + { /* ARGB */ stbir__decode_uint8_srgb4_linearalpha_ARGB, stbir__decode_uint8_srgb_ARGB, 0, stbir__decode_float_linear_ARGB, stbir__decode_half_float_linear_ARGB }, + { /* ABGR */ stbir__decode_uint8_srgb4_linearalpha_ABGR, stbir__decode_uint8_srgb_ABGR, 0, stbir__decode_float_linear_ABGR, stbir__decode_half_float_linear_ABGR }, + { /* RA */ stbir__decode_uint8_srgb2_linearalpha, stbir__decode_uint8_srgb, 0, stbir__decode_float_linear, stbir__decode_half_float_linear }, + { /* AR */ stbir__decode_uint8_srgb2_linearalpha_AR, stbir__decode_uint8_srgb_AR, 0, stbir__decode_float_linear_AR, stbir__decode_half_float_linear_AR }, + }; + + static stbir__decode_pixels_func * decode_simple_scaled_or_not[2][2]= + { + { stbir__decode_uint8_linear_scaled, stbir__decode_uint8_linear }, { stbir__decode_uint16_linear_scaled, stbir__decode_uint16_linear }, + }; + + static stbir__decode_pixels_func * decode_alphas_scaled_or_not[STBIRI_AR-STBIRI_RGBA+1][2][2]= + { + { /* RGBA */ { stbir__decode_uint8_linear_scaled, stbir__decode_uint8_linear }, { stbir__decode_uint16_linear_scaled, stbir__decode_uint16_linear } }, + { /* BGRA */ { stbir__decode_uint8_linear_scaled_BGRA, stbir__decode_uint8_linear_BGRA }, { stbir__decode_uint16_linear_scaled_BGRA, stbir__decode_uint16_linear_BGRA } }, + { /* ARGB */ { stbir__decode_uint8_linear_scaled_ARGB, stbir__decode_uint8_linear_ARGB }, { stbir__decode_uint16_linear_scaled_ARGB, stbir__decode_uint16_linear_ARGB } }, + { /* ABGR */ { stbir__decode_uint8_linear_scaled_ABGR, stbir__decode_uint8_linear_ABGR }, { stbir__decode_uint16_linear_scaled_ABGR, stbir__decode_uint16_linear_ABGR } }, + { /* RA */ { stbir__decode_uint8_linear_scaled, stbir__decode_uint8_linear }, { stbir__decode_uint16_linear_scaled, stbir__decode_uint16_linear } }, + { /* AR */ { stbir__decode_uint8_linear_scaled_AR, stbir__decode_uint8_linear_AR }, { stbir__decode_uint16_linear_scaled_AR, stbir__decode_uint16_linear_AR } } + }; + + static stbir__encode_pixels_func * encode_simple[STBIR_TYPE_HALF_FLOAT-STBIR_TYPE_UINT8_SRGB+1]= + { + /* 1ch-4ch */ stbir__encode_uint8_srgb, stbir__encode_uint8_srgb, 0, stbir__encode_float_linear, stbir__encode_half_float_linear, + }; + + static stbir__encode_pixels_func * encode_alphas[STBIRI_AR-STBIRI_RGBA+1][STBIR_TYPE_HALF_FLOAT-STBIR_TYPE_UINT8_SRGB+1]= + { + { /* RGBA */ stbir__encode_uint8_srgb4_linearalpha, stbir__encode_uint8_srgb, 0, stbir__encode_float_linear, stbir__encode_half_float_linear }, + { /* BGRA */ stbir__encode_uint8_srgb4_linearalpha_BGRA, stbir__encode_uint8_srgb_BGRA, 0, stbir__encode_float_linear_BGRA, stbir__encode_half_float_linear_BGRA }, + { /* ARGB */ stbir__encode_uint8_srgb4_linearalpha_ARGB, stbir__encode_uint8_srgb_ARGB, 0, stbir__encode_float_linear_ARGB, stbir__encode_half_float_linear_ARGB }, + { /* ABGR */ stbir__encode_uint8_srgb4_linearalpha_ABGR, stbir__encode_uint8_srgb_ABGR, 0, stbir__encode_float_linear_ABGR, stbir__encode_half_float_linear_ABGR }, + { /* RA */ stbir__encode_uint8_srgb2_linearalpha, stbir__encode_uint8_srgb, 0, stbir__encode_float_linear, stbir__encode_half_float_linear }, + { /* AR */ stbir__encode_uint8_srgb2_linearalpha_AR, stbir__encode_uint8_srgb_AR, 0, stbir__encode_float_linear_AR, stbir__encode_half_float_linear_AR } + }; + + static stbir__encode_pixels_func * encode_simple_scaled_or_not[2][2]= + { + { stbir__encode_uint8_linear_scaled, stbir__encode_uint8_linear }, { stbir__encode_uint16_linear_scaled, stbir__encode_uint16_linear }, + }; + + static stbir__encode_pixels_func * encode_alphas_scaled_or_not[STBIRI_AR-STBIRI_RGBA+1][2][2]= + { + { /* RGBA */ { stbir__encode_uint8_linear_scaled, stbir__encode_uint8_linear }, { stbir__encode_uint16_linear_scaled, stbir__encode_uint16_linear } }, + { /* BGRA */ { stbir__encode_uint8_linear_scaled_BGRA, stbir__encode_uint8_linear_BGRA }, { stbir__encode_uint16_linear_scaled_BGRA, stbir__encode_uint16_linear_BGRA } }, + { /* ARGB */ { stbir__encode_uint8_linear_scaled_ARGB, stbir__encode_uint8_linear_ARGB }, { stbir__encode_uint16_linear_scaled_ARGB, stbir__encode_uint16_linear_ARGB } }, + { /* ABGR */ { stbir__encode_uint8_linear_scaled_ABGR, stbir__encode_uint8_linear_ABGR }, { stbir__encode_uint16_linear_scaled_ABGR, stbir__encode_uint16_linear_ABGR } }, + { /* RA */ { stbir__encode_uint8_linear_scaled, stbir__encode_uint8_linear }, { stbir__encode_uint16_linear_scaled, stbir__encode_uint16_linear } }, + { /* AR */ { stbir__encode_uint8_linear_scaled_AR, stbir__encode_uint8_linear_AR }, { stbir__encode_uint16_linear_scaled_AR, stbir__encode_uint16_linear_AR } } + }; + + stbir__decode_pixels_func * decode_pixels = 0; + stbir__encode_pixels_func * encode_pixels = 0; + stbir_datatype input_type, output_type; + + input_type = resize->input_data_type; + output_type = resize->output_data_type; + info->input_data = resize->input_pixels; + info->input_stride_bytes = resize->input_stride_in_bytes; + info->output_stride_bytes = resize->output_stride_in_bytes; + + // if we're completely point sampling, then we can turn off SRGB + if ( ( info->horizontal.filter_enum == STBIR_FILTER_POINT_SAMPLE ) && ( info->vertical.filter_enum == STBIR_FILTER_POINT_SAMPLE ) ) + { + if ( ( ( input_type == STBIR_TYPE_UINT8_SRGB ) || ( input_type == STBIR_TYPE_UINT8_SRGB_ALPHA ) ) && + ( ( output_type == STBIR_TYPE_UINT8_SRGB ) || ( output_type == STBIR_TYPE_UINT8_SRGB_ALPHA ) ) ) + { + input_type = STBIR_TYPE_UINT8; + output_type = STBIR_TYPE_UINT8; + } + } + + // recalc the output and input strides + if ( info->input_stride_bytes == 0 ) + info->input_stride_bytes = info->channels * info->horizontal.scale_info.input_full_size * stbir__type_size[input_type]; + + if ( info->output_stride_bytes == 0 ) + info->output_stride_bytes = info->channels * info->horizontal.scale_info.output_sub_size * stbir__type_size[output_type]; + + // calc offset + info->output_data = ( (char*) resize->output_pixels ) + ( (size_t) info->offset_y * (size_t) resize->output_stride_in_bytes ) + ( info->offset_x * info->channels * stbir__type_size[output_type] ); + + info->in_pixels_cb = resize->input_cb; + info->user_data = resize->user_data; + info->out_pixels_cb = resize->output_cb; + + // setup the input format converters + if ( ( input_type == STBIR_TYPE_UINT8 ) || ( input_type == STBIR_TYPE_UINT16 ) ) + { + int non_scaled = 0; + + // check if we can run unscaled - 0-255.0/0-65535.0 instead of 0-1.0 (which is a tiny bit faster when doing linear 8->8 or 16->16) + if ( ( !info->alpha_weight ) && ( !info->alpha_unweight ) ) // don't short circuit when alpha weighting (get everything to 0-1.0 as usual) + if ( ( ( input_type == STBIR_TYPE_UINT8 ) && ( output_type == STBIR_TYPE_UINT8 ) ) || ( ( input_type == STBIR_TYPE_UINT16 ) && ( output_type == STBIR_TYPE_UINT16 ) ) ) + non_scaled = 1; + + if ( info->input_pixel_layout_internal <= STBIRI_4CHANNEL ) + decode_pixels = decode_simple_scaled_or_not[ input_type == STBIR_TYPE_UINT16 ][ non_scaled ]; + else + decode_pixels = decode_alphas_scaled_or_not[ ( info->input_pixel_layout_internal - STBIRI_RGBA ) % ( STBIRI_AR-STBIRI_RGBA+1 ) ][ input_type == STBIR_TYPE_UINT16 ][ non_scaled ]; + } + else + { + if ( info->input_pixel_layout_internal <= STBIRI_4CHANNEL ) + decode_pixels = decode_simple[ input_type - STBIR_TYPE_UINT8_SRGB ]; + else + decode_pixels = decode_alphas[ ( info->input_pixel_layout_internal - STBIRI_RGBA ) % ( STBIRI_AR-STBIRI_RGBA+1 ) ][ input_type - STBIR_TYPE_UINT8_SRGB ]; + } + + // setup the output format converters + if ( ( output_type == STBIR_TYPE_UINT8 ) || ( output_type == STBIR_TYPE_UINT16 ) ) + { + int non_scaled = 0; + + // check if we can run unscaled - 0-255.0/0-65535.0 instead of 0-1.0 (which is a tiny bit faster when doing linear 8->8 or 16->16) + if ( ( !info->alpha_weight ) && ( !info->alpha_unweight ) ) // don't short circuit when alpha weighting (get everything to 0-1.0 as usual) + if ( ( ( input_type == STBIR_TYPE_UINT8 ) && ( output_type == STBIR_TYPE_UINT8 ) ) || ( ( input_type == STBIR_TYPE_UINT16 ) && ( output_type == STBIR_TYPE_UINT16 ) ) ) + non_scaled = 1; + + if ( info->output_pixel_layout_internal <= STBIRI_4CHANNEL ) + encode_pixels = encode_simple_scaled_or_not[ output_type == STBIR_TYPE_UINT16 ][ non_scaled ]; + else + encode_pixels = encode_alphas_scaled_or_not[ ( info->output_pixel_layout_internal - STBIRI_RGBA ) % ( STBIRI_AR-STBIRI_RGBA+1 ) ][ output_type == STBIR_TYPE_UINT16 ][ non_scaled ]; + } + else + { + if ( info->output_pixel_layout_internal <= STBIRI_4CHANNEL ) + encode_pixels = encode_simple[ output_type - STBIR_TYPE_UINT8_SRGB ]; + else + encode_pixels = encode_alphas[ ( info->output_pixel_layout_internal - STBIRI_RGBA ) % ( STBIRI_AR-STBIRI_RGBA+1 ) ][ output_type - STBIR_TYPE_UINT8_SRGB ]; + } + + info->input_type = input_type; + info->output_type = output_type; + info->decode_pixels = decode_pixels; + info->encode_pixels = encode_pixels; +} + +static void stbir__clip( int * outx, int * outsubw, int outw, double * u0, double * u1 ) +{ + double per, adj; + int over; + + // do left/top edge + if ( *outx < 0 ) + { + per = ( (double)*outx ) / ( (double)*outsubw ); // is negative + adj = per * ( *u1 - *u0 ); + *u0 -= adj; // increases u0 + *outx = 0; + } + + // do right/bot edge + over = outw - ( *outx + *outsubw ); + if ( over < 0 ) + { + per = ( (double)over ) / ( (double)*outsubw ); // is negative + adj = per * ( *u1 - *u0 ); + *u1 += adj; // decrease u1 + *outsubw = outw - *outx; + } +} + +// converts a double to a rational that has less than one float bit of error (returns 0 if unable to do so) +static int stbir__double_to_rational(double f, stbir_uint32 limit, stbir_uint32 *numer, stbir_uint32 *denom, int limit_denom ) // limit_denom (1) or limit numer (0) +{ + double err; + stbir_uint64 top, bot; + stbir_uint64 numer_last = 0; + stbir_uint64 denom_last = 1; + stbir_uint64 numer_estimate = 1; + stbir_uint64 denom_estimate = 0; + + // scale to past float error range + top = (stbir_uint64)( f * (double)(1 << 25) ); + bot = 1 << 25; + + // keep refining, but usually stops in a few loops - usually 5 for bad cases + for(;;) + { + stbir_uint64 est, temp; + + // hit limit, break out and do best full range estimate + if ( ( ( limit_denom ) ? denom_estimate : numer_estimate ) >= limit ) + break; + + // is the current error less than 1 bit of a float? if so, we're done + if ( denom_estimate ) + { + err = ( (double)numer_estimate / (double)denom_estimate ) - f; + if ( err < 0.0 ) err = -err; + if ( err < ( 1.0 / (double)(1<<24) ) ) + { + // yup, found it + *numer = (stbir_uint32) numer_estimate; + *denom = (stbir_uint32) denom_estimate; + return 1; + } + } + + // no more refinement bits left? break out and do full range estimate + if ( bot == 0 ) + break; + + // gcd the estimate bits + est = top / bot; + temp = top % bot; + top = bot; + bot = temp; + + // move remainders + temp = est * denom_estimate + denom_last; + denom_last = denom_estimate; + denom_estimate = temp; + + // move remainders + temp = est * numer_estimate + numer_last; + numer_last = numer_estimate; + numer_estimate = temp; + } + + // we didn't find anything good enough for float, use a full range estimate + if ( limit_denom ) + { + numer_estimate= (stbir_uint64)( f * (double)limit + 0.5 ); + denom_estimate = limit; + } + else + { + numer_estimate = limit; + denom_estimate = (stbir_uint64)( ( (double)limit / f ) + 0.5 ); + } + + *numer = (stbir_uint32) numer_estimate; + *denom = (stbir_uint32) denom_estimate; + + err = ( denom_estimate ) ? ( ( (double)(stbir_uint32)numer_estimate / (double)(stbir_uint32)denom_estimate ) - f ) : 1.0; + if ( err < 0.0 ) err = -err; + return ( err < ( 1.0 / (double)(1<<24) ) ) ? 1 : 0; +} + +static int stbir__calculate_region_transform( stbir__scale_info * scale_info, int output_full_range, int * output_offset, int output_sub_range, int input_full_range, double input_s0, double input_s1 ) +{ + double output_range, input_range, output_s, input_s, ratio, scale; + + input_s = input_s1 - input_s0; + + // null area + if ( ( output_full_range == 0 ) || ( input_full_range == 0 ) || + ( output_sub_range == 0 ) || ( input_s <= stbir__small_float ) ) + return 0; + + // are either of the ranges completely out of bounds? + if ( ( *output_offset >= output_full_range ) || ( ( *output_offset + output_sub_range ) <= 0 ) || ( input_s0 >= (1.0f-stbir__small_float) ) || ( input_s1 <= stbir__small_float ) ) + return 0; + + output_range = (double)output_full_range; + input_range = (double)input_full_range; + + output_s = ( (double)output_sub_range) / output_range; + + // figure out the scaling to use + ratio = output_s / input_s; + + // save scale before clipping + scale = ( output_range / input_range ) * ratio; + scale_info->scale = (float)scale; + scale_info->inv_scale = (float)( 1.0 / scale ); + + // clip output area to left/right output edges (and adjust input area) + stbir__clip( output_offset, &output_sub_range, output_full_range, &input_s0, &input_s1 ); + + // recalc input area + input_s = input_s1 - input_s0; + + // after clipping do we have zero input area? + if ( input_s <= stbir__small_float ) + return 0; + + // calculate and store the starting source offsets in output pixel space + scale_info->pixel_shift = (float) ( input_s0 * ratio * output_range ); + + scale_info->scale_is_rational = stbir__double_to_rational( scale, ( scale <= 1.0 ) ? output_full_range : input_full_range, &scale_info->scale_numerator, &scale_info->scale_denominator, ( scale >= 1.0 ) ); + + scale_info->input_full_size = input_full_range; + scale_info->output_sub_size = output_sub_range; + + return 1; +} + + +static void stbir__init_and_set_layout( STBIR_RESIZE * resize, stbir_pixel_layout pixel_layout, stbir_datatype data_type ) +{ + resize->input_cb = 0; + resize->output_cb = 0; + resize->user_data = resize; + resize->samplers = 0; + resize->called_alloc = 0; + resize->horizontal_filter = STBIR_FILTER_DEFAULT; + resize->horizontal_filter_kernel = 0; resize->horizontal_filter_support = 0; + resize->vertical_filter = STBIR_FILTER_DEFAULT; + resize->vertical_filter_kernel = 0; resize->vertical_filter_support = 0; + resize->horizontal_edge = STBIR_EDGE_CLAMP; + resize->vertical_edge = STBIR_EDGE_CLAMP; + resize->input_s0 = 0; resize->input_t0 = 0; resize->input_s1 = 1; resize->input_t1 = 1; + resize->output_subx = 0; resize->output_suby = 0; resize->output_subw = resize->output_w; resize->output_subh = resize->output_h; + resize->input_data_type = data_type; + resize->output_data_type = data_type; + resize->input_pixel_layout_public = pixel_layout; + resize->output_pixel_layout_public = pixel_layout; + resize->needs_rebuild = 1; +} + +STBIRDEF void stbir_resize_init( STBIR_RESIZE * resize, + const void *input_pixels, int input_w, int input_h, int input_stride_in_bytes, // stride can be zero + void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, // stride can be zero + stbir_pixel_layout pixel_layout, stbir_datatype data_type ) +{ + resize->input_pixels = input_pixels; + resize->input_w = input_w; + resize->input_h = input_h; + resize->input_stride_in_bytes = input_stride_in_bytes; + resize->output_pixels = output_pixels; + resize->output_w = output_w; + resize->output_h = output_h; + resize->output_stride_in_bytes = output_stride_in_bytes; + resize->fast_alpha = 0; + + stbir__init_and_set_layout( resize, pixel_layout, data_type ); +} + +// You can update parameters any time after resize_init +STBIRDEF void stbir_set_datatypes( STBIR_RESIZE * resize, stbir_datatype input_type, stbir_datatype output_type ) // by default, datatype from resize_init +{ + resize->input_data_type = input_type; + resize->output_data_type = output_type; + if ( ( resize->samplers ) && ( !resize->needs_rebuild ) ) + stbir__update_info_from_resize( resize->samplers, resize ); +} + +STBIRDEF void stbir_set_pixel_callbacks( STBIR_RESIZE * resize, stbir_input_callback * input_cb, stbir_output_callback * output_cb ) // no callbacks by default +{ + resize->input_cb = input_cb; + resize->output_cb = output_cb; + + if ( ( resize->samplers ) && ( !resize->needs_rebuild ) ) + { + resize->samplers->in_pixels_cb = input_cb; + resize->samplers->out_pixels_cb = output_cb; + } +} + +STBIRDEF void stbir_set_user_data( STBIR_RESIZE * resize, void * user_data ) // pass back STBIR_RESIZE* by default +{ + resize->user_data = user_data; + if ( ( resize->samplers ) && ( !resize->needs_rebuild ) ) + resize->samplers->user_data = user_data; +} + +STBIRDEF void stbir_set_buffer_ptrs( STBIR_RESIZE * resize, const void * input_pixels, int input_stride_in_bytes, void * output_pixels, int output_stride_in_bytes ) +{ + resize->input_pixels = input_pixels; + resize->input_stride_in_bytes = input_stride_in_bytes; + resize->output_pixels = output_pixels; + resize->output_stride_in_bytes = output_stride_in_bytes; + if ( ( resize->samplers ) && ( !resize->needs_rebuild ) ) + stbir__update_info_from_resize( resize->samplers, resize ); +} + + +STBIRDEF int stbir_set_edgemodes( STBIR_RESIZE * resize, stbir_edge horizontal_edge, stbir_edge vertical_edge ) // CLAMP by default +{ + resize->horizontal_edge = horizontal_edge; + resize->vertical_edge = vertical_edge; + resize->needs_rebuild = 1; + return 1; +} + +STBIRDEF int stbir_set_filters( STBIR_RESIZE * resize, stbir_filter horizontal_filter, stbir_filter vertical_filter ) // STBIR_DEFAULT_FILTER_UPSAMPLE/DOWNSAMPLE by default +{ + resize->horizontal_filter = horizontal_filter; + resize->vertical_filter = vertical_filter; + resize->needs_rebuild = 1; + return 1; +} + +STBIRDEF int stbir_set_filter_callbacks( STBIR_RESIZE * resize, stbir__kernel_callback * horizontal_filter, stbir__support_callback * horizontal_support, stbir__kernel_callback * vertical_filter, stbir__support_callback * vertical_support ) +{ + resize->horizontal_filter_kernel = horizontal_filter; resize->horizontal_filter_support = horizontal_support; + resize->vertical_filter_kernel = vertical_filter; resize->vertical_filter_support = vertical_support; + resize->needs_rebuild = 1; + return 1; +} + +STBIRDEF int stbir_set_pixel_layouts( STBIR_RESIZE * resize, stbir_pixel_layout input_pixel_layout, stbir_pixel_layout output_pixel_layout ) // sets new pixel layouts +{ + resize->input_pixel_layout_public = input_pixel_layout; + resize->output_pixel_layout_public = output_pixel_layout; + resize->needs_rebuild = 1; + return 1; +} + + +STBIRDEF int stbir_set_non_pm_alpha_speed_over_quality( STBIR_RESIZE * resize, int non_pma_alpha_speed_over_quality ) // sets alpha speed +{ + resize->fast_alpha = non_pma_alpha_speed_over_quality; + resize->needs_rebuild = 1; + return 1; +} + +STBIRDEF int stbir_set_input_subrect( STBIR_RESIZE * resize, double s0, double t0, double s1, double t1 ) // sets input region (full region by default) +{ + resize->input_s0 = s0; + resize->input_t0 = t0; + resize->input_s1 = s1; + resize->input_t1 = t1; + resize->needs_rebuild = 1; + + // are we inbounds? + if ( ( s1 < stbir__small_float ) || ( (s1-s0) < stbir__small_float ) || + ( t1 < stbir__small_float ) || ( (t1-t0) < stbir__small_float ) || + ( s0 > (1.0f-stbir__small_float) ) || + ( t0 > (1.0f-stbir__small_float) ) ) + return 0; + + return 1; +} + +STBIRDEF int stbir_set_output_pixel_subrect( STBIR_RESIZE * resize, int subx, int suby, int subw, int subh ) // sets input region (full region by default) +{ + resize->output_subx = subx; + resize->output_suby = suby; + resize->output_subw = subw; + resize->output_subh = subh; + resize->needs_rebuild = 1; + + // are we inbounds? + if ( ( subx >= resize->output_w ) || ( ( subx + subw ) <= 0 ) || ( suby >= resize->output_h ) || ( ( suby + subh ) <= 0 ) || ( subw == 0 ) || ( subh == 0 ) ) + return 0; + + return 1; +} + +STBIRDEF int stbir_set_pixel_subrect( STBIR_RESIZE * resize, int subx, int suby, int subw, int subh ) // sets both regions (full regions by default) +{ + double s0, t0, s1, t1; + + s0 = ( (double)subx ) / ( (double)resize->output_w ); + t0 = ( (double)suby ) / ( (double)resize->output_h ); + s1 = ( (double)(subx+subw) ) / ( (double)resize->output_w ); + t1 = ( (double)(suby+subh) ) / ( (double)resize->output_h ); + + resize->input_s0 = s0; + resize->input_t0 = t0; + resize->input_s1 = s1; + resize->input_t1 = t1; + resize->output_subx = subx; + resize->output_suby = suby; + resize->output_subw = subw; + resize->output_subh = subh; + resize->needs_rebuild = 1; + + // are we inbounds? + if ( ( subx >= resize->output_w ) || ( ( subx + subw ) <= 0 ) || ( suby >= resize->output_h ) || ( ( suby + subh ) <= 0 ) || ( subw == 0 ) || ( subh == 0 ) ) + return 0; + + return 1; +} + +static int stbir__perform_build( STBIR_RESIZE * resize, int splits ) +{ + stbir__contributors conservative = { 0, 0 }; + stbir__sampler horizontal, vertical; + int new_output_subx, new_output_suby; + stbir__info * out_info; + #ifdef STBIR_PROFILE + stbir__info profile_infod; // used to contain building profile info before everything is allocated + stbir__info * profile_info = &profile_infod; + #endif + + // have we already built the samplers? + if ( resize->samplers ) + return 0; + + #define STBIR_RETURN_ERROR_AND_ASSERT( exp ) STBIR_ASSERT( !(exp) ); if (exp) return 0; + STBIR_RETURN_ERROR_AND_ASSERT( (unsigned)resize->horizontal_filter >= STBIR_FILTER_OTHER) + STBIR_RETURN_ERROR_AND_ASSERT( (unsigned)resize->vertical_filter >= STBIR_FILTER_OTHER) + #undef STBIR_RETURN_ERROR_AND_ASSERT + + if ( splits <= 0 ) + return 0; + + STBIR_PROFILE_BUILD_FIRST_START( build ); + + new_output_subx = resize->output_subx; + new_output_suby = resize->output_suby; + + // do horizontal clip and scale calcs + if ( !stbir__calculate_region_transform( &horizontal.scale_info, resize->output_w, &new_output_subx, resize->output_subw, resize->input_w, resize->input_s0, resize->input_s1 ) ) + return 0; + + // do vertical clip and scale calcs + if ( !stbir__calculate_region_transform( &vertical.scale_info, resize->output_h, &new_output_suby, resize->output_subh, resize->input_h, resize->input_t0, resize->input_t1 ) ) + return 0; + + // if nothing to do, just return + if ( ( horizontal.scale_info.output_sub_size == 0 ) || ( vertical.scale_info.output_sub_size == 0 ) ) + return 0; + + stbir__set_sampler(&horizontal, resize->horizontal_filter, resize->horizontal_filter_kernel, resize->horizontal_filter_support, resize->horizontal_edge, &horizontal.scale_info, 1, resize->user_data ); + stbir__get_conservative_extents( &horizontal, &conservative, resize->user_data ); + stbir__set_sampler(&vertical, resize->vertical_filter, resize->vertical_filter_kernel, resize->vertical_filter_support, resize->vertical_edge, &vertical.scale_info, 0, resize->user_data ); + + if ( ( vertical.scale_info.output_sub_size / splits ) < STBIR_FORCE_MINIMUM_SCANLINES_FOR_SPLITS ) // each split should be a minimum of 4 scanlines (handwavey choice) + { + splits = vertical.scale_info.output_sub_size / STBIR_FORCE_MINIMUM_SCANLINES_FOR_SPLITS; + if ( splits == 0 ) splits = 1; + } + + STBIR_PROFILE_BUILD_START( alloc ); + out_info = stbir__alloc_internal_mem_and_build_samplers( &horizontal, &vertical, &conservative, resize->input_pixel_layout_public, resize->output_pixel_layout_public, splits, new_output_subx, new_output_suby, resize->fast_alpha, resize->user_data STBIR_ONLY_PROFILE_BUILD_SET_INFO ); + STBIR_PROFILE_BUILD_END( alloc ); + STBIR_PROFILE_BUILD_END( build ); + + if ( out_info ) + { + resize->splits = splits; + resize->samplers = out_info; + resize->needs_rebuild = 0; + #ifdef STBIR_PROFILE + STBIR_MEMCPY( &out_info->profile, &profile_infod.profile, sizeof( out_info->profile ) ); + #endif + + // update anything that can be changed without recalcing samplers + stbir__update_info_from_resize( out_info, resize ); + + return splits; + } + + return 0; +} + +STBIRDEF void stbir_free_samplers( STBIR_RESIZE * resize ) +{ + if ( resize->samplers ) + { + stbir__free_internal_mem( resize->samplers ); + resize->samplers = 0; + resize->called_alloc = 0; + } +} + +STBIRDEF int stbir_build_samplers_with_splits( STBIR_RESIZE * resize, int splits ) +{ + if ( ( resize->samplers == 0 ) || ( resize->needs_rebuild ) ) + { + if ( resize->samplers ) + stbir_free_samplers( resize ); + + resize->called_alloc = 1; + return stbir__perform_build( resize, splits ); + } + + STBIR_PROFILE_BUILD_CLEAR( resize->samplers ); + + return 1; +} + +STBIRDEF int stbir_build_samplers( STBIR_RESIZE * resize ) +{ + return stbir_build_samplers_with_splits( resize, 1 ); +} + +STBIRDEF int stbir_resize_extended( STBIR_RESIZE * resize ) +{ + int result; + + if ( ( resize->samplers == 0 ) || ( resize->needs_rebuild ) ) + { + int alloc_state = resize->called_alloc; // remember allocated state + + if ( resize->samplers ) + { + stbir__free_internal_mem( resize->samplers ); + resize->samplers = 0; + } + + if ( !stbir_build_samplers( resize ) ) + return 0; + + resize->called_alloc = alloc_state; + + // if build_samplers succeeded (above), but there are no samplers set, then + // the area to stretch into was zero pixels, so don't do anything and return + // success + if ( resize->samplers == 0 ) + return 1; + } + else + { + // didn't build anything - clear it + STBIR_PROFILE_BUILD_CLEAR( resize->samplers ); + } + + // do resize + result = stbir__perform_resize( resize->samplers, 0, resize->splits ); + + // if we alloced, then free + if ( !resize->called_alloc ) + { + stbir_free_samplers( resize ); + resize->samplers = 0; + } + + return result; +} + +STBIRDEF int stbir_resize_extended_split( STBIR_RESIZE * resize, int split_start, int split_count ) +{ + STBIR_ASSERT( resize->samplers ); + + // if we're just doing the whole thing, call full + if ( ( split_start == -1 ) || ( ( split_start == 0 ) && ( split_count == resize->splits ) ) ) + return stbir_resize_extended( resize ); + + // you **must** build samplers first when using split resize + if ( ( resize->samplers == 0 ) || ( resize->needs_rebuild ) ) + return 0; + + if ( ( split_start >= resize->splits ) || ( split_start < 0 ) || ( ( split_start + split_count ) > resize->splits ) || ( split_count <= 0 ) ) + return 0; + + // do resize + return stbir__perform_resize( resize->samplers, split_start, split_count ); +} + + +static void * stbir_quick_resize_helper( const void *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_layout, stbir_datatype data_type, stbir_edge edge, stbir_filter filter ) +{ + STBIR_RESIZE resize; + int scanline_output_in_bytes; + int positive_output_stride_in_bytes; + void * start_ptr; + void * free_ptr; + + scanline_output_in_bytes = output_w * stbir__type_size[ data_type ] * stbir__pixel_channels[ stbir__pixel_layout_convert_public_to_internal[ pixel_layout ] ]; + if ( scanline_output_in_bytes == 0 ) + return 0; + + // if zero stride, use scanline output + if ( output_stride_in_bytes == 0 ) + output_stride_in_bytes = scanline_output_in_bytes; + + // abs value for inverted images (negative pitches) + positive_output_stride_in_bytes = output_stride_in_bytes; + if ( positive_output_stride_in_bytes < 0 ) + positive_output_stride_in_bytes = -positive_output_stride_in_bytes; + + // is the requested stride smaller than the scanline output? if so, just fail + if ( positive_output_stride_in_bytes < scanline_output_in_bytes ) + return 0; + + start_ptr = output_pixels; + free_ptr = 0; // no free pointer, since they passed buffer to use + + // did they pass a zero for the dest? if so, allocate the buffer + if ( output_pixels == 0 ) + { + size_t size; + char * ptr; + + size = (size_t)positive_output_stride_in_bytes * (size_t)output_h; + if ( size == 0 ) + return 0; + + ptr = (char*) STBIR_MALLOC( size, 0 ); + if ( ptr == 0 ) + return 0; + + free_ptr = ptr; + + // point at the last scanline, if they requested a flipped image + if ( output_stride_in_bytes < 0 ) + start_ptr = ptr + ( (size_t)positive_output_stride_in_bytes * (size_t)( output_h - 1 ) ); + else + start_ptr = ptr; + } + + // ok, now do the resize + stbir_resize_init( &resize, + input_pixels, input_w, input_h, input_stride_in_bytes, + start_ptr, output_w, output_h, output_stride_in_bytes, + pixel_layout, data_type ); + + resize.horizontal_edge = edge; + resize.vertical_edge = edge; + resize.horizontal_filter = filter; + resize.vertical_filter = filter; + + if ( !stbir_resize_extended( &resize ) ) + { + if ( free_ptr ) + STBIR_FREE( free_ptr, 0 ); + return 0; + } + + return (free_ptr) ? free_ptr : start_ptr; +} + + + +STBIRDEF unsigned char * stbir_resize_uint8_linear( const unsigned char *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_layout ) +{ + return (unsigned char *) stbir_quick_resize_helper( input_pixels , input_w , input_h, input_stride_in_bytes, + output_pixels, output_w, output_h, output_stride_in_bytes, + pixel_layout, STBIR_TYPE_UINT8, STBIR_EDGE_CLAMP, STBIR_FILTER_DEFAULT ); +} + +STBIRDEF unsigned char * stbir_resize_uint8_srgb( const unsigned char *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_layout ) +{ + return (unsigned char *) stbir_quick_resize_helper( input_pixels , input_w , input_h, input_stride_in_bytes, + output_pixels, output_w, output_h, output_stride_in_bytes, + pixel_layout, STBIR_TYPE_UINT8_SRGB, STBIR_EDGE_CLAMP, STBIR_FILTER_DEFAULT ); +} + + +STBIRDEF float * stbir_resize_float_linear( const float *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + float *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_layout ) +{ + return (float *) stbir_quick_resize_helper( input_pixels , input_w , input_h, input_stride_in_bytes, + output_pixels, output_w, output_h, output_stride_in_bytes, + pixel_layout, STBIR_TYPE_FLOAT, STBIR_EDGE_CLAMP, STBIR_FILTER_DEFAULT ); +} + + +STBIRDEF void * stbir_resize( const void *input_pixels , int input_w , int input_h, int input_stride_in_bytes, + void *output_pixels, int output_w, int output_h, int output_stride_in_bytes, + stbir_pixel_layout pixel_layout, stbir_datatype data_type, + stbir_edge edge, stbir_filter filter ) +{ + return (void *) stbir_quick_resize_helper( input_pixels , input_w , input_h, input_stride_in_bytes, + output_pixels, output_w, output_h, output_stride_in_bytes, + pixel_layout, data_type, edge, filter ); +} + +#ifdef STBIR_PROFILE + +STBIRDEF void stbir_resize_build_profile_info( STBIR_PROFILE_INFO * info, STBIR_RESIZE const * resize ) +{ + static char const * bdescriptions[6] = { "Building", "Allocating", "Horizontal sampler", "Vertical sampler", "Coefficient cleanup", "Coefficient pivot" } ; + stbir__info* samp = resize->samplers; + int i; + + typedef int testa[ (STBIR__ARRAY_SIZE( bdescriptions ) == (STBIR__ARRAY_SIZE( samp->profile.array )-1) )?1:-1]; + typedef int testb[ (sizeof( samp->profile.array ) == (sizeof(samp->profile.named)) )?1:-1]; + typedef int testc[ (sizeof( info->clocks ) >= (sizeof(samp->profile.named)) )?1:-1]; + + for( i = 0 ; i < STBIR__ARRAY_SIZE( bdescriptions ) ; i++) + info->clocks[i] = samp->profile.array[i+1]; + + info->total_clocks = samp->profile.named.total; + info->descriptions = bdescriptions; + info->count = STBIR__ARRAY_SIZE( bdescriptions ); +} + +STBIRDEF void stbir_resize_split_profile_info( STBIR_PROFILE_INFO * info, STBIR_RESIZE const * resize, int split_start, int split_count ) +{ + static char const * descriptions[7] = { "Looping", "Vertical sampling", "Horizontal sampling", "Scanline input", "Scanline output", "Alpha weighting", "Alpha unweighting" }; + stbir__per_split_info * split_info; + int s, i; + + typedef int testa[ (STBIR__ARRAY_SIZE( descriptions ) == (STBIR__ARRAY_SIZE( split_info->profile.array )-1) )?1:-1]; + typedef int testb[ (sizeof( split_info->profile.array ) == (sizeof(split_info->profile.named)) )?1:-1]; + typedef int testc[ (sizeof( info->clocks ) >= (sizeof(split_info->profile.named)) )?1:-1]; + + if ( split_start == -1 ) + { + split_start = 0; + split_count = resize->samplers->splits; + } + + if ( ( split_start >= resize->splits ) || ( split_start < 0 ) || ( ( split_start + split_count ) > resize->splits ) || ( split_count <= 0 ) ) + { + info->total_clocks = 0; + info->descriptions = 0; + info->count = 0; + return; + } + + split_info = resize->samplers->split_info + split_start; + + // sum up the profile from all the splits + for( i = 0 ; i < STBIR__ARRAY_SIZE( descriptions ) ; i++ ) + { + stbir_uint64 sum = 0; + for( s = 0 ; s < split_count ; s++ ) + sum += split_info[s].profile.array[i+1]; + info->clocks[i] = sum; + } + + info->total_clocks = split_info->profile.named.total; + info->descriptions = descriptions; + info->count = STBIR__ARRAY_SIZE( descriptions ); +} + +STBIRDEF void stbir_resize_extended_profile_info( STBIR_PROFILE_INFO * info, STBIR_RESIZE const * resize ) +{ + stbir_resize_split_profile_info( info, resize, -1, 0 ); +} + +#endif // STBIR_PROFILE + +#undef STBIR_BGR +#undef STBIR_1CHANNEL +#undef STBIR_2CHANNEL +#undef STBIR_RGB +#undef STBIR_RGBA +#undef STBIR_4CHANNEL +#undef STBIR_BGRA +#undef STBIR_ARGB +#undef STBIR_ABGR +#undef STBIR_RA +#undef STBIR_AR +#undef STBIR_RGBA_PM +#undef STBIR_BGRA_PM +#undef STBIR_ARGB_PM +#undef STBIR_ABGR_PM +#undef STBIR_RA_PM +#undef STBIR_AR_PM + +#endif // STB_IMAGE_RESIZE_IMPLEMENTATION + +#else // STB_IMAGE_RESIZE_HORIZONTALS&STB_IMAGE_RESIZE_DO_VERTICALS + +// we reinclude the header file to define all the horizontal functions +// specializing each function for the number of coeffs is 20-40% faster *OVERALL* + +// by including the header file again this way, we can still debug the functions + +#define STBIR_strs_join2( start, mid, end ) start##mid##end +#define STBIR_strs_join1( start, mid, end ) STBIR_strs_join2( start, mid, end ) + +#define STBIR_strs_join24( start, mid1, mid2, end ) start##mid1##mid2##end +#define STBIR_strs_join14( start, mid1, mid2, end ) STBIR_strs_join24( start, mid1, mid2, end ) + +#ifdef STB_IMAGE_RESIZE_DO_CODERS + +#ifdef stbir__decode_suffix +#define STBIR__CODER_NAME( name ) STBIR_strs_join1( name, _, stbir__decode_suffix ) +#else +#define STBIR__CODER_NAME( name ) name +#endif + +#ifdef stbir__decode_swizzle +#define stbir__decode_simdf8_flip(reg) STBIR_strs_join1( STBIR_strs_join1( STBIR_strs_join1( STBIR_strs_join1( stbir__simdf8_0123to,stbir__decode_order0,stbir__decode_order1),stbir__decode_order2,stbir__decode_order3),stbir__decode_order0,stbir__decode_order1),stbir__decode_order2,stbir__decode_order3)(reg, reg) +#define stbir__decode_simdf4_flip(reg) STBIR_strs_join1( STBIR_strs_join1( stbir__simdf_0123to,stbir__decode_order0,stbir__decode_order1),stbir__decode_order2,stbir__decode_order3)(reg, reg) +#define stbir__encode_simdf8_unflip(reg) STBIR_strs_join1( STBIR_strs_join1( STBIR_strs_join1( STBIR_strs_join1( stbir__simdf8_0123to,stbir__encode_order0,stbir__encode_order1),stbir__encode_order2,stbir__encode_order3),stbir__encode_order0,stbir__encode_order1),stbir__encode_order2,stbir__encode_order3)(reg, reg) +#define stbir__encode_simdf4_unflip(reg) STBIR_strs_join1( STBIR_strs_join1( stbir__simdf_0123to,stbir__encode_order0,stbir__encode_order1),stbir__encode_order2,stbir__encode_order3)(reg, reg) +#else +#define stbir__decode_order0 0 +#define stbir__decode_order1 1 +#define stbir__decode_order2 2 +#define stbir__decode_order3 3 +#define stbir__encode_order0 0 +#define stbir__encode_order1 1 +#define stbir__encode_order2 2 +#define stbir__encode_order3 3 +#define stbir__decode_simdf8_flip(reg) +#define stbir__decode_simdf4_flip(reg) +#define stbir__encode_simdf8_unflip(reg) +#define stbir__encode_simdf4_unflip(reg) +#endif + +#ifdef STBIR_SIMD8 +#define stbir__encode_simdfX_unflip stbir__encode_simdf8_unflip +#else +#define stbir__encode_simdfX_unflip stbir__encode_simdf4_unflip +#endif + +static float * STBIR__CODER_NAME( stbir__decode_uint8_linear_scaled )( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + unsigned char const * input = (unsigned char const*)inputp; + + #ifdef STBIR_SIMD + unsigned char const * end_input_m16 = input + width_times_channels - 16; + if ( width_times_channels >= 16 ) + { + decode_end -= 16; + STBIR_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + #ifdef STBIR_SIMD8 + stbir__simdi i; stbir__simdi8 o0,o1; + stbir__simdf8 of0, of1; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi8_expand_u8_to_u32( o0, o1, i ); + stbir__simdi8_convert_i32_to_float( of0, o0 ); + stbir__simdi8_convert_i32_to_float( of1, o1 ); + stbir__simdf8_mult( of0, of0, STBIR_max_uint8_as_float_inverted8); + stbir__simdf8_mult( of1, of1, STBIR_max_uint8_as_float_inverted8); + stbir__decode_simdf8_flip( of0 ); + stbir__decode_simdf8_flip( of1 ); + stbir__simdf8_store( decode + 0, of0 ); + stbir__simdf8_store( decode + 8, of1 ); + #else + stbir__simdi i, o0, o1, o2, o3; + stbir__simdf of0, of1, of2, of3; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi_expand_u8_to_u32( o0,o1,o2,o3,i); + stbir__simdi_convert_i32_to_float( of0, o0 ); + stbir__simdi_convert_i32_to_float( of1, o1 ); + stbir__simdi_convert_i32_to_float( of2, o2 ); + stbir__simdi_convert_i32_to_float( of3, o3 ); + stbir__simdf_mult( of0, of0, STBIR__CONSTF(STBIR_max_uint8_as_float_inverted) ); + stbir__simdf_mult( of1, of1, STBIR__CONSTF(STBIR_max_uint8_as_float_inverted) ); + stbir__simdf_mult( of2, of2, STBIR__CONSTF(STBIR_max_uint8_as_float_inverted) ); + stbir__simdf_mult( of3, of3, STBIR__CONSTF(STBIR_max_uint8_as_float_inverted) ); + stbir__decode_simdf4_flip( of0 ); + stbir__decode_simdf4_flip( of1 ); + stbir__decode_simdf4_flip( of2 ); + stbir__decode_simdf4_flip( of3 ); + stbir__simdf_store( decode + 0, of0 ); + stbir__simdf_store( decode + 4, of1 ); + stbir__simdf_store( decode + 8, of2 ); + stbir__simdf_store( decode + 12, of3 ); + #endif + decode += 16; + input += 16; + if ( decode <= decode_end ) + continue; + if ( decode == ( decode_end + 16 ) ) + break; + decode = decode_end; // backup and do last couple + input = end_input_m16; + } + return decode_end + 16; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + decode += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode <= decode_end ) + { + STBIR_SIMD_NO_UNROLL(decode); + decode[0-4] = ((float)(input[stbir__decode_order0])) * stbir__max_uint8_as_float_inverted; + decode[1-4] = ((float)(input[stbir__decode_order1])) * stbir__max_uint8_as_float_inverted; + decode[2-4] = ((float)(input[stbir__decode_order2])) * stbir__max_uint8_as_float_inverted; + decode[3-4] = ((float)(input[stbir__decode_order3])) * stbir__max_uint8_as_float_inverted; + decode += 4; + input += 4; + } + decode -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( decode < decode_end ) + { + STBIR_NO_UNROLL(decode); + decode[0] = ((float)(input[stbir__decode_order0])) * stbir__max_uint8_as_float_inverted; + #if stbir__coder_min_num >= 2 + decode[1] = ((float)(input[stbir__decode_order1])) * stbir__max_uint8_as_float_inverted; + #endif + #if stbir__coder_min_num >= 3 + decode[2] = ((float)(input[stbir__decode_order2])) * stbir__max_uint8_as_float_inverted; + #endif + decode += stbir__coder_min_num; + input += stbir__coder_min_num; + } + #endif + + return decode_end; +} + +static void STBIR__CODER_NAME( stbir__encode_uint8_linear_scaled )( void * outputp, int width_times_channels, float const * encode ) +{ + unsigned char STBIR_SIMD_STREAMOUT_PTR( * ) output = (unsigned char *) outputp; + unsigned char * end_output = ( (unsigned char *) output ) + width_times_channels; + + #ifdef STBIR_SIMD + if ( width_times_channels >= stbir__simdfX_float_count*2 ) + { + float const * end_encode_m8 = encode + width_times_channels - stbir__simdfX_float_count*2; + end_output -= stbir__simdfX_float_count*2; + STBIR_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdfX e0, e1; + stbir__simdi i; + STBIR_SIMD_NO_UNROLL(encode); + stbir__simdfX_madd_mem( e0, STBIR_simd_point5X, STBIR_max_uint8_as_floatX, encode ); + stbir__simdfX_madd_mem( e1, STBIR_simd_point5X, STBIR_max_uint8_as_floatX, encode+stbir__simdfX_float_count ); + stbir__encode_simdfX_unflip( e0 ); + stbir__encode_simdfX_unflip( e1 ); + #ifdef STBIR_SIMD8 + stbir__simdf8_pack_to_16bytes( i, e0, e1 ); + stbir__simdi_store( output, i ); + #else + stbir__simdf_pack_to_8bytes( i, e0, e1 ); + stbir__simdi_store2( output, i ); + #endif + encode += stbir__simdfX_float_count*2; + output += stbir__simdfX_float_count*2; + if ( output <= end_output ) + continue; + if ( output == ( end_output + stbir__simdfX_float_count*2 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m8; + } + return; + } + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + stbir__simdf e0; + stbir__simdi i0; + STBIR_NO_UNROLL(encode); + stbir__simdf_load( e0, encode ); + stbir__simdf_madd( e0, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint8_as_float), e0 ); + stbir__encode_simdf4_unflip( e0 ); + stbir__simdf_pack_to_8bytes( i0, e0, e0 ); // only use first 4 + *(int*)(output-4) = stbir__simdi_to_int( i0 ); + output += 4; + encode += 4; + } + output -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + stbir__simdf e0; + STBIR_NO_UNROLL(encode); + stbir__simdf_madd1_mem( e0, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint8_as_float), encode+stbir__encode_order0 ); output[0] = stbir__simdf_convert_float_to_uint8( e0 ); + #if stbir__coder_min_num >= 2 + stbir__simdf_madd1_mem( e0, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint8_as_float), encode+stbir__encode_order1 ); output[1] = stbir__simdf_convert_float_to_uint8( e0 ); + #endif + #if stbir__coder_min_num >= 3 + stbir__simdf_madd1_mem( e0, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint8_as_float), encode+stbir__encode_order2 ); output[2] = stbir__simdf_convert_float_to_uint8( e0 ); + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif + + #else + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + while( output <= end_output ) + { + float f; + f = encode[stbir__encode_order0] * stbir__max_uint8_as_float + 0.5f; STBIR_CLAMP(f, 0, 255); output[0-4] = (unsigned char)f; + f = encode[stbir__encode_order1] * stbir__max_uint8_as_float + 0.5f; STBIR_CLAMP(f, 0, 255); output[1-4] = (unsigned char)f; + f = encode[stbir__encode_order2] * stbir__max_uint8_as_float + 0.5f; STBIR_CLAMP(f, 0, 255); output[2-4] = (unsigned char)f; + f = encode[stbir__encode_order3] * stbir__max_uint8_as_float + 0.5f; STBIR_CLAMP(f, 0, 255); output[3-4] = (unsigned char)f; + output += 4; + encode += 4; + } + output -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + float f; + STBIR_NO_UNROLL(encode); + f = encode[stbir__encode_order0] * stbir__max_uint8_as_float + 0.5f; STBIR_CLAMP(f, 0, 255); output[0] = (unsigned char)f; + #if stbir__coder_min_num >= 2 + f = encode[stbir__encode_order1] * stbir__max_uint8_as_float + 0.5f; STBIR_CLAMP(f, 0, 255); output[1] = (unsigned char)f; + #endif + #if stbir__coder_min_num >= 3 + f = encode[stbir__encode_order2] * stbir__max_uint8_as_float + 0.5f; STBIR_CLAMP(f, 0, 255); output[2] = (unsigned char)f; + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif + #endif +} + +static float * STBIR__CODER_NAME(stbir__decode_uint8_linear)( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + unsigned char const * input = (unsigned char const*)inputp; + + #ifdef STBIR_SIMD + unsigned char const * end_input_m16 = input + width_times_channels - 16; + if ( width_times_channels >= 16 ) + { + decode_end -= 16; + STBIR_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + #ifdef STBIR_SIMD8 + stbir__simdi i; stbir__simdi8 o0,o1; + stbir__simdf8 of0, of1; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi8_expand_u8_to_u32( o0, o1, i ); + stbir__simdi8_convert_i32_to_float( of0, o0 ); + stbir__simdi8_convert_i32_to_float( of1, o1 ); + stbir__decode_simdf8_flip( of0 ); + stbir__decode_simdf8_flip( of1 ); + stbir__simdf8_store( decode + 0, of0 ); + stbir__simdf8_store( decode + 8, of1 ); + #else + stbir__simdi i, o0, o1, o2, o3; + stbir__simdf of0, of1, of2, of3; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi_expand_u8_to_u32( o0,o1,o2,o3,i); + stbir__simdi_convert_i32_to_float( of0, o0 ); + stbir__simdi_convert_i32_to_float( of1, o1 ); + stbir__simdi_convert_i32_to_float( of2, o2 ); + stbir__simdi_convert_i32_to_float( of3, o3 ); + stbir__decode_simdf4_flip( of0 ); + stbir__decode_simdf4_flip( of1 ); + stbir__decode_simdf4_flip( of2 ); + stbir__decode_simdf4_flip( of3 ); + stbir__simdf_store( decode + 0, of0 ); + stbir__simdf_store( decode + 4, of1 ); + stbir__simdf_store( decode + 8, of2 ); + stbir__simdf_store( decode + 12, of3 ); +#endif + decode += 16; + input += 16; + if ( decode <= decode_end ) + continue; + if ( decode == ( decode_end + 16 ) ) + break; + decode = decode_end; // backup and do last couple + input = end_input_m16; + } + return decode_end + 16; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + decode += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode <= decode_end ) + { + STBIR_SIMD_NO_UNROLL(decode); + decode[0-4] = ((float)(input[stbir__decode_order0])); + decode[1-4] = ((float)(input[stbir__decode_order1])); + decode[2-4] = ((float)(input[stbir__decode_order2])); + decode[3-4] = ((float)(input[stbir__decode_order3])); + decode += 4; + input += 4; + } + decode -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( decode < decode_end ) + { + STBIR_NO_UNROLL(decode); + decode[0] = ((float)(input[stbir__decode_order0])); + #if stbir__coder_min_num >= 2 + decode[1] = ((float)(input[stbir__decode_order1])); + #endif + #if stbir__coder_min_num >= 3 + decode[2] = ((float)(input[stbir__decode_order2])); + #endif + decode += stbir__coder_min_num; + input += stbir__coder_min_num; + } + #endif + return decode_end; +} + +static void STBIR__CODER_NAME( stbir__encode_uint8_linear )( void * outputp, int width_times_channels, float const * encode ) +{ + unsigned char STBIR_SIMD_STREAMOUT_PTR( * ) output = (unsigned char *) outputp; + unsigned char * end_output = ( (unsigned char *) output ) + width_times_channels; + + #ifdef STBIR_SIMD + if ( width_times_channels >= stbir__simdfX_float_count*2 ) + { + float const * end_encode_m8 = encode + width_times_channels - stbir__simdfX_float_count*2; + end_output -= stbir__simdfX_float_count*2; + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdfX e0, e1; + stbir__simdi i; + STBIR_SIMD_NO_UNROLL(encode); + stbir__simdfX_add_mem( e0, STBIR_simd_point5X, encode ); + stbir__simdfX_add_mem( e1, STBIR_simd_point5X, encode+stbir__simdfX_float_count ); + stbir__encode_simdfX_unflip( e0 ); + stbir__encode_simdfX_unflip( e1 ); + #ifdef STBIR_SIMD8 + stbir__simdf8_pack_to_16bytes( i, e0, e1 ); + stbir__simdi_store( output, i ); + #else + stbir__simdf_pack_to_8bytes( i, e0, e1 ); + stbir__simdi_store2( output, i ); + #endif + encode += stbir__simdfX_float_count*2; + output += stbir__simdfX_float_count*2; + if ( output <= end_output ) + continue; + if ( output == ( end_output + stbir__simdfX_float_count*2 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m8; + } + return; + } + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + stbir__simdf e0; + stbir__simdi i0; + STBIR_NO_UNROLL(encode); + stbir__simdf_load( e0, encode ); + stbir__simdf_add( e0, STBIR__CONSTF(STBIR_simd_point5), e0 ); + stbir__encode_simdf4_unflip( e0 ); + stbir__simdf_pack_to_8bytes( i0, e0, e0 ); // only use first 4 + *(int*)(output-4) = stbir__simdi_to_int( i0 ); + output += 4; + encode += 4; + } + output -= 4; + #endif + + #else + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + while( output <= end_output ) + { + float f; + f = encode[stbir__encode_order0] + 0.5f; STBIR_CLAMP(f, 0, 255); output[0-4] = (unsigned char)f; + f = encode[stbir__encode_order1] + 0.5f; STBIR_CLAMP(f, 0, 255); output[1-4] = (unsigned char)f; + f = encode[stbir__encode_order2] + 0.5f; STBIR_CLAMP(f, 0, 255); output[2-4] = (unsigned char)f; + f = encode[stbir__encode_order3] + 0.5f; STBIR_CLAMP(f, 0, 255); output[3-4] = (unsigned char)f; + output += 4; + encode += 4; + } + output -= 4; + #endif + + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + float f; + STBIR_NO_UNROLL(encode); + f = encode[stbir__encode_order0] + 0.5f; STBIR_CLAMP(f, 0, 255); output[0] = (unsigned char)f; + #if stbir__coder_min_num >= 2 + f = encode[stbir__encode_order1] + 0.5f; STBIR_CLAMP(f, 0, 255); output[1] = (unsigned char)f; + #endif + #if stbir__coder_min_num >= 3 + f = encode[stbir__encode_order2] + 0.5f; STBIR_CLAMP(f, 0, 255); output[2] = (unsigned char)f; + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif +} + +static float * STBIR__CODER_NAME(stbir__decode_uint8_srgb)( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + unsigned char const * input = (unsigned char const *)inputp; + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + decode += 4; + while( decode <= decode_end ) + { + decode[0-4] = stbir__srgb_uchar_to_linear_float[ input[ stbir__decode_order0 ] ]; + decode[1-4] = stbir__srgb_uchar_to_linear_float[ input[ stbir__decode_order1 ] ]; + decode[2-4] = stbir__srgb_uchar_to_linear_float[ input[ stbir__decode_order2 ] ]; + decode[3-4] = stbir__srgb_uchar_to_linear_float[ input[ stbir__decode_order3 ] ]; + decode += 4; + input += 4; + } + decode -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( decode < decode_end ) + { + STBIR_NO_UNROLL(decode); + decode[0] = stbir__srgb_uchar_to_linear_float[ input[ stbir__decode_order0 ] ]; + #if stbir__coder_min_num >= 2 + decode[1] = stbir__srgb_uchar_to_linear_float[ input[ stbir__decode_order1 ] ]; + #endif + #if stbir__coder_min_num >= 3 + decode[2] = stbir__srgb_uchar_to_linear_float[ input[ stbir__decode_order2 ] ]; + #endif + decode += stbir__coder_min_num; + input += stbir__coder_min_num; + } + #endif + return decode_end; +} + +#define stbir__min_max_shift20( i, f ) \ + stbir__simdf_max( f, f, stbir_simdf_casti(STBIR__CONSTI( STBIR_almost_zero )) ); \ + stbir__simdf_min( f, f, stbir_simdf_casti(STBIR__CONSTI( STBIR_almost_one )) ); \ + stbir__simdi_32shr( i, stbir_simdi_castf( f ), 20 ); + +#define stbir__scale_and_convert( i, f ) \ + stbir__simdf_madd( f, STBIR__CONSTF( STBIR_simd_point5 ), STBIR__CONSTF( STBIR_max_uint8_as_float ), f ); \ + stbir__simdf_max( f, f, stbir__simdf_zeroP() ); \ + stbir__simdf_min( f, f, STBIR__CONSTF( STBIR_max_uint8_as_float ) ); \ + stbir__simdf_convert_float_to_i32( i, f ); + +#define stbir__linear_to_srgb_finish( i, f ) \ +{ \ + stbir__simdi temp; \ + stbir__simdi_32shr( temp, stbir_simdi_castf( f ), 12 ) ; \ + stbir__simdi_and( temp, temp, STBIR__CONSTI(STBIR_mantissa_mask) ); \ + stbir__simdi_or( temp, temp, STBIR__CONSTI(STBIR_topscale) ); \ + stbir__simdi_16madd( i, i, temp ); \ + stbir__simdi_32shr( i, i, 16 ); \ +} + +#define stbir__simdi_table_lookup2( v0,v1, table ) \ +{ \ + stbir__simdi_u32 temp0,temp1; \ + temp0.m128i_i128 = v0; \ + temp1.m128i_i128 = v1; \ + temp0.m128i_u32[0] = table[temp0.m128i_i32[0]]; temp0.m128i_u32[1] = table[temp0.m128i_i32[1]]; temp0.m128i_u32[2] = table[temp0.m128i_i32[2]]; temp0.m128i_u32[3] = table[temp0.m128i_i32[3]]; \ + temp1.m128i_u32[0] = table[temp1.m128i_i32[0]]; temp1.m128i_u32[1] = table[temp1.m128i_i32[1]]; temp1.m128i_u32[2] = table[temp1.m128i_i32[2]]; temp1.m128i_u32[3] = table[temp1.m128i_i32[3]]; \ + v0 = temp0.m128i_i128; \ + v1 = temp1.m128i_i128; \ +} + +#define stbir__simdi_table_lookup3( v0,v1,v2, table ) \ +{ \ + stbir__simdi_u32 temp0,temp1,temp2; \ + temp0.m128i_i128 = v0; \ + temp1.m128i_i128 = v1; \ + temp2.m128i_i128 = v2; \ + temp0.m128i_u32[0] = table[temp0.m128i_i32[0]]; temp0.m128i_u32[1] = table[temp0.m128i_i32[1]]; temp0.m128i_u32[2] = table[temp0.m128i_i32[2]]; temp0.m128i_u32[3] = table[temp0.m128i_i32[3]]; \ + temp1.m128i_u32[0] = table[temp1.m128i_i32[0]]; temp1.m128i_u32[1] = table[temp1.m128i_i32[1]]; temp1.m128i_u32[2] = table[temp1.m128i_i32[2]]; temp1.m128i_u32[3] = table[temp1.m128i_i32[3]]; \ + temp2.m128i_u32[0] = table[temp2.m128i_i32[0]]; temp2.m128i_u32[1] = table[temp2.m128i_i32[1]]; temp2.m128i_u32[2] = table[temp2.m128i_i32[2]]; temp2.m128i_u32[3] = table[temp2.m128i_i32[3]]; \ + v0 = temp0.m128i_i128; \ + v1 = temp1.m128i_i128; \ + v2 = temp2.m128i_i128; \ +} + +#define stbir__simdi_table_lookup4( v0,v1,v2,v3, table ) \ +{ \ + stbir__simdi_u32 temp0,temp1,temp2,temp3; \ + temp0.m128i_i128 = v0; \ + temp1.m128i_i128 = v1; \ + temp2.m128i_i128 = v2; \ + temp3.m128i_i128 = v3; \ + temp0.m128i_u32[0] = table[temp0.m128i_i32[0]]; temp0.m128i_u32[1] = table[temp0.m128i_i32[1]]; temp0.m128i_u32[2] = table[temp0.m128i_i32[2]]; temp0.m128i_u32[3] = table[temp0.m128i_i32[3]]; \ + temp1.m128i_u32[0] = table[temp1.m128i_i32[0]]; temp1.m128i_u32[1] = table[temp1.m128i_i32[1]]; temp1.m128i_u32[2] = table[temp1.m128i_i32[2]]; temp1.m128i_u32[3] = table[temp1.m128i_i32[3]]; \ + temp2.m128i_u32[0] = table[temp2.m128i_i32[0]]; temp2.m128i_u32[1] = table[temp2.m128i_i32[1]]; temp2.m128i_u32[2] = table[temp2.m128i_i32[2]]; temp2.m128i_u32[3] = table[temp2.m128i_i32[3]]; \ + temp3.m128i_u32[0] = table[temp3.m128i_i32[0]]; temp3.m128i_u32[1] = table[temp3.m128i_i32[1]]; temp3.m128i_u32[2] = table[temp3.m128i_i32[2]]; temp3.m128i_u32[3] = table[temp3.m128i_i32[3]]; \ + v0 = temp0.m128i_i128; \ + v1 = temp1.m128i_i128; \ + v2 = temp2.m128i_i128; \ + v3 = temp3.m128i_i128; \ +} + +static void STBIR__CODER_NAME( stbir__encode_uint8_srgb )( void * outputp, int width_times_channels, float const * encode ) +{ + unsigned char STBIR_SIMD_STREAMOUT_PTR( * ) output = (unsigned char*) outputp; + unsigned char * end_output = ( (unsigned char*) output ) + width_times_channels; + + #ifdef STBIR_SIMD + + if ( width_times_channels >= 16 ) + { + float const * end_encode_m16 = encode + width_times_channels - 16; + end_output -= 16; + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdf f0, f1, f2, f3; + stbir__simdi i0, i1, i2, i3; + STBIR_SIMD_NO_UNROLL(encode); + + stbir__simdf_load4_transposed( f0, f1, f2, f3, encode ); + + stbir__min_max_shift20( i0, f0 ); + stbir__min_max_shift20( i1, f1 ); + stbir__min_max_shift20( i2, f2 ); + stbir__min_max_shift20( i3, f3 ); + + stbir__simdi_table_lookup4( i0, i1, i2, i3, ( fp32_to_srgb8_tab4 - (127-13)*8 ) ); + + stbir__linear_to_srgb_finish( i0, f0 ); + stbir__linear_to_srgb_finish( i1, f1 ); + stbir__linear_to_srgb_finish( i2, f2 ); + stbir__linear_to_srgb_finish( i3, f3 ); + + stbir__interleave_pack_and_store_16_u8( output, STBIR_strs_join1(i, ,stbir__encode_order0), STBIR_strs_join1(i, ,stbir__encode_order1), STBIR_strs_join1(i, ,stbir__encode_order2), STBIR_strs_join1(i, ,stbir__encode_order3) ); + + encode += 16; + output += 16; + if ( output <= end_output ) + continue; + if ( output == ( end_output + 16 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m16; + } + return; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while ( output <= end_output ) + { + STBIR_SIMD_NO_UNROLL(encode); + + output[0-4] = stbir__linear_to_srgb_uchar( encode[stbir__encode_order0] ); + output[1-4] = stbir__linear_to_srgb_uchar( encode[stbir__encode_order1] ); + output[2-4] = stbir__linear_to_srgb_uchar( encode[stbir__encode_order2] ); + output[3-4] = stbir__linear_to_srgb_uchar( encode[stbir__encode_order3] ); + + output += 4; + encode += 4; + } + output -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + STBIR_NO_UNROLL(encode); + output[0] = stbir__linear_to_srgb_uchar( encode[stbir__encode_order0] ); + #if stbir__coder_min_num >= 2 + output[1] = stbir__linear_to_srgb_uchar( encode[stbir__encode_order1] ); + #endif + #if stbir__coder_min_num >= 3 + output[2] = stbir__linear_to_srgb_uchar( encode[stbir__encode_order2] ); + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif +} + +#if ( stbir__coder_min_num == 4 ) || ( ( stbir__coder_min_num == 1 ) && ( !defined(stbir__decode_swizzle) ) ) + +static float * STBIR__CODER_NAME(stbir__decode_uint8_srgb4_linearalpha)( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + unsigned char const * input = (unsigned char const *)inputp; + + do { + decode[0] = stbir__srgb_uchar_to_linear_float[ input[stbir__decode_order0] ]; + decode[1] = stbir__srgb_uchar_to_linear_float[ input[stbir__decode_order1] ]; + decode[2] = stbir__srgb_uchar_to_linear_float[ input[stbir__decode_order2] ]; + decode[3] = ( (float) input[stbir__decode_order3] ) * stbir__max_uint8_as_float_inverted; + input += 4; + decode += 4; + } while( decode < decode_end ); + return decode_end; +} + + +static void STBIR__CODER_NAME( stbir__encode_uint8_srgb4_linearalpha )( void * outputp, int width_times_channels, float const * encode ) +{ + unsigned char STBIR_SIMD_STREAMOUT_PTR( * ) output = (unsigned char*) outputp; + unsigned char * end_output = ( (unsigned char*) output ) + width_times_channels; + + #ifdef STBIR_SIMD + + if ( width_times_channels >= 16 ) + { + float const * end_encode_m16 = encode + width_times_channels - 16; + end_output -= 16; + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdf f0, f1, f2, f3; + stbir__simdi i0, i1, i2, i3; + + STBIR_SIMD_NO_UNROLL(encode); + stbir__simdf_load4_transposed( f0, f1, f2, f3, encode ); + + stbir__min_max_shift20( i0, f0 ); + stbir__min_max_shift20( i1, f1 ); + stbir__min_max_shift20( i2, f2 ); + stbir__scale_and_convert( i3, f3 ); + + stbir__simdi_table_lookup3( i0, i1, i2, ( fp32_to_srgb8_tab4 - (127-13)*8 ) ); + + stbir__linear_to_srgb_finish( i0, f0 ); + stbir__linear_to_srgb_finish( i1, f1 ); + stbir__linear_to_srgb_finish( i2, f2 ); + + stbir__interleave_pack_and_store_16_u8( output, STBIR_strs_join1(i, ,stbir__encode_order0), STBIR_strs_join1(i, ,stbir__encode_order1), STBIR_strs_join1(i, ,stbir__encode_order2), STBIR_strs_join1(i, ,stbir__encode_order3) ); + + output += 16; + encode += 16; + + if ( output <= end_output ) + continue; + if ( output == ( end_output + 16 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m16; + } + return; + } + #endif + + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float f; + STBIR_SIMD_NO_UNROLL(encode); + + output[stbir__decode_order0] = stbir__linear_to_srgb_uchar( encode[0] ); + output[stbir__decode_order1] = stbir__linear_to_srgb_uchar( encode[1] ); + output[stbir__decode_order2] = stbir__linear_to_srgb_uchar( encode[2] ); + + f = encode[3] * stbir__max_uint8_as_float + 0.5f; + STBIR_CLAMP(f, 0, 255); + output[stbir__decode_order3] = (unsigned char) f; + + output += 4; + encode += 4; + } while( output < end_output ); +} + +#endif + +#if ( stbir__coder_min_num == 2 ) || ( ( stbir__coder_min_num == 1 ) && ( !defined(stbir__decode_swizzle) ) ) + +static float * STBIR__CODER_NAME(stbir__decode_uint8_srgb2_linearalpha)( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + unsigned char const * input = (unsigned char const *)inputp; + + decode += 4; + while( decode <= decode_end ) + { + decode[0-4] = stbir__srgb_uchar_to_linear_float[ input[stbir__decode_order0] ]; + decode[1-4] = ( (float) input[stbir__decode_order1] ) * stbir__max_uint8_as_float_inverted; + decode[2-4] = stbir__srgb_uchar_to_linear_float[ input[stbir__decode_order0+2] ]; + decode[3-4] = ( (float) input[stbir__decode_order1+2] ) * stbir__max_uint8_as_float_inverted; + input += 4; + decode += 4; + } + decode -= 4; + if( decode < decode_end ) + { + decode[0] = stbir__srgb_uchar_to_linear_float[ input[stbir__decode_order0] ]; + decode[1] = ( (float) input[stbir__decode_order1] ) * stbir__max_uint8_as_float_inverted; + } + return decode_end; +} + +static void STBIR__CODER_NAME( stbir__encode_uint8_srgb2_linearalpha )( void * outputp, int width_times_channels, float const * encode ) +{ + unsigned char STBIR_SIMD_STREAMOUT_PTR( * ) output = (unsigned char*) outputp; + unsigned char * end_output = ( (unsigned char*) output ) + width_times_channels; + + #ifdef STBIR_SIMD + + if ( width_times_channels >= 16 ) + { + float const * end_encode_m16 = encode + width_times_channels - 16; + end_output -= 16; + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdf f0, f1, f2, f3; + stbir__simdi i0, i1, i2, i3; + + STBIR_SIMD_NO_UNROLL(encode); + stbir__simdf_load4_transposed( f0, f1, f2, f3, encode ); + + stbir__min_max_shift20( i0, f0 ); + stbir__scale_and_convert( i1, f1 ); + stbir__min_max_shift20( i2, f2 ); + stbir__scale_and_convert( i3, f3 ); + + stbir__simdi_table_lookup2( i0, i2, ( fp32_to_srgb8_tab4 - (127-13)*8 ) ); + + stbir__linear_to_srgb_finish( i0, f0 ); + stbir__linear_to_srgb_finish( i2, f2 ); + + stbir__interleave_pack_and_store_16_u8( output, STBIR_strs_join1(i, ,stbir__encode_order0), STBIR_strs_join1(i, ,stbir__encode_order1), STBIR_strs_join1(i, ,stbir__encode_order2), STBIR_strs_join1(i, ,stbir__encode_order3) ); + + output += 16; + encode += 16; + if ( output <= end_output ) + continue; + if ( output == ( end_output + 16 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m16; + } + return; + } + #endif + + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float f; + STBIR_SIMD_NO_UNROLL(encode); + + output[stbir__decode_order0] = stbir__linear_to_srgb_uchar( encode[0] ); + + f = encode[1] * stbir__max_uint8_as_float + 0.5f; + STBIR_CLAMP(f, 0, 255); + output[stbir__decode_order1] = (unsigned char) f; + + output += 2; + encode += 2; + } while( output < end_output ); +} + +#endif + +static float * STBIR__CODER_NAME(stbir__decode_uint16_linear_scaled)( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + unsigned short const * input = (unsigned short const *)inputp; + + #ifdef STBIR_SIMD + unsigned short const * end_input_m8 = input + width_times_channels - 8; + if ( width_times_channels >= 8 ) + { + decode_end -= 8; + STBIR_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + #ifdef STBIR_SIMD8 + stbir__simdi i; stbir__simdi8 o; + stbir__simdf8 of; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi8_expand_u16_to_u32( o, i ); + stbir__simdi8_convert_i32_to_float( of, o ); + stbir__simdf8_mult( of, of, STBIR_max_uint16_as_float_inverted8); + stbir__decode_simdf8_flip( of ); + stbir__simdf8_store( decode + 0, of ); + #else + stbir__simdi i, o0, o1; + stbir__simdf of0, of1; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi_expand_u16_to_u32( o0,o1,i ); + stbir__simdi_convert_i32_to_float( of0, o0 ); + stbir__simdi_convert_i32_to_float( of1, o1 ); + stbir__simdf_mult( of0, of0, STBIR__CONSTF(STBIR_max_uint16_as_float_inverted) ); + stbir__simdf_mult( of1, of1, STBIR__CONSTF(STBIR_max_uint16_as_float_inverted)); + stbir__decode_simdf4_flip( of0 ); + stbir__decode_simdf4_flip( of1 ); + stbir__simdf_store( decode + 0, of0 ); + stbir__simdf_store( decode + 4, of1 ); + #endif + decode += 8; + input += 8; + if ( decode <= decode_end ) + continue; + if ( decode == ( decode_end + 8 ) ) + break; + decode = decode_end; // backup and do last couple + input = end_input_m8; + } + return decode_end + 8; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + decode += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode <= decode_end ) + { + STBIR_SIMD_NO_UNROLL(decode); + decode[0-4] = ((float)(input[stbir__decode_order0])) * stbir__max_uint16_as_float_inverted; + decode[1-4] = ((float)(input[stbir__decode_order1])) * stbir__max_uint16_as_float_inverted; + decode[2-4] = ((float)(input[stbir__decode_order2])) * stbir__max_uint16_as_float_inverted; + decode[3-4] = ((float)(input[stbir__decode_order3])) * stbir__max_uint16_as_float_inverted; + decode += 4; + input += 4; + } + decode -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( decode < decode_end ) + { + STBIR_NO_UNROLL(decode); + decode[0] = ((float)(input[stbir__decode_order0])) * stbir__max_uint16_as_float_inverted; + #if stbir__coder_min_num >= 2 + decode[1] = ((float)(input[stbir__decode_order1])) * stbir__max_uint16_as_float_inverted; + #endif + #if stbir__coder_min_num >= 3 + decode[2] = ((float)(input[stbir__decode_order2])) * stbir__max_uint16_as_float_inverted; + #endif + decode += stbir__coder_min_num; + input += stbir__coder_min_num; + } + #endif + return decode_end; +} + + +static void STBIR__CODER_NAME(stbir__encode_uint16_linear_scaled)( void * outputp, int width_times_channels, float const * encode ) +{ + unsigned short STBIR_SIMD_STREAMOUT_PTR( * ) output = (unsigned short*) outputp; + unsigned short * end_output = ( (unsigned short*) output ) + width_times_channels; + + #ifdef STBIR_SIMD + { + if ( width_times_channels >= stbir__simdfX_float_count*2 ) + { + float const * end_encode_m8 = encode + width_times_channels - stbir__simdfX_float_count*2; + end_output -= stbir__simdfX_float_count*2; + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdfX e0, e1; + stbir__simdiX i; + STBIR_SIMD_NO_UNROLL(encode); + stbir__simdfX_madd_mem( e0, STBIR_simd_point5X, STBIR_max_uint16_as_floatX, encode ); + stbir__simdfX_madd_mem( e1, STBIR_simd_point5X, STBIR_max_uint16_as_floatX, encode+stbir__simdfX_float_count ); + stbir__encode_simdfX_unflip( e0 ); + stbir__encode_simdfX_unflip( e1 ); + stbir__simdfX_pack_to_words( i, e0, e1 ); + stbir__simdiX_store( output, i ); + encode += stbir__simdfX_float_count*2; + output += stbir__simdfX_float_count*2; + if ( output <= end_output ) + continue; + if ( output == ( end_output + stbir__simdfX_float_count*2 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m8; + } + return; + } + } + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + stbir__simdf e; + stbir__simdi i; + STBIR_NO_UNROLL(encode); + stbir__simdf_load( e, encode ); + stbir__simdf_madd( e, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint16_as_float), e ); + stbir__encode_simdf4_unflip( e ); + stbir__simdf_pack_to_8words( i, e, e ); // only use first 4 + stbir__simdi_store2( output-4, i ); + output += 4; + encode += 4; + } + output -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + stbir__simdf e; + STBIR_NO_UNROLL(encode); + stbir__simdf_madd1_mem( e, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint16_as_float), encode+stbir__encode_order0 ); output[0] = stbir__simdf_convert_float_to_short( e ); + #if stbir__coder_min_num >= 2 + stbir__simdf_madd1_mem( e, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint16_as_float), encode+stbir__encode_order1 ); output[1] = stbir__simdf_convert_float_to_short( e ); + #endif + #if stbir__coder_min_num >= 3 + stbir__simdf_madd1_mem( e, STBIR__CONSTF(STBIR_simd_point5), STBIR__CONSTF(STBIR_max_uint16_as_float), encode+stbir__encode_order2 ); output[2] = stbir__simdf_convert_float_to_short( e ); + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif + + #else + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + float f; + STBIR_SIMD_NO_UNROLL(encode); + f = encode[stbir__encode_order0] * stbir__max_uint16_as_float + 0.5f; STBIR_CLAMP(f, 0, 65535); output[0-4] = (unsigned short)f; + f = encode[stbir__encode_order1] * stbir__max_uint16_as_float + 0.5f; STBIR_CLAMP(f, 0, 65535); output[1-4] = (unsigned short)f; + f = encode[stbir__encode_order2] * stbir__max_uint16_as_float + 0.5f; STBIR_CLAMP(f, 0, 65535); output[2-4] = (unsigned short)f; + f = encode[stbir__encode_order3] * stbir__max_uint16_as_float + 0.5f; STBIR_CLAMP(f, 0, 65535); output[3-4] = (unsigned short)f; + output += 4; + encode += 4; + } + output -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + float f; + STBIR_NO_UNROLL(encode); + f = encode[stbir__encode_order0] * stbir__max_uint16_as_float + 0.5f; STBIR_CLAMP(f, 0, 65535); output[0] = (unsigned short)f; + #if stbir__coder_min_num >= 2 + f = encode[stbir__encode_order1] * stbir__max_uint16_as_float + 0.5f; STBIR_CLAMP(f, 0, 65535); output[1] = (unsigned short)f; + #endif + #if stbir__coder_min_num >= 3 + f = encode[stbir__encode_order2] * stbir__max_uint16_as_float + 0.5f; STBIR_CLAMP(f, 0, 65535); output[2] = (unsigned short)f; + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif + #endif +} + +static float * STBIR__CODER_NAME(stbir__decode_uint16_linear)( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + unsigned short const * input = (unsigned short const *)inputp; + + #ifdef STBIR_SIMD + unsigned short const * end_input_m8 = input + width_times_channels - 8; + if ( width_times_channels >= 8 ) + { + decode_end -= 8; + STBIR_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + #ifdef STBIR_SIMD8 + stbir__simdi i; stbir__simdi8 o; + stbir__simdf8 of; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi8_expand_u16_to_u32( o, i ); + stbir__simdi8_convert_i32_to_float( of, o ); + stbir__decode_simdf8_flip( of ); + stbir__simdf8_store( decode + 0, of ); + #else + stbir__simdi i, o0, o1; + stbir__simdf of0, of1; + STBIR_NO_UNROLL(decode); + stbir__simdi_load( i, input ); + stbir__simdi_expand_u16_to_u32( o0, o1, i ); + stbir__simdi_convert_i32_to_float( of0, o0 ); + stbir__simdi_convert_i32_to_float( of1, o1 ); + stbir__decode_simdf4_flip( of0 ); + stbir__decode_simdf4_flip( of1 ); + stbir__simdf_store( decode + 0, of0 ); + stbir__simdf_store( decode + 4, of1 ); + #endif + decode += 8; + input += 8; + if ( decode <= decode_end ) + continue; + if ( decode == ( decode_end + 8 ) ) + break; + decode = decode_end; // backup and do last couple + input = end_input_m8; + } + return decode_end + 8; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + decode += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode <= decode_end ) + { + STBIR_SIMD_NO_UNROLL(decode); + decode[0-4] = ((float)(input[stbir__decode_order0])); + decode[1-4] = ((float)(input[stbir__decode_order1])); + decode[2-4] = ((float)(input[stbir__decode_order2])); + decode[3-4] = ((float)(input[stbir__decode_order3])); + decode += 4; + input += 4; + } + decode -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( decode < decode_end ) + { + STBIR_NO_UNROLL(decode); + decode[0] = ((float)(input[stbir__decode_order0])); + #if stbir__coder_min_num >= 2 + decode[1] = ((float)(input[stbir__decode_order1])); + #endif + #if stbir__coder_min_num >= 3 + decode[2] = ((float)(input[stbir__decode_order2])); + #endif + decode += stbir__coder_min_num; + input += stbir__coder_min_num; + } + #endif + return decode_end; +} + +static void STBIR__CODER_NAME(stbir__encode_uint16_linear)( void * outputp, int width_times_channels, float const * encode ) +{ + unsigned short STBIR_SIMD_STREAMOUT_PTR( * ) output = (unsigned short*) outputp; + unsigned short * end_output = ( (unsigned short*) output ) + width_times_channels; + + #ifdef STBIR_SIMD + { + if ( width_times_channels >= stbir__simdfX_float_count*2 ) + { + float const * end_encode_m8 = encode + width_times_channels - stbir__simdfX_float_count*2; + end_output -= stbir__simdfX_float_count*2; + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdfX e0, e1; + stbir__simdiX i; + STBIR_SIMD_NO_UNROLL(encode); + stbir__simdfX_add_mem( e0, STBIR_simd_point5X, encode ); + stbir__simdfX_add_mem( e1, STBIR_simd_point5X, encode+stbir__simdfX_float_count ); + stbir__encode_simdfX_unflip( e0 ); + stbir__encode_simdfX_unflip( e1 ); + stbir__simdfX_pack_to_words( i, e0, e1 ); + stbir__simdiX_store( output, i ); + encode += stbir__simdfX_float_count*2; + output += stbir__simdfX_float_count*2; + if ( output <= end_output ) + continue; + if ( output == ( end_output + stbir__simdfX_float_count*2 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m8; + } + return; + } + } + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + stbir__simdf e; + stbir__simdi i; + STBIR_NO_UNROLL(encode); + stbir__simdf_load( e, encode ); + stbir__simdf_add( e, STBIR__CONSTF(STBIR_simd_point5), e ); + stbir__encode_simdf4_unflip( e ); + stbir__simdf_pack_to_8words( i, e, e ); // only use first 4 + stbir__simdi_store2( output-4, i ); + output += 4; + encode += 4; + } + output -= 4; + #endif + + #else + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + float f; + STBIR_SIMD_NO_UNROLL(encode); + f = encode[stbir__encode_order0] + 0.5f; STBIR_CLAMP(f, 0, 65535); output[0-4] = (unsigned short)f; + f = encode[stbir__encode_order1] + 0.5f; STBIR_CLAMP(f, 0, 65535); output[1-4] = (unsigned short)f; + f = encode[stbir__encode_order2] + 0.5f; STBIR_CLAMP(f, 0, 65535); output[2-4] = (unsigned short)f; + f = encode[stbir__encode_order3] + 0.5f; STBIR_CLAMP(f, 0, 65535); output[3-4] = (unsigned short)f; + output += 4; + encode += 4; + } + output -= 4; + #endif + + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + float f; + STBIR_NO_UNROLL(encode); + f = encode[stbir__encode_order0] + 0.5f; STBIR_CLAMP(f, 0, 65535); output[0] = (unsigned short)f; + #if stbir__coder_min_num >= 2 + f = encode[stbir__encode_order1] + 0.5f; STBIR_CLAMP(f, 0, 65535); output[1] = (unsigned short)f; + #endif + #if stbir__coder_min_num >= 3 + f = encode[stbir__encode_order2] + 0.5f; STBIR_CLAMP(f, 0, 65535); output[2] = (unsigned short)f; + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif +} + +static float * STBIR__CODER_NAME(stbir__decode_half_float_linear)( float * decodep, int width_times_channels, void const * inputp ) +{ + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + stbir__FP16 const * input = (stbir__FP16 const *)inputp; + + #ifdef STBIR_SIMD + if ( width_times_channels >= 8 ) + { + stbir__FP16 const * end_input_m8 = input + width_times_channels - 8; + decode_end -= 8; + STBIR_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + STBIR_NO_UNROLL(decode); + + stbir__half_to_float_SIMD( decode, input ); + #ifdef stbir__decode_swizzle + #ifdef STBIR_SIMD8 + { + stbir__simdf8 of; + stbir__simdf8_load( of, decode ); + stbir__decode_simdf8_flip( of ); + stbir__simdf8_store( decode, of ); + } + #else + { + stbir__simdf of0,of1; + stbir__simdf_load( of0, decode ); + stbir__simdf_load( of1, decode+4 ); + stbir__decode_simdf4_flip( of0 ); + stbir__decode_simdf4_flip( of1 ); + stbir__simdf_store( decode, of0 ); + stbir__simdf_store( decode+4, of1 ); + } + #endif + #endif + decode += 8; + input += 8; + if ( decode <= decode_end ) + continue; + if ( decode == ( decode_end + 8 ) ) + break; + decode = decode_end; // backup and do last couple + input = end_input_m8; + } + return decode_end + 8; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + decode += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode <= decode_end ) + { + STBIR_SIMD_NO_UNROLL(decode); + decode[0-4] = stbir__half_to_float(input[stbir__decode_order0]); + decode[1-4] = stbir__half_to_float(input[stbir__decode_order1]); + decode[2-4] = stbir__half_to_float(input[stbir__decode_order2]); + decode[3-4] = stbir__half_to_float(input[stbir__decode_order3]); + decode += 4; + input += 4; + } + decode -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( decode < decode_end ) + { + STBIR_NO_UNROLL(decode); + decode[0] = stbir__half_to_float(input[stbir__decode_order0]); + #if stbir__coder_min_num >= 2 + decode[1] = stbir__half_to_float(input[stbir__decode_order1]); + #endif + #if stbir__coder_min_num >= 3 + decode[2] = stbir__half_to_float(input[stbir__decode_order2]); + #endif + decode += stbir__coder_min_num; + input += stbir__coder_min_num; + } + #endif + return decode_end; +} + +static void STBIR__CODER_NAME( stbir__encode_half_float_linear )( void * outputp, int width_times_channels, float const * encode ) +{ + stbir__FP16 STBIR_SIMD_STREAMOUT_PTR( * ) output = (stbir__FP16*) outputp; + stbir__FP16 * end_output = ( (stbir__FP16*) output ) + width_times_channels; + + #ifdef STBIR_SIMD + if ( width_times_channels >= 8 ) + { + float const * end_encode_m8 = encode + width_times_channels - 8; + end_output -= 8; + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + STBIR_SIMD_NO_UNROLL(encode); + #ifdef stbir__decode_swizzle + #ifdef STBIR_SIMD8 + { + stbir__simdf8 of; + stbir__simdf8_load( of, encode ); + stbir__encode_simdf8_unflip( of ); + stbir__float_to_half_SIMD( output, (float*)&of ); + } + #else + { + stbir__simdf of[2]; + stbir__simdf_load( of[0], encode ); + stbir__simdf_load( of[1], encode+4 ); + stbir__encode_simdf4_unflip( of[0] ); + stbir__encode_simdf4_unflip( of[1] ); + stbir__float_to_half_SIMD( output, (float*)of ); + } + #endif + #else + stbir__float_to_half_SIMD( output, encode ); + #endif + encode += 8; + output += 8; + if ( output <= end_output ) + continue; + if ( output == ( end_output + 8 ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m8; + } + return; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + STBIR_SIMD_NO_UNROLL(output); + output[0-4] = stbir__float_to_half(encode[stbir__encode_order0]); + output[1-4] = stbir__float_to_half(encode[stbir__encode_order1]); + output[2-4] = stbir__float_to_half(encode[stbir__encode_order2]); + output[3-4] = stbir__float_to_half(encode[stbir__encode_order3]); + output += 4; + encode += 4; + } + output -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + STBIR_NO_UNROLL(output); + output[0] = stbir__float_to_half(encode[stbir__encode_order0]); + #if stbir__coder_min_num >= 2 + output[1] = stbir__float_to_half(encode[stbir__encode_order1]); + #endif + #if stbir__coder_min_num >= 3 + output[2] = stbir__float_to_half(encode[stbir__encode_order2]); + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif +} + +static float * STBIR__CODER_NAME(stbir__decode_float_linear)( float * decodep, int width_times_channels, void const * inputp ) +{ + #ifdef stbir__decode_swizzle + float STBIR_STREAMOUT_PTR( * ) decode = decodep; + float * decode_end = (float*) decode + width_times_channels; + float const * input = (float const *)inputp; + + #ifdef STBIR_SIMD + if ( width_times_channels >= 16 ) + { + float const * end_input_m16 = input + width_times_channels - 16; + decode_end -= 16; + STBIR_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + STBIR_NO_UNROLL(decode); + #ifdef stbir__decode_swizzle + #ifdef STBIR_SIMD8 + { + stbir__simdf8 of0,of1; + stbir__simdf8_load( of0, input ); + stbir__simdf8_load( of1, input+8 ); + stbir__decode_simdf8_flip( of0 ); + stbir__decode_simdf8_flip( of1 ); + stbir__simdf8_store( decode, of0 ); + stbir__simdf8_store( decode+8, of1 ); + } + #else + { + stbir__simdf of0,of1,of2,of3; + stbir__simdf_load( of0, input ); + stbir__simdf_load( of1, input+4 ); + stbir__simdf_load( of2, input+8 ); + stbir__simdf_load( of3, input+12 ); + stbir__decode_simdf4_flip( of0 ); + stbir__decode_simdf4_flip( of1 ); + stbir__decode_simdf4_flip( of2 ); + stbir__decode_simdf4_flip( of3 ); + stbir__simdf_store( decode, of0 ); + stbir__simdf_store( decode+4, of1 ); + stbir__simdf_store( decode+8, of2 ); + stbir__simdf_store( decode+12, of3 ); + } + #endif + #endif + decode += 16; + input += 16; + if ( decode <= decode_end ) + continue; + if ( decode == ( decode_end + 16 ) ) + break; + decode = decode_end; // backup and do last couple + input = end_input_m16; + } + return decode_end + 16; + } + #endif + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + decode += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( decode <= decode_end ) + { + STBIR_SIMD_NO_UNROLL(decode); + decode[0-4] = input[stbir__decode_order0]; + decode[1-4] = input[stbir__decode_order1]; + decode[2-4] = input[stbir__decode_order2]; + decode[3-4] = input[stbir__decode_order3]; + decode += 4; + input += 4; + } + decode -= 4; + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( decode < decode_end ) + { + STBIR_NO_UNROLL(decode); + decode[0] = input[stbir__decode_order0]; + #if stbir__coder_min_num >= 2 + decode[1] = input[stbir__decode_order1]; + #endif + #if stbir__coder_min_num >= 3 + decode[2] = input[stbir__decode_order2]; + #endif + decode += stbir__coder_min_num; + input += stbir__coder_min_num; + } + #endif + return decode_end; + + #else + + if ( (void*)decodep != inputp ) + STBIR_MEMCPY( decodep, inputp, width_times_channels * sizeof( float ) ); + + return decodep + width_times_channels; + + #endif +} + +static void STBIR__CODER_NAME( stbir__encode_float_linear )( void * outputp, int width_times_channels, float const * encode ) +{ + #if !defined( STBIR_FLOAT_HIGH_CLAMP ) && !defined(STBIR_FLOAT_LOW_CLAMP) && !defined(stbir__decode_swizzle) + + if ( (void*)outputp != (void*) encode ) + STBIR_MEMCPY( outputp, encode, width_times_channels * sizeof( float ) ); + + #else + + float STBIR_SIMD_STREAMOUT_PTR( * ) output = (float*) outputp; + float * end_output = ( (float*) output ) + width_times_channels; + + #ifdef STBIR_FLOAT_HIGH_CLAMP + #define stbir_scalar_hi_clamp( v ) if ( v > STBIR_FLOAT_HIGH_CLAMP ) v = STBIR_FLOAT_HIGH_CLAMP; + #else + #define stbir_scalar_hi_clamp( v ) + #endif + #ifdef STBIR_FLOAT_LOW_CLAMP + #define stbir_scalar_lo_clamp( v ) if ( v < STBIR_FLOAT_LOW_CLAMP ) v = STBIR_FLOAT_LOW_CLAMP; + #else + #define stbir_scalar_lo_clamp( v ) + #endif + + #ifdef STBIR_SIMD + + #ifdef STBIR_FLOAT_HIGH_CLAMP + const stbir__simdfX high_clamp = stbir__simdf_frepX(STBIR_FLOAT_HIGH_CLAMP); + #endif + #ifdef STBIR_FLOAT_LOW_CLAMP + const stbir__simdfX low_clamp = stbir__simdf_frepX(STBIR_FLOAT_LOW_CLAMP); + #endif + + if ( width_times_channels >= ( stbir__simdfX_float_count * 2 ) ) + { + float const * end_encode_m8 = encode + width_times_channels - ( stbir__simdfX_float_count * 2 ); + end_output -= ( stbir__simdfX_float_count * 2 ); + STBIR_SIMD_NO_UNROLL_LOOP_START_INF_FOR + for(;;) + { + stbir__simdfX e0, e1; + STBIR_SIMD_NO_UNROLL(encode); + stbir__simdfX_load( e0, encode ); + stbir__simdfX_load( e1, encode+stbir__simdfX_float_count ); +#ifdef STBIR_FLOAT_HIGH_CLAMP + stbir__simdfX_min( e0, e0, high_clamp ); + stbir__simdfX_min( e1, e1, high_clamp ); +#endif +#ifdef STBIR_FLOAT_LOW_CLAMP + stbir__simdfX_max( e0, e0, low_clamp ); + stbir__simdfX_max( e1, e1, low_clamp ); +#endif + stbir__encode_simdfX_unflip( e0 ); + stbir__encode_simdfX_unflip( e1 ); + stbir__simdfX_store( output, e0 ); + stbir__simdfX_store( output+stbir__simdfX_float_count, e1 ); + encode += stbir__simdfX_float_count * 2; + output += stbir__simdfX_float_count * 2; + if ( output <= end_output ) + continue; + if ( output == ( end_output + ( stbir__simdfX_float_count * 2 ) ) ) + break; + output = end_output; // backup and do last couple + encode = end_encode_m8; + } + return; + } + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + stbir__simdf e0; + STBIR_NO_UNROLL(encode); + stbir__simdf_load( e0, encode ); +#ifdef STBIR_FLOAT_HIGH_CLAMP + stbir__simdf_min( e0, e0, high_clamp ); +#endif +#ifdef STBIR_FLOAT_LOW_CLAMP + stbir__simdf_max( e0, e0, low_clamp ); +#endif + stbir__encode_simdf4_unflip( e0 ); + stbir__simdf_store( output-4, e0 ); + output += 4; + encode += 4; + } + output -= 4; + #endif + + #else + + // try to do blocks of 4 when you can + #if stbir__coder_min_num != 3 // doesn't divide cleanly by four + output += 4; + STBIR_SIMD_NO_UNROLL_LOOP_START + while( output <= end_output ) + { + float e; + STBIR_SIMD_NO_UNROLL(encode); + e = encode[ stbir__encode_order0 ]; stbir_scalar_hi_clamp( e ); stbir_scalar_lo_clamp( e ); output[0-4] = e; + e = encode[ stbir__encode_order1 ]; stbir_scalar_hi_clamp( e ); stbir_scalar_lo_clamp( e ); output[1-4] = e; + e = encode[ stbir__encode_order2 ]; stbir_scalar_hi_clamp( e ); stbir_scalar_lo_clamp( e ); output[2-4] = e; + e = encode[ stbir__encode_order3 ]; stbir_scalar_hi_clamp( e ); stbir_scalar_lo_clamp( e ); output[3-4] = e; + output += 4; + encode += 4; + } + output -= 4; + + #endif + + #endif + + // do the remnants + #if stbir__coder_min_num < 4 + STBIR_NO_UNROLL_LOOP_START + while( output < end_output ) + { + float e; + STBIR_NO_UNROLL(encode); + e = encode[ stbir__encode_order0 ]; stbir_scalar_hi_clamp( e ); stbir_scalar_lo_clamp( e ); output[0] = e; + #if stbir__coder_min_num >= 2 + e = encode[ stbir__encode_order1 ]; stbir_scalar_hi_clamp( e ); stbir_scalar_lo_clamp( e ); output[1] = e; + #endif + #if stbir__coder_min_num >= 3 + e = encode[ stbir__encode_order2 ]; stbir_scalar_hi_clamp( e ); stbir_scalar_lo_clamp( e ); output[2] = e; + #endif + output += stbir__coder_min_num; + encode += stbir__coder_min_num; + } + #endif + + #endif +} + +#undef stbir__decode_suffix +#undef stbir__decode_simdf8_flip +#undef stbir__decode_simdf4_flip +#undef stbir__decode_order0 +#undef stbir__decode_order1 +#undef stbir__decode_order2 +#undef stbir__decode_order3 +#undef stbir__encode_order0 +#undef stbir__encode_order1 +#undef stbir__encode_order2 +#undef stbir__encode_order3 +#undef stbir__encode_simdf8_unflip +#undef stbir__encode_simdf4_unflip +#undef stbir__encode_simdfX_unflip +#undef STBIR__CODER_NAME +#undef stbir__coder_min_num +#undef stbir__decode_swizzle +#undef stbir_scalar_hi_clamp +#undef stbir_scalar_lo_clamp +#undef STB_IMAGE_RESIZE_DO_CODERS + +#elif defined( STB_IMAGE_RESIZE_DO_VERTICALS) + +#ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#define STBIR_chans( start, end ) STBIR_strs_join14(start,STBIR__vertical_channels,end,_cont) +#else +#define STBIR_chans( start, end ) STBIR_strs_join1(start,STBIR__vertical_channels,end) +#endif + +#if STBIR__vertical_channels >= 1 +#define stbIF0( code ) code +#else +#define stbIF0( code ) +#endif +#if STBIR__vertical_channels >= 2 +#define stbIF1( code ) code +#else +#define stbIF1( code ) +#endif +#if STBIR__vertical_channels >= 3 +#define stbIF2( code ) code +#else +#define stbIF2( code ) +#endif +#if STBIR__vertical_channels >= 4 +#define stbIF3( code ) code +#else +#define stbIF3( code ) +#endif +#if STBIR__vertical_channels >= 5 +#define stbIF4( code ) code +#else +#define stbIF4( code ) +#endif +#if STBIR__vertical_channels >= 6 +#define stbIF5( code ) code +#else +#define stbIF5( code ) +#endif +#if STBIR__vertical_channels >= 7 +#define stbIF6( code ) code +#else +#define stbIF6( code ) +#endif +#if STBIR__vertical_channels >= 8 +#define stbIF7( code ) code +#else +#define stbIF7( code ) +#endif + +static void STBIR_chans( stbir__vertical_scatter_with_,_coeffs)( float ** outputs, float const * vertical_coefficients, float const * input, float const * input_end ) +{ + stbIF0( float STBIR_SIMD_STREAMOUT_PTR( * ) output0 = outputs[0]; float c0s = vertical_coefficients[0]; ) + stbIF1( float STBIR_SIMD_STREAMOUT_PTR( * ) output1 = outputs[1]; float c1s = vertical_coefficients[1]; ) + stbIF2( float STBIR_SIMD_STREAMOUT_PTR( * ) output2 = outputs[2]; float c2s = vertical_coefficients[2]; ) + stbIF3( float STBIR_SIMD_STREAMOUT_PTR( * ) output3 = outputs[3]; float c3s = vertical_coefficients[3]; ) + stbIF4( float STBIR_SIMD_STREAMOUT_PTR( * ) output4 = outputs[4]; float c4s = vertical_coefficients[4]; ) + stbIF5( float STBIR_SIMD_STREAMOUT_PTR( * ) output5 = outputs[5]; float c5s = vertical_coefficients[5]; ) + stbIF6( float STBIR_SIMD_STREAMOUT_PTR( * ) output6 = outputs[6]; float c6s = vertical_coefficients[6]; ) + stbIF7( float STBIR_SIMD_STREAMOUT_PTR( * ) output7 = outputs[7]; float c7s = vertical_coefficients[7]; ) + + #ifdef STBIR_SIMD + { + stbIF0(stbir__simdfX c0 = stbir__simdf_frepX( c0s ); ) + stbIF1(stbir__simdfX c1 = stbir__simdf_frepX( c1s ); ) + stbIF2(stbir__simdfX c2 = stbir__simdf_frepX( c2s ); ) + stbIF3(stbir__simdfX c3 = stbir__simdf_frepX( c3s ); ) + stbIF4(stbir__simdfX c4 = stbir__simdf_frepX( c4s ); ) + stbIF5(stbir__simdfX c5 = stbir__simdf_frepX( c5s ); ) + stbIF6(stbir__simdfX c6 = stbir__simdf_frepX( c6s ); ) + stbIF7(stbir__simdfX c7 = stbir__simdf_frepX( c7s ); ) + STBIR_SIMD_NO_UNROLL_LOOP_START + while ( ( (char*)input_end - (char*) input ) >= (16*stbir__simdfX_float_count) ) + { + stbir__simdfX o0, o1, o2, o3, r0, r1, r2, r3; + STBIR_SIMD_NO_UNROLL(output0); + + stbir__simdfX_load( r0, input ); stbir__simdfX_load( r1, input+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input+(3*stbir__simdfX_float_count) ); + + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( stbir__simdfX_load( o0, output0 ); stbir__simdfX_load( o1, output0+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output0+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output0+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c0 ); stbir__simdfX_madd( o1, o1, r1, c0 ); stbir__simdfX_madd( o2, o2, r2, c0 ); stbir__simdfX_madd( o3, o3, r3, c0 ); + stbir__simdfX_store( output0, o0 ); stbir__simdfX_store( output0+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output0+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output0+(3*stbir__simdfX_float_count), o3 ); ) + stbIF1( stbir__simdfX_load( o0, output1 ); stbir__simdfX_load( o1, output1+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output1+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output1+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c1 ); stbir__simdfX_madd( o1, o1, r1, c1 ); stbir__simdfX_madd( o2, o2, r2, c1 ); stbir__simdfX_madd( o3, o3, r3, c1 ); + stbir__simdfX_store( output1, o0 ); stbir__simdfX_store( output1+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output1+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output1+(3*stbir__simdfX_float_count), o3 ); ) + stbIF2( stbir__simdfX_load( o0, output2 ); stbir__simdfX_load( o1, output2+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output2+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output2+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c2 ); stbir__simdfX_madd( o1, o1, r1, c2 ); stbir__simdfX_madd( o2, o2, r2, c2 ); stbir__simdfX_madd( o3, o3, r3, c2 ); + stbir__simdfX_store( output2, o0 ); stbir__simdfX_store( output2+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output2+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output2+(3*stbir__simdfX_float_count), o3 ); ) + stbIF3( stbir__simdfX_load( o0, output3 ); stbir__simdfX_load( o1, output3+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output3+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output3+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c3 ); stbir__simdfX_madd( o1, o1, r1, c3 ); stbir__simdfX_madd( o2, o2, r2, c3 ); stbir__simdfX_madd( o3, o3, r3, c3 ); + stbir__simdfX_store( output3, o0 ); stbir__simdfX_store( output3+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output3+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output3+(3*stbir__simdfX_float_count), o3 ); ) + stbIF4( stbir__simdfX_load( o0, output4 ); stbir__simdfX_load( o1, output4+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output4+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output4+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c4 ); stbir__simdfX_madd( o1, o1, r1, c4 ); stbir__simdfX_madd( o2, o2, r2, c4 ); stbir__simdfX_madd( o3, o3, r3, c4 ); + stbir__simdfX_store( output4, o0 ); stbir__simdfX_store( output4+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output4+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output4+(3*stbir__simdfX_float_count), o3 ); ) + stbIF5( stbir__simdfX_load( o0, output5 ); stbir__simdfX_load( o1, output5+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output5+(2*stbir__simdfX_float_count)); stbir__simdfX_load( o3, output5+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c5 ); stbir__simdfX_madd( o1, o1, r1, c5 ); stbir__simdfX_madd( o2, o2, r2, c5 ); stbir__simdfX_madd( o3, o3, r3, c5 ); + stbir__simdfX_store( output5, o0 ); stbir__simdfX_store( output5+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output5+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output5+(3*stbir__simdfX_float_count), o3 ); ) + stbIF6( stbir__simdfX_load( o0, output6 ); stbir__simdfX_load( o1, output6+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output6+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output6+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c6 ); stbir__simdfX_madd( o1, o1, r1, c6 ); stbir__simdfX_madd( o2, o2, r2, c6 ); stbir__simdfX_madd( o3, o3, r3, c6 ); + stbir__simdfX_store( output6, o0 ); stbir__simdfX_store( output6+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output6+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output6+(3*stbir__simdfX_float_count), o3 ); ) + stbIF7( stbir__simdfX_load( o0, output7 ); stbir__simdfX_load( o1, output7+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output7+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output7+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c7 ); stbir__simdfX_madd( o1, o1, r1, c7 ); stbir__simdfX_madd( o2, o2, r2, c7 ); stbir__simdfX_madd( o3, o3, r3, c7 ); + stbir__simdfX_store( output7, o0 ); stbir__simdfX_store( output7+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output7+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output7+(3*stbir__simdfX_float_count), o3 ); ) + #else + stbIF0( stbir__simdfX_mult( o0, r0, c0 ); stbir__simdfX_mult( o1, r1, c0 ); stbir__simdfX_mult( o2, r2, c0 ); stbir__simdfX_mult( o3, r3, c0 ); + stbir__simdfX_store( output0, o0 ); stbir__simdfX_store( output0+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output0+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output0+(3*stbir__simdfX_float_count), o3 ); ) + stbIF1( stbir__simdfX_mult( o0, r0, c1 ); stbir__simdfX_mult( o1, r1, c1 ); stbir__simdfX_mult( o2, r2, c1 ); stbir__simdfX_mult( o3, r3, c1 ); + stbir__simdfX_store( output1, o0 ); stbir__simdfX_store( output1+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output1+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output1+(3*stbir__simdfX_float_count), o3 ); ) + stbIF2( stbir__simdfX_mult( o0, r0, c2 ); stbir__simdfX_mult( o1, r1, c2 ); stbir__simdfX_mult( o2, r2, c2 ); stbir__simdfX_mult( o3, r3, c2 ); + stbir__simdfX_store( output2, o0 ); stbir__simdfX_store( output2+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output2+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output2+(3*stbir__simdfX_float_count), o3 ); ) + stbIF3( stbir__simdfX_mult( o0, r0, c3 ); stbir__simdfX_mult( o1, r1, c3 ); stbir__simdfX_mult( o2, r2, c3 ); stbir__simdfX_mult( o3, r3, c3 ); + stbir__simdfX_store( output3, o0 ); stbir__simdfX_store( output3+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output3+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output3+(3*stbir__simdfX_float_count), o3 ); ) + stbIF4( stbir__simdfX_mult( o0, r0, c4 ); stbir__simdfX_mult( o1, r1, c4 ); stbir__simdfX_mult( o2, r2, c4 ); stbir__simdfX_mult( o3, r3, c4 ); + stbir__simdfX_store( output4, o0 ); stbir__simdfX_store( output4+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output4+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output4+(3*stbir__simdfX_float_count), o3 ); ) + stbIF5( stbir__simdfX_mult( o0, r0, c5 ); stbir__simdfX_mult( o1, r1, c5 ); stbir__simdfX_mult( o2, r2, c5 ); stbir__simdfX_mult( o3, r3, c5 ); + stbir__simdfX_store( output5, o0 ); stbir__simdfX_store( output5+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output5+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output5+(3*stbir__simdfX_float_count), o3 ); ) + stbIF6( stbir__simdfX_mult( o0, r0, c6 ); stbir__simdfX_mult( o1, r1, c6 ); stbir__simdfX_mult( o2, r2, c6 ); stbir__simdfX_mult( o3, r3, c6 ); + stbir__simdfX_store( output6, o0 ); stbir__simdfX_store( output6+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output6+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output6+(3*stbir__simdfX_float_count), o3 ); ) + stbIF7( stbir__simdfX_mult( o0, r0, c7 ); stbir__simdfX_mult( o1, r1, c7 ); stbir__simdfX_mult( o2, r2, c7 ); stbir__simdfX_mult( o3, r3, c7 ); + stbir__simdfX_store( output7, o0 ); stbir__simdfX_store( output7+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output7+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output7+(3*stbir__simdfX_float_count), o3 ); ) + #endif + + input += (4*stbir__simdfX_float_count); + stbIF0( output0 += (4*stbir__simdfX_float_count); ) stbIF1( output1 += (4*stbir__simdfX_float_count); ) stbIF2( output2 += (4*stbir__simdfX_float_count); ) stbIF3( output3 += (4*stbir__simdfX_float_count); ) stbIF4( output4 += (4*stbir__simdfX_float_count); ) stbIF5( output5 += (4*stbir__simdfX_float_count); ) stbIF6( output6 += (4*stbir__simdfX_float_count); ) stbIF7( output7 += (4*stbir__simdfX_float_count); ) + } + STBIR_SIMD_NO_UNROLL_LOOP_START + while ( ( (char*)input_end - (char*) input ) >= 16 ) + { + stbir__simdf o0, r0; + STBIR_SIMD_NO_UNROLL(output0); + + stbir__simdf_load( r0, input ); + + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( stbir__simdf_load( o0, output0 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c0 ) ); stbir__simdf_store( output0, o0 ); ) + stbIF1( stbir__simdf_load( o0, output1 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c1 ) ); stbir__simdf_store( output1, o0 ); ) + stbIF2( stbir__simdf_load( o0, output2 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c2 ) ); stbir__simdf_store( output2, o0 ); ) + stbIF3( stbir__simdf_load( o0, output3 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c3 ) ); stbir__simdf_store( output3, o0 ); ) + stbIF4( stbir__simdf_load( o0, output4 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c4 ) ); stbir__simdf_store( output4, o0 ); ) + stbIF5( stbir__simdf_load( o0, output5 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c5 ) ); stbir__simdf_store( output5, o0 ); ) + stbIF6( stbir__simdf_load( o0, output6 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c6 ) ); stbir__simdf_store( output6, o0 ); ) + stbIF7( stbir__simdf_load( o0, output7 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c7 ) ); stbir__simdf_store( output7, o0 ); ) + #else + stbIF0( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c0 ) ); stbir__simdf_store( output0, o0 ); ) + stbIF1( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c1 ) ); stbir__simdf_store( output1, o0 ); ) + stbIF2( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c2 ) ); stbir__simdf_store( output2, o0 ); ) + stbIF3( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c3 ) ); stbir__simdf_store( output3, o0 ); ) + stbIF4( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c4 ) ); stbir__simdf_store( output4, o0 ); ) + stbIF5( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c5 ) ); stbir__simdf_store( output5, o0 ); ) + stbIF6( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c6 ) ); stbir__simdf_store( output6, o0 ); ) + stbIF7( stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c7 ) ); stbir__simdf_store( output7, o0 ); ) + #endif + + input += 4; + stbIF0( output0 += 4; ) stbIF1( output1 += 4; ) stbIF2( output2 += 4; ) stbIF3( output3 += 4; ) stbIF4( output4 += 4; ) stbIF5( output5 += 4; ) stbIF6( output6 += 4; ) stbIF7( output7 += 4; ) + } + } + #else + STBIR_NO_UNROLL_LOOP_START + while ( ( (char*)input_end - (char*) input ) >= 16 ) + { + float r0, r1, r2, r3; + STBIR_NO_UNROLL(input); + + r0 = input[0], r1 = input[1], r2 = input[2], r3 = input[3]; + + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( output0[0] += ( r0 * c0s ); output0[1] += ( r1 * c0s ); output0[2] += ( r2 * c0s ); output0[3] += ( r3 * c0s ); ) + stbIF1( output1[0] += ( r0 * c1s ); output1[1] += ( r1 * c1s ); output1[2] += ( r2 * c1s ); output1[3] += ( r3 * c1s ); ) + stbIF2( output2[0] += ( r0 * c2s ); output2[1] += ( r1 * c2s ); output2[2] += ( r2 * c2s ); output2[3] += ( r3 * c2s ); ) + stbIF3( output3[0] += ( r0 * c3s ); output3[1] += ( r1 * c3s ); output3[2] += ( r2 * c3s ); output3[3] += ( r3 * c3s ); ) + stbIF4( output4[0] += ( r0 * c4s ); output4[1] += ( r1 * c4s ); output4[2] += ( r2 * c4s ); output4[3] += ( r3 * c4s ); ) + stbIF5( output5[0] += ( r0 * c5s ); output5[1] += ( r1 * c5s ); output5[2] += ( r2 * c5s ); output5[3] += ( r3 * c5s ); ) + stbIF6( output6[0] += ( r0 * c6s ); output6[1] += ( r1 * c6s ); output6[2] += ( r2 * c6s ); output6[3] += ( r3 * c6s ); ) + stbIF7( output7[0] += ( r0 * c7s ); output7[1] += ( r1 * c7s ); output7[2] += ( r2 * c7s ); output7[3] += ( r3 * c7s ); ) + #else + stbIF0( output0[0] = ( r0 * c0s ); output0[1] = ( r1 * c0s ); output0[2] = ( r2 * c0s ); output0[3] = ( r3 * c0s ); ) + stbIF1( output1[0] = ( r0 * c1s ); output1[1] = ( r1 * c1s ); output1[2] = ( r2 * c1s ); output1[3] = ( r3 * c1s ); ) + stbIF2( output2[0] = ( r0 * c2s ); output2[1] = ( r1 * c2s ); output2[2] = ( r2 * c2s ); output2[3] = ( r3 * c2s ); ) + stbIF3( output3[0] = ( r0 * c3s ); output3[1] = ( r1 * c3s ); output3[2] = ( r2 * c3s ); output3[3] = ( r3 * c3s ); ) + stbIF4( output4[0] = ( r0 * c4s ); output4[1] = ( r1 * c4s ); output4[2] = ( r2 * c4s ); output4[3] = ( r3 * c4s ); ) + stbIF5( output5[0] = ( r0 * c5s ); output5[1] = ( r1 * c5s ); output5[2] = ( r2 * c5s ); output5[3] = ( r3 * c5s ); ) + stbIF6( output6[0] = ( r0 * c6s ); output6[1] = ( r1 * c6s ); output6[2] = ( r2 * c6s ); output6[3] = ( r3 * c6s ); ) + stbIF7( output7[0] = ( r0 * c7s ); output7[1] = ( r1 * c7s ); output7[2] = ( r2 * c7s ); output7[3] = ( r3 * c7s ); ) + #endif + + input += 4; + stbIF0( output0 += 4; ) stbIF1( output1 += 4; ) stbIF2( output2 += 4; ) stbIF3( output3 += 4; ) stbIF4( output4 += 4; ) stbIF5( output5 += 4; ) stbIF6( output6 += 4; ) stbIF7( output7 += 4; ) + } + #endif + STBIR_NO_UNROLL_LOOP_START + while ( input < input_end ) + { + float r = input[0]; + STBIR_NO_UNROLL(output0); + + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( output0[0] += ( r * c0s ); ) + stbIF1( output1[0] += ( r * c1s ); ) + stbIF2( output2[0] += ( r * c2s ); ) + stbIF3( output3[0] += ( r * c3s ); ) + stbIF4( output4[0] += ( r * c4s ); ) + stbIF5( output5[0] += ( r * c5s ); ) + stbIF6( output6[0] += ( r * c6s ); ) + stbIF7( output7[0] += ( r * c7s ); ) + #else + stbIF0( output0[0] = ( r * c0s ); ) + stbIF1( output1[0] = ( r * c1s ); ) + stbIF2( output2[0] = ( r * c2s ); ) + stbIF3( output3[0] = ( r * c3s ); ) + stbIF4( output4[0] = ( r * c4s ); ) + stbIF5( output5[0] = ( r * c5s ); ) + stbIF6( output6[0] = ( r * c6s ); ) + stbIF7( output7[0] = ( r * c7s ); ) + #endif + + ++input; + stbIF0( ++output0; ) stbIF1( ++output1; ) stbIF2( ++output2; ) stbIF3( ++output3; ) stbIF4( ++output4; ) stbIF5( ++output5; ) stbIF6( ++output6; ) stbIF7( ++output7; ) + } +} + +static void STBIR_chans( stbir__vertical_gather_with_,_coeffs)( float * outputp, float const * vertical_coefficients, float const ** inputs, float const * input0_end ) +{ + float STBIR_SIMD_STREAMOUT_PTR( * ) output = outputp; + + stbIF0( float const * input0 = inputs[0]; float c0s = vertical_coefficients[0]; ) + stbIF1( float const * input1 = inputs[1]; float c1s = vertical_coefficients[1]; ) + stbIF2( float const * input2 = inputs[2]; float c2s = vertical_coefficients[2]; ) + stbIF3( float const * input3 = inputs[3]; float c3s = vertical_coefficients[3]; ) + stbIF4( float const * input4 = inputs[4]; float c4s = vertical_coefficients[4]; ) + stbIF5( float const * input5 = inputs[5]; float c5s = vertical_coefficients[5]; ) + stbIF6( float const * input6 = inputs[6]; float c6s = vertical_coefficients[6]; ) + stbIF7( float const * input7 = inputs[7]; float c7s = vertical_coefficients[7]; ) + +#if ( STBIR__vertical_channels == 1 ) && !defined(STB_IMAGE_RESIZE_VERTICAL_CONTINUE) + // check single channel one weight + if ( ( c0s >= (1.0f-0.000001f) ) && ( c0s <= (1.0f+0.000001f) ) ) + { + STBIR_MEMCPY( output, input0, (char*)input0_end - (char*)input0 ); + return; + } +#endif + + #ifdef STBIR_SIMD + { + stbIF0(stbir__simdfX c0 = stbir__simdf_frepX( c0s ); ) + stbIF1(stbir__simdfX c1 = stbir__simdf_frepX( c1s ); ) + stbIF2(stbir__simdfX c2 = stbir__simdf_frepX( c2s ); ) + stbIF3(stbir__simdfX c3 = stbir__simdf_frepX( c3s ); ) + stbIF4(stbir__simdfX c4 = stbir__simdf_frepX( c4s ); ) + stbIF5(stbir__simdfX c5 = stbir__simdf_frepX( c5s ); ) + stbIF6(stbir__simdfX c6 = stbir__simdf_frepX( c6s ); ) + stbIF7(stbir__simdfX c7 = stbir__simdf_frepX( c7s ); ) + + STBIR_SIMD_NO_UNROLL_LOOP_START + while ( ( (char*)input0_end - (char*) input0 ) >= (16*stbir__simdfX_float_count) ) + { + stbir__simdfX o0, o1, o2, o3, r0, r1, r2, r3; + STBIR_SIMD_NO_UNROLL(output); + + // prefetch four loop iterations ahead (doesn't affect much for small resizes, but helps with big ones) + stbIF0( stbir__prefetch( input0 + (16*stbir__simdfX_float_count) ); ) + stbIF1( stbir__prefetch( input1 + (16*stbir__simdfX_float_count) ); ) + stbIF2( stbir__prefetch( input2 + (16*stbir__simdfX_float_count) ); ) + stbIF3( stbir__prefetch( input3 + (16*stbir__simdfX_float_count) ); ) + stbIF4( stbir__prefetch( input4 + (16*stbir__simdfX_float_count) ); ) + stbIF5( stbir__prefetch( input5 + (16*stbir__simdfX_float_count) ); ) + stbIF6( stbir__prefetch( input6 + (16*stbir__simdfX_float_count) ); ) + stbIF7( stbir__prefetch( input7 + (16*stbir__simdfX_float_count) ); ) + + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( stbir__simdfX_load( o0, output ); stbir__simdfX_load( o1, output+stbir__simdfX_float_count ); stbir__simdfX_load( o2, output+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( o3, output+(3*stbir__simdfX_float_count) ); + stbir__simdfX_load( r0, input0 ); stbir__simdfX_load( r1, input0+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input0+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input0+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c0 ); stbir__simdfX_madd( o1, o1, r1, c0 ); stbir__simdfX_madd( o2, o2, r2, c0 ); stbir__simdfX_madd( o3, o3, r3, c0 ); ) + #else + stbIF0( stbir__simdfX_load( r0, input0 ); stbir__simdfX_load( r1, input0+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input0+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input0+(3*stbir__simdfX_float_count) ); + stbir__simdfX_mult( o0, r0, c0 ); stbir__simdfX_mult( o1, r1, c0 ); stbir__simdfX_mult( o2, r2, c0 ); stbir__simdfX_mult( o3, r3, c0 ); ) + #endif + + stbIF1( stbir__simdfX_load( r0, input1 ); stbir__simdfX_load( r1, input1+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input1+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input1+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c1 ); stbir__simdfX_madd( o1, o1, r1, c1 ); stbir__simdfX_madd( o2, o2, r2, c1 ); stbir__simdfX_madd( o3, o3, r3, c1 ); ) + stbIF2( stbir__simdfX_load( r0, input2 ); stbir__simdfX_load( r1, input2+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input2+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input2+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c2 ); stbir__simdfX_madd( o1, o1, r1, c2 ); stbir__simdfX_madd( o2, o2, r2, c2 ); stbir__simdfX_madd( o3, o3, r3, c2 ); ) + stbIF3( stbir__simdfX_load( r0, input3 ); stbir__simdfX_load( r1, input3+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input3+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input3+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c3 ); stbir__simdfX_madd( o1, o1, r1, c3 ); stbir__simdfX_madd( o2, o2, r2, c3 ); stbir__simdfX_madd( o3, o3, r3, c3 ); ) + stbIF4( stbir__simdfX_load( r0, input4 ); stbir__simdfX_load( r1, input4+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input4+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input4+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c4 ); stbir__simdfX_madd( o1, o1, r1, c4 ); stbir__simdfX_madd( o2, o2, r2, c4 ); stbir__simdfX_madd( o3, o3, r3, c4 ); ) + stbIF5( stbir__simdfX_load( r0, input5 ); stbir__simdfX_load( r1, input5+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input5+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input5+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c5 ); stbir__simdfX_madd( o1, o1, r1, c5 ); stbir__simdfX_madd( o2, o2, r2, c5 ); stbir__simdfX_madd( o3, o3, r3, c5 ); ) + stbIF6( stbir__simdfX_load( r0, input6 ); stbir__simdfX_load( r1, input6+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input6+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input6+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c6 ); stbir__simdfX_madd( o1, o1, r1, c6 ); stbir__simdfX_madd( o2, o2, r2, c6 ); stbir__simdfX_madd( o3, o3, r3, c6 ); ) + stbIF7( stbir__simdfX_load( r0, input7 ); stbir__simdfX_load( r1, input7+stbir__simdfX_float_count ); stbir__simdfX_load( r2, input7+(2*stbir__simdfX_float_count) ); stbir__simdfX_load( r3, input7+(3*stbir__simdfX_float_count) ); + stbir__simdfX_madd( o0, o0, r0, c7 ); stbir__simdfX_madd( o1, o1, r1, c7 ); stbir__simdfX_madd( o2, o2, r2, c7 ); stbir__simdfX_madd( o3, o3, r3, c7 ); ) + + stbir__simdfX_store( output, o0 ); stbir__simdfX_store( output+stbir__simdfX_float_count, o1 ); stbir__simdfX_store( output+(2*stbir__simdfX_float_count), o2 ); stbir__simdfX_store( output+(3*stbir__simdfX_float_count), o3 ); + output += (4*stbir__simdfX_float_count); + stbIF0( input0 += (4*stbir__simdfX_float_count); ) stbIF1( input1 += (4*stbir__simdfX_float_count); ) stbIF2( input2 += (4*stbir__simdfX_float_count); ) stbIF3( input3 += (4*stbir__simdfX_float_count); ) stbIF4( input4 += (4*stbir__simdfX_float_count); ) stbIF5( input5 += (4*stbir__simdfX_float_count); ) stbIF6( input6 += (4*stbir__simdfX_float_count); ) stbIF7( input7 += (4*stbir__simdfX_float_count); ) + } + + STBIR_SIMD_NO_UNROLL_LOOP_START + while ( ( (char*)input0_end - (char*) input0 ) >= 16 ) + { + stbir__simdf o0, r0; + STBIR_SIMD_NO_UNROLL(output); + + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( stbir__simdf_load( o0, output ); stbir__simdf_load( r0, input0 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c0 ) ); ) + #else + stbIF0( stbir__simdf_load( r0, input0 ); stbir__simdf_mult( o0, r0, stbir__if_simdf8_cast_to_simdf4( c0 ) ); ) + #endif + stbIF1( stbir__simdf_load( r0, input1 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c1 ) ); ) + stbIF2( stbir__simdf_load( r0, input2 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c2 ) ); ) + stbIF3( stbir__simdf_load( r0, input3 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c3 ) ); ) + stbIF4( stbir__simdf_load( r0, input4 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c4 ) ); ) + stbIF5( stbir__simdf_load( r0, input5 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c5 ) ); ) + stbIF6( stbir__simdf_load( r0, input6 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c6 ) ); ) + stbIF7( stbir__simdf_load( r0, input7 ); stbir__simdf_madd( o0, o0, r0, stbir__if_simdf8_cast_to_simdf4( c7 ) ); ) + + stbir__simdf_store( output, o0 ); + output += 4; + stbIF0( input0 += 4; ) stbIF1( input1 += 4; ) stbIF2( input2 += 4; ) stbIF3( input3 += 4; ) stbIF4( input4 += 4; ) stbIF5( input5 += 4; ) stbIF6( input6 += 4; ) stbIF7( input7 += 4; ) + } + } + #else + STBIR_NO_UNROLL_LOOP_START + while ( ( (char*)input0_end - (char*) input0 ) >= 16 ) + { + float o0, o1, o2, o3; + STBIR_NO_UNROLL(output); + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( o0 = output[0] + input0[0] * c0s; o1 = output[1] + input0[1] * c0s; o2 = output[2] + input0[2] * c0s; o3 = output[3] + input0[3] * c0s; ) + #else + stbIF0( o0 = input0[0] * c0s; o1 = input0[1] * c0s; o2 = input0[2] * c0s; o3 = input0[3] * c0s; ) + #endif + stbIF1( o0 += input1[0] * c1s; o1 += input1[1] * c1s; o2 += input1[2] * c1s; o3 += input1[3] * c1s; ) + stbIF2( o0 += input2[0] * c2s; o1 += input2[1] * c2s; o2 += input2[2] * c2s; o3 += input2[3] * c2s; ) + stbIF3( o0 += input3[0] * c3s; o1 += input3[1] * c3s; o2 += input3[2] * c3s; o3 += input3[3] * c3s; ) + stbIF4( o0 += input4[0] * c4s; o1 += input4[1] * c4s; o2 += input4[2] * c4s; o3 += input4[3] * c4s; ) + stbIF5( o0 += input5[0] * c5s; o1 += input5[1] * c5s; o2 += input5[2] * c5s; o3 += input5[3] * c5s; ) + stbIF6( o0 += input6[0] * c6s; o1 += input6[1] * c6s; o2 += input6[2] * c6s; o3 += input6[3] * c6s; ) + stbIF7( o0 += input7[0] * c7s; o1 += input7[1] * c7s; o2 += input7[2] * c7s; o3 += input7[3] * c7s; ) + output[0] = o0; output[1] = o1; output[2] = o2; output[3] = o3; + output += 4; + stbIF0( input0 += 4; ) stbIF1( input1 += 4; ) stbIF2( input2 += 4; ) stbIF3( input3 += 4; ) stbIF4( input4 += 4; ) stbIF5( input5 += 4; ) stbIF6( input6 += 4; ) stbIF7( input7 += 4; ) + } + #endif + STBIR_NO_UNROLL_LOOP_START + while ( input0 < input0_end ) + { + float o0; + STBIR_NO_UNROLL(output); + #ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE + stbIF0( o0 = output[0] + input0[0] * c0s; ) + #else + stbIF0( o0 = input0[0] * c0s; ) + #endif + stbIF1( o0 += input1[0] * c1s; ) + stbIF2( o0 += input2[0] * c2s; ) + stbIF3( o0 += input3[0] * c3s; ) + stbIF4( o0 += input4[0] * c4s; ) + stbIF5( o0 += input5[0] * c5s; ) + stbIF6( o0 += input6[0] * c6s; ) + stbIF7( o0 += input7[0] * c7s; ) + output[0] = o0; + ++output; + stbIF0( ++input0; ) stbIF1( ++input1; ) stbIF2( ++input2; ) stbIF3( ++input3; ) stbIF4( ++input4; ) stbIF5( ++input5; ) stbIF6( ++input6; ) stbIF7( ++input7; ) + } +} + +#undef stbIF0 +#undef stbIF1 +#undef stbIF2 +#undef stbIF3 +#undef stbIF4 +#undef stbIF5 +#undef stbIF6 +#undef stbIF7 +#undef STB_IMAGE_RESIZE_DO_VERTICALS +#undef STBIR__vertical_channels +#undef STB_IMAGE_RESIZE_DO_HORIZONTALS +#undef STBIR_strs_join24 +#undef STBIR_strs_join14 +#undef STBIR_chans +#ifdef STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#undef STB_IMAGE_RESIZE_VERTICAL_CONTINUE +#endif + +#else // !STB_IMAGE_RESIZE_DO_VERTICALS + +#define STBIR_chans( start, end ) STBIR_strs_join1(start,STBIR__horizontal_channels,end) + +#ifndef stbir__2_coeff_only +#define stbir__2_coeff_only() \ + stbir__1_coeff_only(); \ + stbir__1_coeff_remnant(1); +#endif + +#ifndef stbir__2_coeff_remnant +#define stbir__2_coeff_remnant( ofs ) \ + stbir__1_coeff_remnant(ofs); \ + stbir__1_coeff_remnant((ofs)+1); +#endif + +#ifndef stbir__3_coeff_only +#define stbir__3_coeff_only() \ + stbir__2_coeff_only(); \ + stbir__1_coeff_remnant(2); +#endif + +#ifndef stbir__3_coeff_remnant +#define stbir__3_coeff_remnant( ofs ) \ + stbir__2_coeff_remnant(ofs); \ + stbir__1_coeff_remnant((ofs)+2); +#endif + +#ifndef stbir__3_coeff_setup +#define stbir__3_coeff_setup() +#endif + +#ifndef stbir__4_coeff_start +#define stbir__4_coeff_start() \ + stbir__2_coeff_only(); \ + stbir__2_coeff_remnant(2); +#endif + +#ifndef stbir__4_coeff_continue_from_4 +#define stbir__4_coeff_continue_from_4( ofs ) \ + stbir__2_coeff_remnant(ofs); \ + stbir__2_coeff_remnant((ofs)+2); +#endif + +#ifndef stbir__store_output_tiny +#define stbir__store_output_tiny stbir__store_output +#endif + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_1_coeff)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__1_coeff_only(); + stbir__store_output_tiny(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_2_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__2_coeff_only(); + stbir__store_output_tiny(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_3_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__3_coeff_only(); + stbir__store_output_tiny(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_4_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_5_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__1_coeff_remnant(4); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_6_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__2_coeff_remnant(4); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_7_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + stbir__3_coeff_setup(); + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + + stbir__4_coeff_start(); + stbir__3_coeff_remnant(4); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_8_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__4_coeff_continue_from_4(4); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_9_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__4_coeff_continue_from_4(4); + stbir__1_coeff_remnant(8); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_10_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__4_coeff_continue_from_4(4); + stbir__2_coeff_remnant(8); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_11_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + stbir__3_coeff_setup(); + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__4_coeff_continue_from_4(4); + stbir__3_coeff_remnant(8); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_12_coeffs)( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + float const * hc = horizontal_coefficients; + stbir__4_coeff_start(); + stbir__4_coeff_continue_from_4(4); + stbir__4_coeff_continue_from_4(8); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_n_coeffs_mod0 )( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + int n = ( ( horizontal_contributors->n1 - horizontal_contributors->n0 + 1 ) - 4 + 3 ) >> 2; + float const * hc = horizontal_coefficients; + + stbir__4_coeff_start(); + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + hc += 4; + decode += STBIR__horizontal_channels * 4; + stbir__4_coeff_continue_from_4( 0 ); + --n; + } while ( n > 0 ); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_n_coeffs_mod1 )( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + int n = ( ( horizontal_contributors->n1 - horizontal_contributors->n0 + 1 ) - 5 + 3 ) >> 2; + float const * hc = horizontal_coefficients; + + stbir__4_coeff_start(); + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + hc += 4; + decode += STBIR__horizontal_channels * 4; + stbir__4_coeff_continue_from_4( 0 ); + --n; + } while ( n > 0 ); + stbir__1_coeff_remnant( 4 ); + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_n_coeffs_mod2 )( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + int n = ( ( horizontal_contributors->n1 - horizontal_contributors->n0 + 1 ) - 6 + 3 ) >> 2; + float const * hc = horizontal_coefficients; + + stbir__4_coeff_start(); + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + hc += 4; + decode += STBIR__horizontal_channels * 4; + stbir__4_coeff_continue_from_4( 0 ); + --n; + } while ( n > 0 ); + stbir__2_coeff_remnant( 4 ); + + stbir__store_output(); + } while ( output < output_end ); +} + +static void STBIR_chans( stbir__horizontal_gather_,_channels_with_n_coeffs_mod3 )( float * output_buffer, unsigned int output_sub_size, float const * decode_buffer, stbir__contributors const * horizontal_contributors, float const * horizontal_coefficients, int coefficient_width ) +{ + float const * output_end = output_buffer + output_sub_size * STBIR__horizontal_channels; + float STBIR_SIMD_STREAMOUT_PTR( * ) output = output_buffer; + stbir__3_coeff_setup(); + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + float const * decode = decode_buffer + horizontal_contributors->n0 * STBIR__horizontal_channels; + int n = ( ( horizontal_contributors->n1 - horizontal_contributors->n0 + 1 ) - 7 + 3 ) >> 2; + float const * hc = horizontal_coefficients; + + stbir__4_coeff_start(); + STBIR_SIMD_NO_UNROLL_LOOP_START + do { + hc += 4; + decode += STBIR__horizontal_channels * 4; + stbir__4_coeff_continue_from_4( 0 ); + --n; + } while ( n > 0 ); + stbir__3_coeff_remnant( 4 ); + + stbir__store_output(); + } while ( output < output_end ); +} + +static stbir__horizontal_gather_channels_func * STBIR_chans(stbir__horizontal_gather_,_channels_with_n_coeffs_funcs)[4]= +{ + STBIR_chans(stbir__horizontal_gather_,_channels_with_n_coeffs_mod0), + STBIR_chans(stbir__horizontal_gather_,_channels_with_n_coeffs_mod1), + STBIR_chans(stbir__horizontal_gather_,_channels_with_n_coeffs_mod2), + STBIR_chans(stbir__horizontal_gather_,_channels_with_n_coeffs_mod3), +}; + +static stbir__horizontal_gather_channels_func * STBIR_chans(stbir__horizontal_gather_,_channels_funcs)[12]= +{ + STBIR_chans(stbir__horizontal_gather_,_channels_with_1_coeff), + STBIR_chans(stbir__horizontal_gather_,_channels_with_2_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_3_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_4_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_5_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_6_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_7_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_8_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_9_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_10_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_11_coeffs), + STBIR_chans(stbir__horizontal_gather_,_channels_with_12_coeffs), +}; + +#undef STBIR__horizontal_channels +#undef STB_IMAGE_RESIZE_DO_HORIZONTALS +#undef stbir__1_coeff_only +#undef stbir__1_coeff_remnant +#undef stbir__2_coeff_only +#undef stbir__2_coeff_remnant +#undef stbir__3_coeff_only +#undef stbir__3_coeff_remnant +#undef stbir__3_coeff_setup +#undef stbir__4_coeff_start +#undef stbir__4_coeff_continue_from_4 +#undef stbir__store_output +#undef stbir__store_output_tiny +#undef STBIR_chans + +#endif // HORIZONALS + +#undef STBIR_strs_join2 +#undef STBIR_strs_join1 + +#endif // STB_IMAGE_RESIZE_DO_HORIZONTALS/VERTICALS/CODERS + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ From d29504edcb29456132c5e966170053d767df6e9b Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 11:00:59 +0100 Subject: [PATCH 046/109] Add image rendering example --- pdlua/examples/pdlogo.gif | Bin 0 -> 5505 bytes pdlua/hello-gui.pd_lua | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 pdlua/examples/pdlogo.gif diff --git a/pdlua/examples/pdlogo.gif b/pdlua/examples/pdlogo.gif new file mode 100644 index 0000000000000000000000000000000000000000..8e8962f954049325b21bc24d5eb660d4be43cd63 GIT binary patch literal 5505 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 RZ^%0y#_rJ>7YGDs{SS;{bTR+{ literal 0 HcmV?d00001 diff --git a/pdlua/hello-gui.pd_lua b/pdlua/hello-gui.pd_lua index bc560eb..a6dd973 100644 --- a/pdlua/hello-gui.pd_lua +++ b/pdlua/hello-gui.pd_lua @@ -24,7 +24,7 @@ function hello:initialize(sel, atoms) self.mouse_down_pos = {0, 0} self.rect_down_pos = {0, 0} - self:set_size(720, 230) + self:set_size(850, 230) return true end @@ -154,6 +154,7 @@ function hello:paint(g) g:draw_text("Animation", 460, 190, 120, 12) g:draw_text(" Mouse\nInteraction", 540, 190, 120, 12) g:draw_text(" SVG\nRendering", 640, 190, 120, 12) + g:draw_text(" Image\nRendering", 740, 190, 120, 12) end function hello:paint_layer_2(g) @@ -181,6 +182,9 @@ function hello:paint_layer_4(g) g:draw_svg(svg_demo_1, 650, 40) g:draw_svg(svg_demo_2, 650, 120) + + g:scale(0.8, 0.8) + g:draw_image("examples/pdlogo.gif", 900, 75) end function hello:tick() From 3dc1fb813bda1bc10077f6c6707c4adf11208883 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 11:46:56 +0100 Subject: [PATCH 047/109] Simplify textbox call, improve documentation of properties, svg and image features --- pdlua-help.pd | 8 ++++---- pdlua/tutorial/examples/properties-help.pd | 5 ----- pdlua/tutorial/examples/properties.pd | 20 ++++++++++++++++++++ pdlua/tutorial/examples/props.pd_lua | 4 ++-- pdlua_properties.h | 5 ++--- 5 files changed, 28 insertions(+), 14 deletions(-) delete mode 100644 pdlua/tutorial/examples/properties-help.pd create mode 100644 pdlua/tutorial/examples/properties.pd diff --git a/pdlua-help.pd b/pdlua-help.pd index cfa0200..f70c297 100644 --- a/pdlua-help.pd +++ b/pdlua-help.pd @@ -1,4 +1,4 @@ -#N canvas 466 36 561 610 10; +#N canvas 466 44 561 610 10; #X declare -lib pdlua -path pdlua; #X declare -path pdlua/examples; #X text 16 358 See also:; @@ -171,7 +171,7 @@ #X connect 117 0 112 0; #X connect 118 0 110 0; #X restore 446 359 pd quickstart; -#N canvas 264 71 851 700 graphics 0; +#N canvas 264 71 851 700 graphics 1; #X obj 8 77 hello-gui; #X text 8 376 function yourclass:initialize(sel \, atoms); #X text 24 409 return true; @@ -193,8 +193,8 @@ #X text 8 323 Graphics mode is enabled automatically by defining the paint method \, see below. You can also set the size in the constructor (or in any other function) \, like this:; #X text 23 394 self:set_size(100 \, 100); #X text 814 1537  ; -#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width) \; \; g:draw_line(x1 \, y1 \, x2 \, y2\, line_width) \; g:draw_text(text \, x \, y \, w \, fontsize) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close() \; \; g:stroke_path(p \, line_width) \; g:fill_path(p) \; \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 53; -#X text 326 816 \; -- Mouse down callback \, called when the mouse is clicked \; -- Mouse up callback \, called when the mouse button is released \; -- Mouse move callback \, called when the mouse is moved while not being down \; -- Mouse drag callback \, called when the mouse is moved while also being down \; \; \; \; -- Request a repaint for specified layer (or all layers if no parameter is set or if layer is 0). after this \, the "paint" or "paint_layer_n" callback will occur \; \; -- Paint callback \, passes a graphics context object (commonly called g) for main layer or layer n (n > 1) that you can call these drawing functions on: \; \; -- Sets the size of the object \; -- Gets the size of the object \; \; -- Sets the color for the next drawing operation \; \; -- Draws a filled ellipse at the specified position and size \; -- Draws the outline of an ellipse at the specified position and size \; \; -- Draws a filled rectangle at the specified position and size \; -- Draws the outline of a rectangle at the specified position and size \; \; -- Draws a filled rounded rectangle at the specified position and size \; -- Draws the outline of a rounded rectangle at the specified position and size \; \; \; -- Draws a line between two points \; -- Draws text at the specified position and size \; \; -- Fills the entire drawing area with the current color. Also will draw an object outline in the style of the host (ie. pure-data or plugdata) \; -- Translates the coordinate system by the specified amounts \; -- Scales the coordinate system by the specified factors. This will always happen after the translation \; -- Resets current scale and translation \; \; -- Initiates a new path at the specified point \; -- Adds a line segment to the path \; -- Adds a quadratic Bezier curve to the path \; -- Adds a cubic Bezier curve to the path \; -- Closes the path \; \; -- Draws the outline of the path with the specified line width \; -- Fills the current path \; \; \; \; -- Called when DSP is activated and whenever the DSP graph is updated \; -- Called for every audio block \, passing tables of samples per inlet and expecting tables of samples per outlet \; -- Used in dsp function to achieve multichannel output for specific outlets \; \; \; \; -- Expand dollar symbols in patch canvas context \; -- Set the object arguments to be saved in the patch file \; -- Get the object arguments \;, f 82; +#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width) \; \; g:draw_line(x1 \, y1 \, x2 \, y2\\\, line_width) \; g:draw_text(text \, x \, y \, w \, fontsize) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close() \; \; g:stroke_path(p \, line_width) \; g:fill_path(p) \; \; g:draw_svg(svg_text \, x \, y) \; g:draw_image(image_path \, x \, y) \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 53; +#X text 326 816 \; -- Mouse down callback \, called when the mouse is clicked \; -- Mouse up callback \, called when the mouse button is released \; -- Mouse move callback \, called when the mouse is moved while not being down \; -- Mouse drag callback \, called when the mouse is moved while also being down \; \; \; \; -- Request a repaint for specified layer (or all layers if no parameter is set or if layer is 0). after this \, the "paint" or "paint_layer_n" callback will occur \; \; -- Paint callback \, passes a graphics context object (commonly called g) for main layer or layer n (n > 1) that you can call these drawing functions on: \; \; -- Sets the size of the object \; -- Gets the size of the object \; \; -- Sets the color for the next drawing operation \; \; -- Draws a filled ellipse at the specified position and size \; -- Draws the outline of an ellipse at the specified position and size \; \; -- Draws a filled rectangle at the specified position and size \; -- Draws the outline of a rectangle at the specified position and size \; \; -- Draws a filled rounded rectangle at the specified position and size \; -- Draws the outline of a rounded rectangle at the specified position and size \; \; \; -- Draws a line between two points \; -- Draws text at the specified position and size \; \; -- Fills the entire drawing area with the current color. Also will draw an object outline in the style of the host (ie. pure-data or plugdata) \; -- Translates the coordinate system by the specified amounts \; -- Scales the coordinate system by the specified factors. This will always happen after the translation \; -- Resets current scale and translation \; \; -- Initiates a new path at the specified point \; -- Adds a line segment to the path \; -- Adds a quadratic Bezier curve to the path \; -- Adds a cubic Bezier curve to the path \; -- Closes the path \; \; -- Draws the outline of the path with the specified line width \; -- Fills the current path \; \; -- Draws an svg vector image from a svg text \; -- Draws an image found inside search paths (supports JPEG \, PNG \, BMP \, GIF \, PSD \, HDR \, PIC) \; \; \; -- Called when DSP is activated and whenever the DSP graph is updated \; -- Called for every audio block \, passing tables of samples per inlet and expecting tables of samples per outlet \; -- Used in dsp function to achieve multichannel output for specific outlets \; \; \; \; -- Expand dollar symbols in patch canvas context \; -- Set the object arguments to be saved in the patch file \; -- Get the object arguments \;, f 92; #X restore 446 409 pd graphics; #X text 324 384 Details on how to create GUI objects ------->, f 18; #X obj 342 247 hello; diff --git a/pdlua/tutorial/examples/properties-help.pd b/pdlua/tutorial/examples/properties-help.pd deleted file mode 100644 index 2da2fa8..0000000 --- a/pdlua/tutorial/examples/properties-help.pd +++ /dev/null @@ -1,5 +0,0 @@ -#N canvas 963 23 951 1016 10; -#X declare -lib pdlua; -#X obj 5 7 declare -lib pdlua; -#X obj 254 59 tgl 18 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000 0 1; -#X obj 66 69 props; diff --git a/pdlua/tutorial/examples/properties.pd b/pdlua/tutorial/examples/properties.pd new file mode 100644 index 0000000..14de5c7 --- /dev/null +++ b/pdlua/tutorial/examples/properties.pd @@ -0,0 +1,20 @@ +#N canvas 849 44 951 1016 10; +#X declare -lib pdlua; +#X obj 784 43 declare -lib pdlua; +#X obj 33 87 props; +#X text 25 18 pdlua's properties allow you to add properties panels to both text and gui pdlua objects.; +#X text 175 159 <-- plugdata: select in editmode to view properties; +#X text 175 137 <-- pure-data/purr-data: right-click->properties to view properties, f 68; +#X text 17 324 To enable properties \, define a properties(p) function like this:, f 64; +#X text 15 417 end; +#X text 15 346 function yourclass:properties(p); +#X text 32 363 p:new_frame("First CheckBox" \, 2); +#X text 33 397 p:add_text("Text 1" \, "updatetext1" \, self.textinput1 \, 5), f 61; +#X text 32 380 p:add_check("Checkbox 1" \, "updatecheckbox1" \, self.checkbox1), f 61; +#X text 22 294 -------------- Properties --------------; +#X text 29 583 -------------- API: --------------; +#X text 21 450 The first three arguments to each property add function are \; label \; callback \; initial value, f 61; +#X text 111 461 -- the text shown besides the property \; -- the lua function that gets called on change \; -- the value shown when first opening the properties panel, f 82; +#X text 18 512 To ensure property values persist between opening/closing the properties panel \, it is recommended that you set the initial value using a variable (stored on self) \, and update that value in the change callback., f 97; +#X text 30 629 -- Functions you can call \; pd:Class:properties(p) \; \; p:new_frame(name \, column) \; \; p:add_check(label \, callback \, init) \; p:add_text(label \, callback \, init) \; p:add_color(label \, callback \, init) \; p:add_float(label \, callback \, init \, min \, max) \; p:add_int(label \, callback \, init \, min \, max) \; p:add_combo(label \, callback \, init \, options) \;, f 46; +#X text 322 665 -- Add a section with a title. This is required before adding properties. Properties get added to the last defined frame. The column argument is ignored for plugdata \; -- Add a checkbox property \; -- Add a text input property \; -- Add a color picker property \; -- Add a floating-point number property \; -- Add an integer number property \; -- Add a combo box property \, options should be a list of items in curly brackets, f 104; diff --git a/pdlua/tutorial/examples/props.pd_lua b/pdlua/tutorial/examples/props.pd_lua index c6fad14..c566b26 100644 --- a/pdlua/tutorial/examples/props.pd_lua +++ b/pdlua/tutorial/examples/props.pd_lua @@ -28,8 +28,8 @@ function properties:properties(p) -- Text inputs p:new_frame("First textinput", 2) - p:add_text("Check text 1", "updatetext1", self.textinput1, 5) - p:add_text("Check text 2", "updatetext2", self.textinput2, 5) + p:add_text("Check text 1", "updatetext1", self.textinput1) + p:add_text("Check text 2", "updatetext2", self.textinput2) -- Color picker p:new_frame("My Color Picker", 1) diff --git a/pdlua_properties.h b/pdlua_properties.h index 6d3cac3..9b3e7b6 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -467,13 +467,12 @@ static int pdlua_properties_addcheck(lua_State *L) static int pdlua_properties_addtext(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4)) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); const char *init_value = lua_tostring(L, 4); - int width = lua_tonumber(L, 5); if (pdlua == NULL){ mylua_error(__L(), pdlua, "pdlua is NULL"); return 0 ; @@ -512,7 +511,7 @@ static int pdlua_properties_addtext(lua_State *L) pdgui_vmess(0, "ssss", "label", textid, "-text", text); snprintf(entryid, MAXPDSTRING, "%s.textbox%d", text_button_frame, pdlua->properties.property_count); - pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", width); + pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", 8); pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); From 0477d1076037517518e7c6591c82c662db58e56f Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 11:56:58 +0100 Subject: [PATCH 048/109] Document draw_text options, document optional arguments --- pdlua-help.pd | 6 +++--- pdlua/tutorial/examples/properties.pd | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pdlua-help.pd b/pdlua-help.pd index f70c297..8a69dbe 100644 --- a/pdlua-help.pd +++ b/pdlua-help.pd @@ -171,7 +171,7 @@ #X connect 117 0 112 0; #X connect 118 0 110 0; #X restore 446 359 pd quickstart; -#N canvas 264 71 851 700 graphics 1; +#N canvas 264 71 1254 926 graphics 1; #X obj 8 77 hello-gui; #X text 8 376 function yourclass:initialize(sel \, atoms); #X text 24 409 return true; @@ -193,8 +193,8 @@ #X text 8 323 Graphics mode is enabled automatically by defining the paint method \, see below. You can also set the size in the constructor (or in any other function) \, like this:; #X text 23 394 self:set_size(100 \, 100); #X text 814 1537  ; -#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width) \; \; g:draw_line(x1 \, y1 \, x2 \, y2\\\, line_width) \; g:draw_text(text \, x \, y \, w \, fontsize) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close() \; \; g:stroke_path(p \, line_width) \; g:fill_path(p) \; \; g:draw_svg(svg_text \, x \, y) \; g:draw_image(image_path \, x \, y) \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 53; -#X text 326 816 \; -- Mouse down callback \, called when the mouse is clicked \; -- Mouse up callback \, called when the mouse button is released \; -- Mouse move callback \, called when the mouse is moved while not being down \; -- Mouse drag callback \, called when the mouse is moved while also being down \; \; \; \; -- Request a repaint for specified layer (or all layers if no parameter is set or if layer is 0). after this \, the "paint" or "paint_layer_n" callback will occur \; \; -- Paint callback \, passes a graphics context object (commonly called g) for main layer or layer n (n > 1) that you can call these drawing functions on: \; \; -- Sets the size of the object \; -- Gets the size of the object \; \; -- Sets the color for the next drawing operation \; \; -- Draws a filled ellipse at the specified position and size \; -- Draws the outline of an ellipse at the specified position and size \; \; -- Draws a filled rectangle at the specified position and size \; -- Draws the outline of a rectangle at the specified position and size \; \; -- Draws a filled rounded rectangle at the specified position and size \; -- Draws the outline of a rounded rectangle at the specified position and size \; \; \; -- Draws a line between two points \; -- Draws text at the specified position and size \; \; -- Fills the entire drawing area with the current color. Also will draw an object outline in the style of the host (ie. pure-data or plugdata) \; -- Translates the coordinate system by the specified amounts \; -- Scales the coordinate system by the specified factors. This will always happen after the translation \; -- Resets current scale and translation \; \; -- Initiates a new path at the specified point \; -- Adds a line segment to the path \; -- Adds a quadratic Bezier curve to the path \; -- Adds a cubic Bezier curve to the path \; -- Closes the path \; \; -- Draws the outline of the path with the specified line width \; -- Fills the current path \; \; -- Draws an svg vector image from a svg text \; -- Draws an image found inside search paths (supports JPEG \, PNG \, BMP \, GIF \, PSD \, HDR \, PIC) \; \; \; -- Called when DSP is activated and whenever the DSP graph is updated \; -- Called for every audio block \, passing tables of samples per inlet and expecting tables of samples per outlet \; -- Used in dsp function to achieve multichannel output for specific outlets \; \; \; \; -- Expand dollar symbols in patch canvas context \; -- Set the object arguments to be saved in the patch file \; -- Get the object arguments \;, f 92; +#X text 416 804 \; -- Mouse down callback \, called when the mouse is clicked \; -- Mouse up callback \, called when the mouse button is released \; -- Mouse move callback \, called when the mouse is moved while not being down \; -- Mouse drag callback \, called when the mouse is moved while also being down \; \; \; \; -- Request a repaint for specified layer (or all layers if no parameter is set or if layer is 0). after this \, the "paint" or "paint_layer_n" callback will occur \; \; -- Paint callback \, passes a graphics context object (commonly called g) for main layer or layer n (n > 1) that you can call these drawing functions on: \; \; -- Sets the size of the object \; -- Gets the size of the object \; \; -- Sets the color for the next drawing operation \; \; -- Draws a filled ellipse at the specified position and size \; -- Draws the outline of an ellipse at the specified position and size \; \; -- Draws a filled rectangle at the specified position and size \; -- Draws the outline of a rectangle at the specified position and size \; \; -- Draws a filled rounded rectangle at the specified position and size \; -- Draws the outline of a rounded rectangle at the specified position and size \; \; \; -- Draws a line between two points \; -- Draws text at the specified position and size. fontsize defaults to pd's default font size. Alignment must be one of: TOP_LEFT/TOP_CENTER/TOP_RIGHT/CENTER_LEFT/CENTER/CENTER_RIGHT/BOTTOM_LEFT/BOTTOM_CENTER/BOTTOM_RIGHT \; -- Fills the entire drawing area with the current color. Also will draw an object outline in the style of the host (ie. pure-data or plugdata) \; -- Translates the coordinate system by the specified amounts \; -- Scales the coordinate system by the specified factors. This will always happen after the translation \; -- Resets current scale and translation \; \; -- Initiates a new path at the specified point \; -- Adds a line segment to the path \; -- Adds a quadratic Bezier curve to the path \; -- Adds a cubic Bezier curve to the path \; -- Closes the path \; \; -- Draws the outline of the path with the specified line width \; -- Fills the current path \; \; -- Draws an svg vector image from a svg text \; -- Draws an image found inside search paths (supports JPEG \, PNG \, BMP \, GIF \, PSD \, HDR \, PIC) \; \; \; -- Called when DSP is activated and whenever the DSP graph is updated \; -- Called for every audio block \, passing tables of samples per inlet and expecting tables of samples per outlet \; \; -- Used in dsp function to achieve multichannel output for specific outlets \; \; \; \; -- Expand dollar symbols in patch canvas context \; -- Set the object arguments to be saved in the patch file \; -- Get the object arguments \;, f 113; +#X text 8 816 -- Callback functions you can define \; pd:Class:mouse_down(x \, y) \; pd:Class:mouse_up(x \, y) \; pd:Class:mouse_move(x \, y) \; pd:Class:mouse_drag(x \, y) \; \; \; -- Functions you can call \; pd:Class:repaint(layer) \; \; \; pd:Class:paint(g) / pd:Class:paint_layer_n(g) \; \; \; g:set_size(w \, h) \; width \, height = g:get_size(w \, h) \; \; g:set_color(r \, g \, b \, a=1.0) \; \; g:fill_ellipse(x \, y \, w \, h) \; g:stroke_ellipse(x \, y \, w \, h \, line_width=1) \; \; g:fill_rect(x \, y \, w \, h) \; g:stroke_rect(x \, y \, w \, h \, line_width=1) \; \; g:fill_rounded_rect(x \, y \, w \, h \, corner_radius) \; g:stroke_rounded_rect(x \, y \, w \, h \, corner_radius \, line_width=1) \; \; g:draw_line(x1 \, y1 \, x2 \, y2\\\, line_width=1) \; g:draw_text(text \, x \, y \, w \, fontsize=default \, alignment=TOP_LEFT) \; \; g:fill_all() \; \; g:translate(tx \, ty) \; g:scale(sx \, sy) \; g:reset_transform() \; \; p = Path(x \, y) \; p:line_to(x \, y) \; p:quad_to(x1 \, y1 \, x2 \, y2) \; p:cubic_to(x1 \, y1 \, x2 \, y2 \, x3 \, y) \; p:close() \; \; g:stroke_path(p \, line_width=1) \; g:fill_path(p) \; \; g:draw_svg(svg_text \, x \, y) \; g:draw_image(image_path \, x \, y) \; \; -- Audio callbacks \; pd:Class:dsp(samplerate \, blocksize \, channel_counts) \; pd:Class:perform(in1 \, in2 \, ... \, in_n) \; \; pd:Class:signal_setmultiout(outlet \, channel_count) \; \; \; -- Additional functions \; expandedsymbol = pd:Class:canvas_realizedollar(s) \; pd:Class:set_args(args) \; args = pd:Class:get_args() \;, f 66; #X restore 446 409 pd graphics; #X text 324 384 Details on how to create GUI objects ------->, f 18; #X obj 342 247 hello; diff --git a/pdlua/tutorial/examples/properties.pd b/pdlua/tutorial/examples/properties.pd index 14de5c7..3def339 100644 --- a/pdlua/tutorial/examples/properties.pd +++ b/pdlua/tutorial/examples/properties.pd @@ -9,7 +9,6 @@ #X text 15 417 end; #X text 15 346 function yourclass:properties(p); #X text 32 363 p:new_frame("First CheckBox" \, 2); -#X text 33 397 p:add_text("Text 1" \, "updatetext1" \, self.textinput1 \, 5), f 61; #X text 32 380 p:add_check("Checkbox 1" \, "updatecheckbox1" \, self.checkbox1), f 61; #X text 22 294 -------------- Properties --------------; #X text 29 583 -------------- API: --------------; @@ -18,3 +17,4 @@ #X text 18 512 To ensure property values persist between opening/closing the properties panel \, it is recommended that you set the initial value using a variable (stored on self) \, and update that value in the change callback., f 97; #X text 30 629 -- Functions you can call \; pd:Class:properties(p) \; \; p:new_frame(name \, column) \; \; p:add_check(label \, callback \, init) \; p:add_text(label \, callback \, init) \; p:add_color(label \, callback \, init) \; p:add_float(label \, callback \, init \, min \, max) \; p:add_int(label \, callback \, init \, min \, max) \; p:add_combo(label \, callback \, init \, options) \;, f 46; #X text 322 665 -- Add a section with a title. This is required before adding properties. Properties get added to the last defined frame. The column argument is ignored for plugdata \; -- Add a checkbox property \; -- Add a text input property \; -- Add a color picker property \; -- Add a floating-point number property \; -- Add an integer number property \; -- Add a combo box property \, options should be a list of items in curly brackets, f 104; +#X text 33 397 p:add_text("Text 1" \, "updatetext1" \, self.textinput1), f 61; From f6854c7bf71ff54eb91ef44b31d4fda71fc13afd Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 12:05:22 +0100 Subject: [PATCH 049/109] Add number property min/max defaults to documentation, leave space for purr-data implementation --- pdlua/tutorial/examples/properties.pd | 4 +-- pdlua_properties.h | 50 +++++++++++++++++++-------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/pdlua/tutorial/examples/properties.pd b/pdlua/tutorial/examples/properties.pd index 3def339..275678a 100644 --- a/pdlua/tutorial/examples/properties.pd +++ b/pdlua/tutorial/examples/properties.pd @@ -15,6 +15,6 @@ #X text 21 450 The first three arguments to each property add function are \; label \; callback \; initial value, f 61; #X text 111 461 -- the text shown besides the property \; -- the lua function that gets called on change \; -- the value shown when first opening the properties panel, f 82; #X text 18 512 To ensure property values persist between opening/closing the properties panel \, it is recommended that you set the initial value using a variable (stored on self) \, and update that value in the change callback., f 97; -#X text 30 629 -- Functions you can call \; pd:Class:properties(p) \; \; p:new_frame(name \, column) \; \; p:add_check(label \, callback \, init) \; p:add_text(label \, callback \, init) \; p:add_color(label \, callback \, init) \; p:add_float(label \, callback \, init \, min \, max) \; p:add_int(label \, callback \, init \, min \, max) \; p:add_combo(label \, callback \, init \, options) \;, f 46; -#X text 322 665 -- Add a section with a title. This is required before adding properties. Properties get added to the last defined frame. The column argument is ignored for plugdata \; -- Add a checkbox property \; -- Add a text input property \; -- Add a color picker property \; -- Add a floating-point number property \; -- Add an integer number property \; -- Add a combo box property \, options should be a list of items in curly brackets, f 104; +#X text 366 665 -- Add a section with a title. This is required before adding properties. Properties get added to the last defined frame. The column argument is ignored for plugdata \; -- Add a checkbox property \; -- Add a text input property \; -- Add a color picker property \; -- Add a floating-point number property \; -- Add an integer number property \; -- Add a combo box property \, options should be a list of items in curly brackets, f 104; #X text 33 397 p:add_text("Text 1" \, "updatetext1" \, self.textinput1), f 61; +#X text 30 629 -- Functions you can call \; pd:Class:properties(p) \; \; p:new_frame(name \, column) \; \; p:add_check(label \, callback \, init) \; p:add_text(label \, callback \, init) \; p:add_color(label \, callback \, init) \; p:add_float(label \, callback \, init \, min=-inf \, max=inf) \; p:add_int(label \, callback \, init \, min=-inf \, max=inf) \; p:add_combo(label \, callback \, init \, options) \;; diff --git a/pdlua_properties.h b/pdlua_properties.h index 9b3e7b6..a165658 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -381,6 +381,7 @@ static int pdlua_properties_newframe(lua_State *L) const char *title = lua_tostring(L, 2); int col = lua_tonumber(L, 3); +#ifndef PURR_DATA pdlua->properties.frame_count++; char current_frameid[MAXPDSTRING]; snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); @@ -412,6 +413,9 @@ static int pdlua_properties_newframe(lua_State *L) pdlua->properties.max_col = col; pdlua->properties.current_col = 0; pdlua->properties.current_row = 0; +#else + // TODO: purr-data implementation +#endif } else{ pd_error(NULL, "[pdlua] new_frame: invalid args"); @@ -427,10 +431,8 @@ static int pdlua_properties_addcheck(lua_State *L) const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); int init_value = lua_tonumber(L, 4); - if (pdlua == NULL){ - return 0 ; - } +#ifndef PURR_DATA if(!pdlua->properties.current_frame) { pd_error(NULL, "[pdlua] add_check: no active frame"); @@ -458,6 +460,9 @@ static int pdlua_properties_addcheck(lua_State *L) pdgui_vmess(0, "sssisi", "grid", checkid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); +#else + // TODO: purr-data implementation +#endif } else { pd_error(NULL, "[pdlua] add_check: invalid args"); } @@ -473,11 +478,8 @@ static int pdlua_properties_addtext(lua_State *L) const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); const char *init_value = lua_tostring(L, 4); - if (pdlua == NULL){ - mylua_error(__L(), pdlua, "pdlua is NULL"); - return 0 ; - } +#ifndef PURR_DATA if(!pdlua->properties.current_frame) { pd_error(NULL, "[pdlua] add_text: no active frame"); @@ -521,6 +523,9 @@ static int pdlua_properties_addtext(lua_State *L) pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); +#else + // TODO: purr-data implementation +#endif } else { pd_error(NULL, "[pdlua] add_text: invalid args"); } @@ -535,6 +540,7 @@ static int pdlua_properties_addcolor(lua_State *L) { const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); +#ifndef PURR_DATA if(!pdlua->properties.current_frame) { pd_error(NULL, "[pdlua] add_color: no active frame"); @@ -563,6 +569,9 @@ static int pdlua_properties_addcolor(lua_State *L) { pdgui_vmess(0, "sssisi", "grid", buttonid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); +#else + // TODO: purr-data implementation +#endif } else { pd_error(NULL, "[pdlua] add_color: invalid args"); } @@ -585,6 +594,7 @@ static int pdlua_properties_addint(lua_State *L) double min = luaL_optnumber(L, 5, -1e36); double max = luaL_optnumber(L, 6, 1e36); +#ifndef PURR_DATA if(!pdlua->properties.current_frame) { pd_error(NULL, "[pdlua] add_int: no active frame"); @@ -632,6 +642,9 @@ static int pdlua_properties_addint(lua_State *L) pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); +#else + // TODO: purr-data implementation +#endif } else { pd_error(NULL, "[pdlua] add_int: invalid args"); @@ -655,6 +668,7 @@ static int pdlua_properties_addfloat(lua_State *L) double min = luaL_optnumber(L, 5, -1e36); double max = luaL_optnumber(L, 6, 1e36); +#ifndef PURR_DATA if(!pdlua->properties.current_frame) { pd_error(NULL, "[pdlua] add_float: no active frame"); @@ -726,6 +740,9 @@ static int pdlua_properties_addfloat(lua_State *L) pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); +#else + // TODO: purr-data implementation +#endif } else { pd_error(NULL, "[pdlua] add_float: invalid args"); @@ -749,14 +766,6 @@ static int pdlua_properties_addcombo(lua_State *L) int init = lua_tonumber(L,4) - 1; int options_count = lua_rawlen(L,5); - - char pdsend[MAXPDSTRING]; - char comboid[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char combovar[MAXPDSTRING]; - - pdlua_properties_buildvar(pdlua, combovar); - const char **opts = calloc(options_count, sizeof(char*)); for (int i = 0; i < options_count; i++) { @@ -765,6 +774,14 @@ static int pdlua_properties_addcombo(lua_State *L) lua_pop(L, 1); } +#ifndef PURR_DATA + char pdsend[MAXPDSTRING]; + char comboid[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char combovar[MAXPDSTRING]; + + pdlua_properties_buildvar(pdlua, combovar); + if(!pdlua->properties.current_frame) { pd_error(NULL, "[pdlua] add_combo: no active frame"); @@ -799,6 +816,9 @@ static int pdlua_properties_addcombo(lua_State *L) pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); +#else + // TODO: purr-data implementation +#endif free(opts); } else From 30fa67bffc0676fce55e478a5d22fd46f65c46ad Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 12:44:32 +0100 Subject: [PATCH 050/109] Improve properties: colour show visual feedback, limit combo width, small fixes --- pdlua_properties.h | 139 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 112 insertions(+), 27 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index a165658..a0504b5 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -108,16 +108,15 @@ static int pdlua_properties_addcheck(lua_State *L) static int pdlua_properties_addtext(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4) && lua_isnumber(L, 5)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4)) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - t_atom atoms[4]; + t_atom atoms[3]; SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); SETSYMBOL(&atoms[2], gensym(lua_tostring(L, 4))); - SETFLOAT (&atoms[3], (t_float)lua_tonumber(L, 5)); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_text_property"), 4, atoms); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_text_property"), 3, atoms); } else { pd_error(NULL, "[pdlua] add_text: invalid args"); } @@ -126,14 +125,49 @@ static int pdlua_properties_addtext(lua_State *L) static int pdlua_properties_addcolor(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && (lua_isstring(L, 4) || lua_istable(L, 4) )) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - t_atom atoms[2]; + t_atom atoms[3]; SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_color_property"), 2, atoms); + + char initcolor[16]; + if (lua_isstring(L, 4)) { + const char *init = lua_tostring(L, 4); + snprintf(initcolor, sizeof(initcolor), "%s", init); + } + else if (lua_istable(L, 4)) { + lua_rawgeti(L, 4, 1); + lua_rawgeti(L, 4, 2); + lua_rawgeti(L, 4, 3); + + double r = luaL_checknumber(L, -3); + double g = luaL_checknumber(L, -2); + double b = luaL_checknumber(L, -1); + + lua_pop(L, 3); + + if (r <= 1.0 && g <= 1.0 && b <= 1.0) { + r *= 255.0; + g *= 255.0; + b *= 255.0; + } + + int ri = (int)(r < 0 ? 0 : (r > 255 ? 255 : r)); + int gi = (int)(g < 0 ? 0 : (g > 255 ? 255 : g)); + int bi = (int)(b < 0 ? 0 : (b > 255 ? 255 : b)); + + snprintf(initcolor, sizeof(initcolor), "#%02x%02x%02x", ri, gi, bi); + } + else { + pd_error(NULL, "[pdlua] add_color: invalid init value"); + return 0; + } + SETSYMBOL(&atoms[2], gensym(initcolor)); + + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_color_property"), 3, atoms); } else { pd_error(NULL, "[pdlua] add_color: invalid args"); } @@ -532,43 +566,93 @@ static int pdlua_properties_addtext(lua_State *L) return 0; } -// static int pdlua_dialog_createcolorpicker(t_pdlua *x, const char *text, const char *method) { static int pdlua_properties_addcolor(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3)) + if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && + (lua_isstring(L, 4) || lua_istable(L, 4))) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); + char initcolor[16]; + if (lua_isstring(L, 4)) { + const char *init = lua_tostring(L, 4); + snprintf(initcolor, sizeof(initcolor), "%s", init); + } + else if (lua_istable(L, 4)) { + lua_rawgeti(L, 4, 1); + lua_rawgeti(L, 4, 2); + lua_rawgeti(L, 4, 3); + + double r = luaL_checknumber(L, -3); + double g = luaL_checknumber(L, -2); + double b = luaL_checknumber(L, -1); + + lua_pop(L, 3); + + if (r <= 1.0 && g <= 1.0 && b <= 1.0) { + r *= 255.0; + g *= 255.0; + b *= 255.0; + } + + int ri = (int)(r < 0 ? 0 : (r > 255 ? 255 : r)); + int gi = (int)(g < 0 ? 0 : (g > 255 ? 255 : g)); + int bi = (int)(b < 0 ? 0 : (b > 255 ? 255 : b)); + + snprintf(initcolor, sizeof(initcolor), "#%02x%02x%02x", ri, gi, bi); + } + else { + pd_error(NULL, "[pdlua] add_color: invalid init value"); + return 0; + } + #ifndef PURR_DATA - if(!pdlua->properties.current_frame) - { + if (!pdlua->properties.current_frame) { pd_error(NULL, "[pdlua] add_color: no active frame"); return 0; } + char container[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char colorboxid[MAXPDSTRING]; char pdsend[MAXPDSTRING]; - char buttonid[MAXPDSTRING]; - char colorvariable[MAXPDSTRING]; - pdlua_properties_buildvar(pdlua, colorvariable); + snprintf(container, MAXPDSTRING, "%s.color%d", + pdlua->properties.current_frame->s_name, + pdlua->properties.property_count); + snprintf(textid, MAXPDSTRING, "%s.label", container); + snprintf(colorboxid, MAXPDSTRING, "%s.box", container); - // Initialize the Tcl variable to a default color - pdgui_vmess(0, "sss", "set", colorvariable, "#ffffff"); + pdgui_vmess(0, "ss", "frame", container); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); + pdgui_vmess(0, "ssssssssss", "label", colorboxid, "-text", "", "-width", "4", "-height", "2", "-background", initcolor, "-relief", "sunken", "-borderwidth", "1"); + pdgui_vmess(0, "ssss", colorboxid, "configure", "-cursor", "hand2"); + + sys_gui( + "proc pdlua_choose_color {widget receiver method} {\n" + " set current [ $widget cget -background ]\n" + "\n" + " set c [tk_chooseColor -initialcolor $current -title \"Choose color\"]\n" + "\n" + " if {$c ne \"\"} {\n" + " $widget configure -background $c\n" + "\n" + " pdsend [concat $receiver _properties colorpicker $method $c]\n" + " }\n" + "}\n"); + + snprintf(pdsend, MAXPDSTRING, "pdlua_choose_color %s %s %s", colorboxid, pdlua->properties.properties_receiver->s_name, method); + + pdgui_vmess(0, "ssss", "bind", colorboxid, "", pdsend); - // Build the pdsend command to trigger color picker and send result - snprintf(pdsend, MAXPDSTRING, - "eval pdsend [concat %s _properties colorpicker %s [tk_chooseColor -initialcolor {#ffffff} -title {Choose color}]]", - pdlua->properties.properties_receiver->s_name, method); + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssssss", "pack", colorboxid, "-side", "top", "-pady", "2"); - // Create the color picker button with the constructed command - snprintf(buttonid, MAXPDSTRING, "%s.colorpicker%d", pdlua->properties.current_frame->s_name, - pdlua->properties.property_count); - pdgui_vmess(0, "ssssss", "button", buttonid, "-text", text, "-command", pdsend); + pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w"); - pdgui_vmess(0, "sssisi", "grid", buttonid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, - "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); + #else // TODO: purr-data implementation #endif @@ -751,6 +835,7 @@ static int pdlua_properties_addfloat(lua_State *L) return 0; } + static int pdlua_properties_addcombo(lua_State *L) { if (lua_isuserdata(L,1) && @@ -806,7 +891,7 @@ static int pdlua_properties_addcombo(lua_State *L) snprintf(comboid, MAXPDSTRING,"%s.widget",container); - pdgui_vmess(0,"sssssSss", "ttk::combobox", comboid, "-textvariable",combovar, "-values", options_count, opts, "-state", "readonly"); + pdgui_vmess(0,"sssssSsssi", "ttk::combobox", comboid, "-textvariable",combovar, "-values", options_count, opts, "-state", "readonly", "-width", 8); pdgui_vmess(0,"ssss", "bind", comboid, "<>", pdsend); From 616107d94b733fd71f74f872e198e4c5afcbcd6b Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 12:55:16 +0100 Subject: [PATCH 051/109] Fix deprecation warnings --- pdlua_properties.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index a0504b5..49f8a6b 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -629,7 +629,7 @@ static int pdlua_properties_addcolor(lua_State *L) { pdgui_vmess(0, "ssssssssss", "label", colorboxid, "-text", "", "-width", "4", "-height", "2", "-background", initcolor, "-relief", "sunken", "-borderwidth", "1"); pdgui_vmess(0, "ssss", colorboxid, "configure", "-cursor", "hand2"); - sys_gui( + pdgui_vmess(0, "r", "proc pdlua_choose_color {widget receiver method} {\n" " set current [ $widget cget -background ]\n" "\n" @@ -802,7 +802,7 @@ static int pdlua_properties_addfloat(lua_State *L) min, numvariable, min, max, numvariable, max, pdlua->properties.properties_receiver->s_name, method, numvariable); - sys_gui(returncmd); + pdgui_vmess(0, "r", returncmd); char focusoutcmd[MAXPDSTRING * 4]; snprintf(focusoutcmd, sizeof(focusoutcmd), @@ -816,7 +816,7 @@ static int pdlua_properties_addfloat(lua_State *L) min, numvariable, min, max, numvariable, max, pdlua->properties.properties_receiver->s_name, method, numvariable); - sys_gui(focusoutcmd); + pdgui_vmess(0, "r", focusoutcmd); pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); From e784b52cd1ccd2cf16b7519c2025597d1d61505c Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 13:00:40 +0100 Subject: [PATCH 052/109] Colour property fixes --- pdlua_properties.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index 49f8a6b..14608b7 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -626,7 +626,7 @@ static int pdlua_properties_addcolor(lua_State *L) { pdgui_vmess(0, "ss", "frame", container); pdgui_vmess(0, "ssss", "label", textid, "-text", text); - pdgui_vmess(0, "ssssssssss", "label", colorboxid, "-text", "", "-width", "4", "-height", "2", "-background", initcolor, "-relief", "sunken", "-borderwidth", "1"); + pdgui_vmess(0, "sssssisisssssi", "label", colorboxid, "-text", "", "-width", 4, "-height", 2, "-background", initcolor, "-relief", "sunken", "-borderwidth", 1); pdgui_vmess(0, "ssss", colorboxid, "configure", "-cursor", "hand2"); pdgui_vmess(0, "r", @@ -647,7 +647,7 @@ static int pdlua_properties_addcolor(lua_State *L) { pdgui_vmess(0, "ssss", "bind", colorboxid, "", pdsend); pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssssss", "pack", colorboxid, "-side", "top", "-pady", "2"); + pdgui_vmess(0, "sssssi", "pack", colorboxid, "-side", "top", "-pady", 2); pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w"); From 87bb82d39409b40b99d690bc8bc40724f9014f16 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 13:04:25 +0100 Subject: [PATCH 053/109] Fix int/float properties for plugdata --- pdlua_properties.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index 14608b7..80ca19d 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -190,7 +190,7 @@ static int pdlua_properties_addint(lua_State *L) SETFLOAT(&atoms[3], luaL_optnumber(L, 5, -1e36)); SETFLOAT(&atoms[4], luaL_optnumber(L, 6, 1e36)); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 5, atoms); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_int_property"), 5, atoms); } else { @@ -216,7 +216,7 @@ static int pdlua_properties_addfloat(lua_State *L) SETFLOAT(&atoms[3], luaL_optnumber(L, 5, -1e36)); SETFLOAT(&atoms[4], luaL_optnumber(L, 6, 1e36)); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_number_property"), 5, atoms); + pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_float_property"), 5, atoms); } else { From b14de04ebb05b49fddb16ed37ad48805a7900eda Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 15:04:30 +0100 Subject: [PATCH 054/109] Clean up: remove unncessary indirection, better way to get title, start purr-data properties implementation --- pdlua.h | 9 +++ pdlua_properties.h | 163 ++++++++++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 68 deletions(-) diff --git a/pdlua.h b/pdlua.h index e9aec77..52b3959 100644 --- a/pdlua.h +++ b/pdlua.h @@ -29,12 +29,21 @@ typedef struct _gfx_transform typedef struct _pdlua_properties { #ifndef PLUGDATA +#ifndef PURR_DATA t_symbol *current_frame; t_symbol *properties_receiver; int frame_count; int property_count; int max_col, max_row; int current_col, current_row; +#else + int property_count; + int max_properties; + char **names; + char **types; + char **values; + char **callbacks; +#endif #else void(*plugdata_properties_callback)(void*, t_symbol*, int, t_atom*); // Callback to add properties in plugdata #endif diff --git a/pdlua_properties.h b/pdlua_properties.h index 80ca19d..2ea087b 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -267,24 +267,25 @@ static int pdlua_properties_addcombo(lua_State *L) #else -static void pdlua_properties_createdialog(t_pdlua_properties *p, const char* name) -{ - pdgui_vmess(0, "ssss", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); - - char title[MAXPDSTRING]; - snprintf(title, MAXPDSTRING, "%s", name); - char *suffix = strstr(title, ":gfx"); - if (suffix) *suffix = '\0'; - strncat(title, " Properties", MAXPDSTRING - strlen(title) - 1); - pdgui_vmess(0, "ssss", "wm", "title", p->properties_receiver->s_name, title); - - pdgui_vmess(0, "sss", "wm", "group", p->properties_receiver->s_name, "."); - pdgui_vmess(0, "sssii", "wm", "resizable", p->properties_receiver->s_name, 0, 0); +#ifdef PURR_DATA +void pdlua_add_property(t_pdlua_properties *p, const char *name, const char *type, const char *value, const char* callback) { + if(p->property_count >= p->max_properties) { + // Reallocate arrays + int new_size = p->max_properties + 8; + p->names = realloc(p->names, sizeof(char*) * new_size); + p->types = realloc(p->types, sizeof(char*) * new_size); + p->values = realloc(p->values, sizeof(char*) * new_size); + p->callbacks = realloc(p->callbacks, sizeof(char*) * new_size); + p->max_properties = new_size; + } - pdgui_vmess(0, "sss", "wm", "transient", p->properties_receiver->s_name, "$::focused_window"); - pdgui_vmess(0, "ssss", p->properties_receiver->s_name, "configure", "-menu", "$::dialog_menubar"); - pdgui_vmess(0, "sssfsf", p->properties_receiver->s_name, "configure", "-padx", 0.0f, "-pady", 0.0f); + p->names[p->property_count] = strdup(name); + p->types[p->property_count] = strdup(type); + p->values[p->property_count] = strdup(value); + p->callbacks[p->property_count] = strdup(callback); + p->property_count++; } +#endif static void pdlua_properties_updaterow(t_pdlua_properties *p) { @@ -295,48 +296,11 @@ static void pdlua_properties_updaterow(t_pdlua_properties *p) } } -static void pdlua_properties_setupbuttons(t_pdlua_properties *p) { - char buttonsId[MAXPDSTRING]; - snprintf(buttonsId, MAXPDSTRING, ".%p.buttons", (void *)p); - - char buttonCancelId[MAXPDSTRING]; - char buttonApplyId[MAXPDSTRING]; - char buttonOkId[MAXPDSTRING]; - snprintf(buttonCancelId, MAXPDSTRING, ".%p.buttons.cancel", (void *)p); - snprintf(buttonApplyId, MAXPDSTRING, ".%p.buttons.apply", (void *)p); - snprintf(buttonOkId, MAXPDSTRING, ".%p.buttons.ok", (void *)p); - - char destroyCommand[MAXPDSTRING]; - snprintf(destroyCommand, MAXPDSTRING, "destroy .%p", (void *)p); - - // Criando o frame dos botões - pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); - pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); - - // Cancel (Close window) - pdgui_vmess(0, "ssssss", "button", buttonCancelId, "-text", "Cancel", "-command", - destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); - - // Apply (send all data to pd and lua obj) for this must be necessary to save all the variables used in the object in a char [128][MAXPDSTRING], - // I don't think that this is good, or there is better solution? - // TODO: Need to dev the apply command - pdgui_vmess(0, "ssss", "button", buttonApplyId, "-text", "Apply"); - // pdgui_vmess(0, "ssssss", "button", buttonApplyId, "-text", "Apply", "-command", command); - pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); - - // Ok - pdgui_vmess(0, "ssssss", "button", buttonOkId, "-text", "OK", "-command", destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); -} - -static void pdlua_properties(t_gobj *z, t_glist *) { +static void pdlua_properties(t_gobj *z, t_glist *owner) { t_pdlua *pdlua = (t_pdlua *)z; t_pdlua_properties *p = &pdlua->properties; +#ifndef PURR_DATA lua_State *L = __L(); char receiver[MAXPDSTRING]; @@ -356,7 +320,18 @@ static void pdlua_properties(t_gobj *z, t_glist *) { pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); - pdlua_properties_createdialog(p, pdlua->pd.te_g.g_pd->c_name->s_name); // <-- create hidden window + pdgui_vmess(0, "ssss", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); + + char title[MAXPDSTRING]; + snprintf(title, MAXPDSTRING, "%s Properties", pdlua->pdlua_class->c_name->s_name); + pdgui_vmess(0, "ssss", "wm", "title", p->properties_receiver->s_name, title); + + pdgui_vmess(0, "sss", "wm", "group", p->properties_receiver->s_name, "."); + pdgui_vmess(0, "sssii", "wm", "resizable", p->properties_receiver->s_name, 0, 0); + + pdgui_vmess(0, "sss", "wm", "transient", p->properties_receiver->s_name, "$::focused_window"); + pdgui_vmess(0, "ssss", p->properties_receiver->s_name, "configure", "-menu", "$::dialog_menubar"); + pdgui_vmess(0, "sssfsf", p->properties_receiver->s_name, "configure", "-padx", 0.0f, "-pady", 0.0f); // main window char frameId[MAXPDSTRING]; @@ -384,14 +359,61 @@ static void pdlua_properties(t_gobj *z, t_glist *) { } // Get the return value (Lua pushes it onto the stack) - int result = lua_toboolean(__L(), -1); // Converts Lua boolean to C int (1 = true, 0 = false) - lua_pop(__L(), 1); // Remove the result from the stack + int result = lua_toboolean(L, -1); // Converts Lua boolean to C int (1 = true, 0 = false) + lua_pop(L, 1); // Remove the result from the stack if (!result) { pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); return; } - pdlua_properties_setupbuttons(p); // <- this is independed of all previous containers + + char buttonsId[MAXPDSTRING]; + snprintf(buttonsId, MAXPDSTRING, ".%p.buttons", (void *)p); + + char buttonCancelId[MAXPDSTRING]; + char buttonApplyId[MAXPDSTRING]; + char buttonOkId[MAXPDSTRING]; + snprintf(buttonCancelId, MAXPDSTRING, ".%p.buttons.cancel", (void *)p); + snprintf(buttonApplyId, MAXPDSTRING, ".%p.buttons.apply", (void *)p); + snprintf(buttonOkId, MAXPDSTRING, ".%p.buttons.ok", (void *)p); + + char destroyCommand[MAXPDSTRING]; + snprintf(destroyCommand, MAXPDSTRING, "destroy .%p", (void *)p); + + // Criando o frame dos botões + pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); + pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); + + // Cancel (Close window) + pdgui_vmess(0, "ssssss", "button", buttonCancelId, "-text", "Cancel", "-command", + destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); + + // Apply (send all data to pd and lua obj) for this must be necessary to save all the variables used in the object in a char [128][MAXPDSTRING], + // I don't think that this is good, or there is better solution? + // TODO: Need to dev the apply command + pdgui_vmess(0, "ssss", "button", buttonApplyId, "-text", "Apply"); + // pdgui_vmess(0, "ssssss", "button", buttonApplyId, "-text", "Apply", "-command", command); + pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); + + // Ok + pdgui_vmess(0, "ssssss", "button", buttonOkId, "-text", "OK", "-command", destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, + "-ipadx", 10); +#else + + t_symbol *gfx_tag = gfxstub_new2(&pdlua->pd.te_g.g_pd, x); + gui_start_vmess("gui_external_dialog", "ss", gfx_tag, pdlua->pd.te_g.g_pd->c_name->s_name); + + gui_start_array(); + for(int i = 0; i < p->property_count; i++) { + gui_s(p->names[i]); // name + gui_s(p->values[i]); // value + } + gui_end_array(); +#endif } static void pdlua_properties_buildvar(t_pdlua *pdlua, char *out) @@ -495,7 +517,7 @@ static int pdlua_properties_addcheck(lua_State *L) "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); #else - // TODO: purr-data implementation + pdlua_add_property(text, "toggle", init_value ? "1" : "0", method); #endif } else { pd_error(NULL, "[pdlua] add_check: invalid args"); @@ -522,7 +544,6 @@ static int pdlua_properties_addtext(lua_State *L) char pdsend[MAXPDSTRING]; char textid[MAXPDSTRING]; - char buttonid[MAXPDSTRING]; char entryid[MAXPDSTRING]; char textvariable[MAXPDSTRING]; @@ -558,7 +579,7 @@ static int pdlua_properties_addtext(lua_State *L) pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); #else - // TODO: purr-data implementation + pdlua_add_property(text, "symbol", init_value, method); #endif } else { pd_error(NULL, "[pdlua] add_text: invalid args"); @@ -654,7 +675,7 @@ static int pdlua_properties_addcolor(lua_State *L) { pdlua_properties_updaterow(&pdlua->properties); #else - // TODO: purr-data implementation + pdlua_add_property(text, "symbol", initcolor, method); #endif } else { pd_error(NULL, "[pdlua] add_color: invalid args"); @@ -674,7 +695,7 @@ static int pdlua_properties_addint(lua_State *L) const char *text = lua_tostring(L, 2); const char *method = lua_tostring(L, 3); - double init = lua_tonumber(L, 4); + int init = (int)lua_tonumber(L, 4); double min = luaL_optnumber(L, 5, -1e36); double max = luaL_optnumber(L, 6, 1e36); @@ -693,7 +714,7 @@ static int pdlua_properties_addint(lua_State *L) pdlua_properties_buildvar(pdlua, numvariable); - pdgui_vmess(0, "ssf", "set", numvariable, init); + pdgui_vmess(0, "ssi", "set", numvariable, init); snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, numvariable); @@ -727,7 +748,9 @@ static int pdlua_properties_addint(lua_State *L) pdlua_properties_updaterow(&pdlua->properties); #else - // TODO: purr-data implementation + char init_value[MAXPDSTRING]; + snprintf(init_value, MAXPDSTRING, "%d", init); + pdlua_add_property(text, "number", init_value, method); #endif } else { @@ -825,7 +848,9 @@ static int pdlua_properties_addfloat(lua_State *L) pdlua_properties_updaterow(&pdlua->properties); #else - // TODO: purr-data implementation + char init_value[MAXPDSTRING]; + snprintf(init_value, MAXPDSTRING, "%f", init); + pdlua_add_property(text, "number", init_value, method); #endif } else { @@ -902,7 +927,9 @@ static int pdlua_properties_addcombo(lua_State *L) pdlua_properties_updaterow(&pdlua->properties); #else - // TODO: purr-data implementation + char init_value[MAXPDSTRING]; + snprintf(init_value, MAXPDSTRING, "%d", init); + pdlua_add_property(text, "number", init_value, method); #endif free(opts); } From 65d4e15559543c1cb4dafc80d31f2e55b0067f48 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 17:34:00 +0100 Subject: [PATCH 055/109] Simplify plugdata argument forwarding, simplify lua type checking, fix all compiler warnings --- pdlua.c | 143 ++++--- pdlua_gfx.h | 165 ++------ pdlua_properties.h | 993 ++++++++++++++++++++------------------------- svg/nanosvg.h | 8 +- 4 files changed, 575 insertions(+), 734 deletions(-) diff --git a/pdlua.c b/pdlua.c index a210935..f874e62 100644 --- a/pdlua.c +++ b/pdlua.c @@ -58,6 +58,77 @@ #include "g_canvas.h" /* BAD: support for Pd < 0.41 */ + +#if PD_MAJOR_VERSION == 0 +# if PD_MINOR_VERSION >= 41 +# define PDLUA_PD41 +/* use new garray support that is 64-bit safe */ +# define PDLUA_ARRAYGRAB garray_getfloatwords +# define PDLUA_ARRAYTYPE t_word +# define PDLUA_ARRAYELEM(arr,idx) ((arr)[(idx)].w_float) +# elif PD_MINOR_VERSION >= 40 +# define PDLUA_PD40 +/* use old garray support, not 64-bit safe */ +# define PDLUA_ARRAYGRAB garray_getfloatarray +# define PDLUA_ARRAYTYPE t_float +# define PDLUA_ARRAYELEM(arr,idx) ((arr)[(idx)]) +# elif PD_MINOR_VERSION >= 39 +# define PDLUA_PD39 +/* use old garray support, not 64-bit safe */ +# define PDLUA_ARRAYGRAB garray_getfloatarray +# define PDLUA_ARRAYTYPE t_float +# define PDLUA_ARRAYELEM(arr,idx) ((arr)[(idx)]) +# else +# error "Pd version is too old, please upgrade" +# endif +#else +# error "Pd version is too new, please file a bug report" +#endif + +#if PD_MINOR_VERSION >= 54 +# ifndef PD_MULTICHANNEL +# define PD_MULTICHANNEL 1 +# endif +#else +# pragma message("building without multi-channel support; requires Pd 0.54+") +# undef PD_MULTICHANNEL +# define PD_MULTICHANNEL 0 +# define CLASS_MULTICHANNEL 0 +#endif + +#ifdef UNUSED +#elif defined(__GNUC__) +# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) +#elif defined(__LCLINT__) +# define UNUSED(x) /*@unused@*/ x +#else +# define UNUSED(x) x +#endif + +#if defined(__GNUC__) /* covers both GCC and Clang */ +#define PD_NEWMETHOD_CAST(f) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wcast-function-type\"") \ + (t_newmethod)(f) \ + _Pragma("GCC diagnostic pop") +#else +#define PD_NEWMETHOD_CAST(f) (t_newmethod)(f) +#endif + +/* BAD: end of bad section */ + +/* If defined, PDLUA_DEBUG lets pdlua post a lot of text */ +//#define PDLUA_DEBUG post +#ifndef PDLUA_DEBUG +//static void PDLUA_DEBUG(const char *fmt, ...) {;} +# define PDLUA_DEBUG(x,y) +# define PDLUA_DEBUG2(x,y0,y1) +# define PDLUA_DEBUG3(x,y0,y1,y2) +#else +# define PDLUA_DEBUG2 PDLUA_DEBUG +# define PDLUA_DEBUG3 PDLUA_DEBUG +#endif + #include "pdlua_gfx.h" #include "pdlua_properties.h" @@ -140,7 +211,7 @@ void initialise_lua_state() #endif // class_new class names need to use gensym of the global pure-data instance -t_symbol* global_gensym(char* s) +t_symbol* global_gensym(const char* s) { #ifdef PDINSTANCE t_pdinstance* last_instance = pd_get_instance(); @@ -153,66 +224,6 @@ t_symbol* global_gensym(char* s) return sym; } -#if PD_MAJOR_VERSION == 0 -# if PD_MINOR_VERSION >= 41 -# define PDLUA_PD41 -/* use new garray support that is 64-bit safe */ -# define PDLUA_ARRAYGRAB garray_getfloatwords -# define PDLUA_ARRAYTYPE t_word -# define PDLUA_ARRAYELEM(arr,idx) ((arr)[(idx)].w_float) -# elif PD_MINOR_VERSION >= 40 -# define PDLUA_PD40 -/* use old garray support, not 64-bit safe */ -# define PDLUA_ARRAYGRAB garray_getfloatarray -# define PDLUA_ARRAYTYPE t_float -# define PDLUA_ARRAYELEM(arr,idx) ((arr)[(idx)]) -# elif PD_MINOR_VERSION >= 39 -# define PDLUA_PD39 -/* use old garray support, not 64-bit safe */ -# define PDLUA_ARRAYGRAB garray_getfloatarray -# define PDLUA_ARRAYTYPE t_float -# define PDLUA_ARRAYELEM(arr,idx) ((arr)[(idx)]) -# else -# error "Pd version is too old, please upgrade" -# endif -#else -# error "Pd version is too new, please file a bug report" -#endif - -#if PD_MINOR_VERSION >= 54 -# ifndef PD_MULTICHANNEL -# define PD_MULTICHANNEL 1 -# endif -#else -# pragma message("building without multi-channel support; requires Pd 0.54+") -# undef PD_MULTICHANNEL -# define PD_MULTICHANNEL 0 -# define CLASS_MULTICHANNEL 0 -#endif - -#ifdef UNUSED -#elif defined(__GNUC__) -# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) -#elif defined(__LCLINT__) -# define UNUSED(x) /*@unused@*/ x -#else -# define UNUSED(x) x -#endif - -/* BAD: end of bad section */ - -/* If defined, PDLUA_DEBUG lets pdlua post a lot of text */ -//#define PDLUA_DEBUG post -#ifndef PDLUA_DEBUG -//static void PDLUA_DEBUG(const char *fmt, ...) {;} -# define PDLUA_DEBUG(x,y) -# define PDLUA_DEBUG2(x,y0,y1) -# define PDLUA_DEBUG3(x,y0,y1,y2) -#else -# define PDLUA_DEBUG2 PDLUA_DEBUG -# define PDLUA_DEBUG3 PDLUA_DEBUG -#endif - // In plugdata we're linked statically and thus c_externdir is empty. // So we pass a data directory to the setup function instead and store it here. // ag: Renamed to pdlua_datadir since we also need this in vanilla when @@ -363,7 +374,7 @@ static int pdlua_dofile (lua_State *L); /** Initialize the pd API for Lua. */ static void pdlua_init (lua_State *L); /** Pd loader hook for loading and executing Lua scripts. */ -static int pdlua_loader_legacy (t_canvas *canvas, char *name); +static int pdlua_loader_legacy (t_canvas *canvas, char *name, char *path); /** Start the Lua runtime and register our loader hook. */ #ifdef _WIN32 __declspec(dllexport) @@ -1510,14 +1521,14 @@ static int pdlua_class_new(lua_State *L) snprintf(name_gfx, MAXPDSTRING-1, "%s:gfx", name); PDLUA_DEBUG3("pdlua_class_new: L is %p, name is %s stack top is %d", L, name, lua_gettop(L)); - c = class_new(global_gensym((char *) name), (t_newmethod) pdlua_new, + c = class_new(global_gensym((char *) name), PD_NEWMETHOD_CAST(pdlua_new), (t_method) pdlua_free, sizeof(t_pdlua), CLASS_NOINLET | CLASS_MULTICHANNEL, A_GIMME, 0); if (strcmp(name, "pdlua") && strcmp(name, "pdluax")) { // Shadow class for graphics objects. This is an exact clone of the // regular (non-gui) class, except that it has a different // widgetbehavior. We only need this for the regular Lua objects, the // pdlua and pdluax built-ins don't have this. - c_gfx = class_new(global_gensym((char *) name_gfx), (t_newmethod) pdlua_new, + c_gfx = class_new(global_gensym((char *) name_gfx), PD_NEWMETHOD_CAST(pdlua_new), (t_method) pdlua_free, sizeof(t_pdlua), CLASS_NOINLET | CLASS_MULTICHANNEL, A_GIMME, 0); class_sethelpsymbol(c_gfx, gensym((char *) name)); } @@ -2817,6 +2828,7 @@ static int pdlua_setpropertiesfn(lua_State *L) class_setpropertiesfn(x->pdlua_class_gfx, pdlua_properties); class_addmethod(x->pdlua_class_gfx, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); } + return 0; } static int pdlua_signal_setmultiout(lua_State *L) @@ -3072,7 +3084,8 @@ static int pdlua_loader_wrappath static int pdlua_loader_legacy ( t_canvas *canvas, /**< Pd canvas to use to find the script. */ - char *name /**< The name of the script (without .pd_lua extension). */ + char *name, /**< The name of the script (without .pd_lua extension). */ + char *UNUSED(path) /**< Path variable for new loader, unused here */ ) { char dirbuf[MAXPDSTRING]; diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 5a32d22..e6e8c21 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -292,10 +292,35 @@ static inline void plugdata_draw(t_pdlua *obj, int layer, t_symbol* sym, int arg } } -static inline void plugdata_draw_path(t_symbol* sym, int argc, t_atom* argv) +static inline void plugdata_draw_args(lua_State* L, const char* sym, const char *fmt, ...) { - if(plugdata_draw_callback) { - plugdata_draw_callback(NULL, -1, sym, argc, argv); + if (!lua_islightuserdata(L, 1)) + return; + + t_pdlua_gfx *gfx = pop_graphics_context(L); + t_atom atoms[16]; + int argc = strlen(fmt); + + va_list defaults; + va_start(defaults, fmt); + + for (int i = 0; i < argc; i++) + { + int lua_idx = i + 1; + switch (fmt[i]) + { + case 'f': SETFLOAT (&atoms[i], (t_float)luaL_checknumber(L, lua_idx)); break; + case 's': SETSYMBOL(&atoms[i], gensym(luaL_checkstring(L, lua_idx))); break; + case 'F': SETFLOAT (&atoms[i], (t_float)luaL_optnumber(L, lua_idx, va_arg(defaults, double))); break; + case 'S': SETSYMBOL(&atoms[i], gensym(luaL_optstring(L, lua_idx, va_arg(defaults, const char*)))); break; + default: break; + } + } + + va_end(defaults); + + if (plugdata_draw_callback) { + plugdata_draw_callback(gfx->object, gfx->current_layer, gensym(sym), argc, atoms); } } @@ -351,155 +376,67 @@ static int end_paint(lua_State* L) { } static int set_color(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_pdlua *obj = gfx->object; - if (lua_gettop(L) == 1) { // Single argument: parse as color ID instead of RGB - t_atom arg; - SETFLOAT(&arg, luaL_checknumber(L, 1)); // color ID - plugdata_draw(obj, gfx->current_layer, gensym("lua_set_color"), 1, &arg); + if (lua_gettop(L) == 2) { // Single argument: parse as color ID instead of RGB + plugdata_draw_args(L, "lua_set_color", "f"); return 0; } - t_atom args[4]; - SETFLOAT(args, luaL_checknumber(L, 1)); // r - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // g - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // b - SETFLOAT(args + 3, luaL_optnumber(L, 4, 1.0f)); // alpha (optional, default to 1.0) - plugdata_draw(obj, gfx->current_layer, gensym("lua_set_color"), 4, args); + plugdata_draw_args(L, "lua_set_color", "fffF", 1.0); return 0; } static int fill_ellipse(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_atom args[4]; - SETFLOAT(args, luaL_checknumber(L, 1)); // x - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_fill_ellipse"), 4, args); + plugdata_draw_args(L, "lua_fill_ellipse", "ffff"); return 0; } static int stroke_ellipse(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_atom args[5]; - SETFLOAT(args, luaL_checknumber(L, 1)); // x - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_optnumber(L, 5, 1.0f)); // stroke width (optional, default to 1.0) - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_stroke_ellipse"), 5, args); + plugdata_draw_args(L, "lua_stroke_ellipse", "ffffF", 1.0); return 0; } static int fill_all(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_pdlua *obj = gfx->object; - plugdata_draw(obj, gfx->current_layer, gensym("lua_fill_all"), 0, NULL); + plugdata_draw_args(L, "lua_fill_all", ""); return 0; } static int fill_rect(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_atom args[4]; - SETFLOAT(args, luaL_checknumber(L, 1)); // x - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_fill_rect"), 4, args); + plugdata_draw_args(L, "lua_fill_rect", "ffff"); return 0; } static int stroke_rect(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_atom args[5]; - SETFLOAT(args, luaL_checknumber(L, 1)); // x - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_optnumber(L, 5, 1.0f)); // stroke width (optional, default to 1.0) - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_stroke_rect"), 5, args); + plugdata_draw_args(L, "lua_stroke_rect", "ffffF", 1.0f); return 0; } static int fill_rounded_rect(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_atom args[5]; - SETFLOAT(args, luaL_checknumber(L, 1)); // x - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_checknumber(L, 5)); // corner radius - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_fill_rounded_rect"), 5, args); + plugdata_draw_args(L, "lua_fill_rounded_rect", "fffff"); return 0; } static int stroke_rounded_rect(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_atom args[6]; - SETFLOAT(args, luaL_checknumber(L, 1)); // x - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_checknumber(L, 5)); // corner_radius - SETFLOAT(args + 5, luaL_optnumber(L, 6, 1.0f)); // stroke width (optional, default to 1.0) - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_stroke_rounded_rect"), 6, args); + plugdata_draw_args(L, "lua_stroke_rounded_rect", "fffffF", 1.0f); return 0; } static int draw_line(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_atom args[5]; - SETFLOAT(args, luaL_checknumber(L, 1)); // x - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // y - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // w - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // h - SETFLOAT(args + 4, luaL_optnumber(L, 5, 1.0f)); // line width (optional, default to 1.0) - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_line"), 5, args); + plugdata_draw_args(L, "lua_draw_line", "ffffF", 1.0f); return 0; } static int draw_text(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - const char* text = luaL_checkstring(L, 1); - t_atom args[6]; - SETSYMBOL(args, gensym(text)); - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // x - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y - SETFLOAT(args + 3, luaL_checknumber(L, 4)); // w - SETFLOAT(args + 4, luaL_optnumber(L, 5, 12.0f)); // font size - SETFLOAT(args + 5, luaL_optinteger(L, 6, 0)); // alignment - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_text"), 6, args); + plugdata_draw_args(L, "lua_draw_text", "sffffFF", 12.f, 0.0f); return 0; } static int draw_svg(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_pdlua *obj = gfx->object; - - t_canvas *cnv = glist_getcanvas(obj->canvas); - - t_atom args[3]; - SETSYMBOL(args, gensym(luaL_checkstring(L, 1))); - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // x - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y - - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_svg"), 3, args); + plugdata_draw_args(L, "lua_draw_svg", "sff"); return 0; } static int draw_image(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_pdlua *obj = gfx->object; - - t_canvas *cnv = glist_getcanvas(obj->canvas); - - t_atom args[3]; - SETSYMBOL(args, gensym(luaL_checkstring(L, 1))); - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // x - SETFLOAT(args + 2, luaL_checknumber(L, 3)); // y - - plugdata_draw(gfx->object, gfx->current_layer, gensym("lua_draw_image"), 3, args); + plugdata_draw_args(L, "lua_draw_image", "sff"); return 0; } @@ -552,29 +489,17 @@ static int fill_path(lua_State* L) { } static int translate(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_pdlua *obj = gfx->object; - t_atom args[2]; - SETFLOAT(args, luaL_checknumber(L, 1)); // tx - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // ty - plugdata_draw(obj, gfx->current_layer, gensym("lua_translate"), 2, args); + plugdata_draw_args(L, "lua_translate", "ff"); return 0; } static int scale(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_pdlua *obj = gfx->object; - t_atom args[2]; - SETFLOAT(args, luaL_checknumber(L, 1)); // sx - SETFLOAT(args + 1, luaL_checknumber(L, 2)); // sy - plugdata_draw(obj, gfx->current_layer, gensym("lua_scale"), 2, args); + plugdata_draw_args(L, "lua_scale", "ff"); return 0; } static int reset_transform(lua_State* L) { - t_pdlua_gfx *gfx = pop_graphics_context(L); - t_pdlua *obj = gfx->object; - plugdata_draw(obj, gfx->current_layer, gensym("lua_reset_transform"), 0, NULL); + plugdata_draw_args(L, "lua_reset_transform", ""); return 0; } diff --git a/pdlua_properties.h b/pdlua_properties.h index 2ea087b..17826d9 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -29,7 +29,7 @@ static int pdlua_properties_addint(lua_State *L); static int pdlua_properties_addfloat(lua_State *L); static int pdlua_properties_addcombo(lua_State *L); -static int pdlua_properties_setup(lua_State* L) +static void pdlua_properties_setup(lua_State* L) { static const luaL_Reg properties_methods[] = { {"new_frame", pdlua_properties_newframe}, @@ -50,8 +50,111 @@ static int pdlua_properties_setup(lua_State* L) #ifdef PLUGDATA +static inline void plugdata_add_property(lua_State* L, const char* sym, const char *fmt, ...) +{ + if (!lua_isuserdata(L, 1)) + return; + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + + int fmtlen = strlen(fmt); + int argc = 0; + for (int i = 0; i < fmtlen; i++) + argc += (fmt[i] == 't' && lua_istable(L, i + 2)) ? lua_rawlen(L, i + 2) : 1; + + t_atom *atoms = alloca(sizeof(t_atom) * argc); + int atom_idx = 0; + + va_list defaults; + va_start(defaults, fmt); + + for (int i = 0; i < fmtlen; i++) + { + int lua_idx = i + 2; + switch (fmt[i]) + { + case 'f': { + SETFLOAT (&atoms[atom_idx], (t_float)luaL_checknumber(L, lua_idx)); + atom_idx++; + break; + } + case 's': { + SETSYMBOL(&atoms[atom_idx], gensym(luaL_checkstring(L, lua_idx))); + atom_idx++; + break; + } + case 'F': { + SETFLOAT (&atoms[atom_idx], (t_float)luaL_optnumber(L, lua_idx, va_arg(defaults, double))); + atom_idx++; + break; + } + case 'S': { + SETSYMBOL(&atoms[atom_idx], gensym(luaL_optstring(L, lua_idx, va_arg(defaults, const char*)))); + atom_idx++; + break; + } + case 'c': + { + char color[16]; + if (lua_isstring(L, lua_idx)) + { + snprintf(color, sizeof(color), "%s", luaL_checkstring(L, lua_idx)); + } + else if (lua_istable(L, lua_idx)) + { + lua_rawgeti(L, lua_idx, 1); + lua_rawgeti(L, lua_idx, 2); + lua_rawgeti(L, lua_idx, 3); + double r = luaL_checknumber(L, -3); + double g = luaL_checknumber(L, -2); + double b = luaL_checknumber(L, -1); + lua_pop(L, 3); + if (r <= 1.0 && g <= 1.0 && b <= 1.0) { r *= 255.0; g *= 255.0; b *= 255.0; } + int ri = (int)fmax(0, fmin(255, r)); + int gi = (int)fmax(0, fmin(255, g)); + int bi = (int)fmax(0, fmin(255, b)); + snprintf(color, sizeof(color), "#%02x%02x%02x", ri, gi, bi); + } + else + { + pd_error(NULL, "[pdlua] %s: expected color string or {r,g,b} table", sym); + goto cleanup; + } + SETSYMBOL(&atoms[atom_idx], gensym(color)); + atom_idx++; + break; + } + case 't': + { + if (!lua_istable(L, lua_idx)) + { + pd_error(NULL, "[pdlua] %s: expected table at arg %d", sym, i + 1); + goto cleanup; + } + int n = lua_rawlen(L, lua_idx); + for (int j = 0; j < n; j++) + { + lua_rawgeti(L, lua_idx, j + 1); + SETSYMBOL(&atoms[atom_idx], gensym(lua_isstring(L, -1) ? lua_tostring(L, -1) : "")); + atom_idx++; + lua_pop(L, 1); + } + break; + } + default: break; + } + } + + if (pdlua->properties.plugdata_properties_callback) + pdlua->properties.plugdata_properties_callback(pdlua, gensym(sym), atom_idx, atoms); + +cleanup: + va_end(defaults); +} + static void pdlua_properties(t_gobj *z, t_glist *owner) { + UNUSED(owner); + t_pdlua *pdlua = (t_pdlua *)z; lua_State *L = __L(); @@ -74,193 +177,43 @@ static void pdlua_properties(t_gobj *z, t_glist *owner) static int pdlua_properties_newframe(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - const char *title = lua_tostring(L, 2); - int col = lua_tonumber(L, 3); - - t_atom atoms[1]; - SETSYMBOL(&atoms[0], gensym(title)); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_frame_property"), 1, atoms); - } else { - pd_error(NULL, "[pdlua] new_frame: invalid args"); - } + plugdata_add_property(L, "add_frame_property", "sf"); return 0; } static int pdlua_properties_addcheck(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - - t_atom atoms[3]; - SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); - SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); - SETFLOAT (&atoms[2], (t_float)lua_tonumber(L, 4)); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_check_property"), 3, atoms); - } else { - pd_error(NULL, "[pdlua] add_check: invalid args"); - } + plugdata_add_property(L, "add_check_property", "ssf"); return 0; } static int pdlua_properties_addtext(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - - t_atom atoms[3]; - SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); - SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); - SETSYMBOL(&atoms[2], gensym(lua_tostring(L, 4))); - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_text_property"), 3, atoms); - } else { - pd_error(NULL, "[pdlua] add_text: invalid args"); - } + plugdata_add_property(L, "add_text_property", "sss"); return 0; } static int pdlua_properties_addcolor(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && (lua_isstring(L, 4) || lua_istable(L, 4) )) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - - t_atom atoms[3]; - SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); - SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); - - char initcolor[16]; - if (lua_isstring(L, 4)) { - const char *init = lua_tostring(L, 4); - snprintf(initcolor, sizeof(initcolor), "%s", init); - } - else if (lua_istable(L, 4)) { - lua_rawgeti(L, 4, 1); - lua_rawgeti(L, 4, 2); - lua_rawgeti(L, 4, 3); - - double r = luaL_checknumber(L, -3); - double g = luaL_checknumber(L, -2); - double b = luaL_checknumber(L, -1); - - lua_pop(L, 3); - - if (r <= 1.0 && g <= 1.0 && b <= 1.0) { - r *= 255.0; - g *= 255.0; - b *= 255.0; - } - - int ri = (int)(r < 0 ? 0 : (r > 255 ? 255 : r)); - int gi = (int)(g < 0 ? 0 : (g > 255 ? 255 : g)); - int bi = (int)(b < 0 ? 0 : (b > 255 ? 255 : b)); - - snprintf(initcolor, sizeof(initcolor), "#%02x%02x%02x", ri, gi, bi); - } - else { - pd_error(NULL, "[pdlua] add_color: invalid init value"); - return 0; - } - SETSYMBOL(&atoms[2], gensym(initcolor)); - - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_color_property"), 3, atoms); - } else { - pd_error(NULL, "[pdlua] add_color: invalid args"); - } + plugdata_add_property(L, "add_color_property", "ssc"); return 0; } static int pdlua_properties_addint(lua_State *L) { - if (lua_isuserdata(L, 1) && - lua_isstring(L, 2) && - lua_isstring(L, 3) && - lua_isnumber(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - t_atom atoms[5]; - - SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); - SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); - SETFLOAT(&atoms[2], lua_tonumber(L, 4)); - SETFLOAT(&atoms[3], luaL_optnumber(L, 5, -1e36)); - SETFLOAT(&atoms[4], luaL_optnumber(L, 6, 1e36)); - - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_int_property"), 5, atoms); - } - else - { - pd_error(NULL, "[pdlua] add_int: invalid args"); - } - + plugdata_add_property(L, "add_int_property", "ssfFF", -1e36, 1e36); return 0; } static int pdlua_properties_addfloat(lua_State *L) { - if (lua_isuserdata(L, 1) && - lua_isstring(L, 2) && - lua_isstring(L, 3) && - lua_isnumber(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - t_atom atoms[5]; - - SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); - SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); - SETFLOAT(&atoms[2], lua_tonumber(L, 4)); - SETFLOAT(&atoms[3], luaL_optnumber(L, 5, -1e36)); - SETFLOAT(&atoms[4], luaL_optnumber(L, 6, 1e36)); - - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_float_property"), 5, atoms); - } - else - { - pd_error(NULL, "[pdlua] add_number: invalid args"); - } - + plugdata_add_property(L, "add_float_property", "ssfFF", -1e36, 1e36); return 0; } static int pdlua_properties_addcombo(lua_State *L) { - if (lua_isuserdata(L, 1) && - lua_isstring(L, 2) && - lua_isstring(L, 3) && - lua_isnumber(L, 4) && - lua_istable(L, 5)) - { - int num_options = lua_rawlen(L, 5); - int argc = 3 + num_options; - t_atom *atoms = (t_atom *)getbytes(sizeof(t_atom) * argc); - - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - SETSYMBOL(&atoms[0], gensym(lua_tostring(L, 2))); - SETSYMBOL(&atoms[1], gensym(lua_tostring(L, 3))); - SETFLOAT(&atoms[2], lua_tonumber(L, 4)); - - for (int i = 0; i < num_options; i++) - { - lua_rawgeti(L, 5, i + 1); - if (lua_isstring(L, -1)) - SETSYMBOL(&atoms[3 + i], gensym(lua_tostring(L, -1))); - else - SETSYMBOL(&atoms[3 + i], gensym("")); - lua_pop(L, 1); - } - - pdlua->properties.plugdata_properties_callback(pdlua, gensym("add_combo_property"), argc, atoms); - freebytes(atoms, sizeof(t_atom) * argc); - } - else - { - pd_error(NULL, "[pdlua] add_combo: invalid args"); - } - + plugdata_add_property(L, "add_combo_property", "ssft"); return 0; } @@ -268,7 +221,7 @@ static int pdlua_properties_addcombo(lua_State *L) #else #ifdef PURR_DATA -void pdlua_add_property(t_pdlua_properties *p, const char *name, const char *type, const char *value, const char* callback) { +void purrdata_add_property(t_pdlua_properties *p, const char *name, const char *type, const char *value, const char* callback) { if(p->property_count >= p->max_properties) { // Reallocate arrays int new_size = p->max_properties + 8; @@ -296,7 +249,8 @@ static void pdlua_properties_updaterow(t_pdlua_properties *p) } } -static void pdlua_properties(t_gobj *z, t_glist *owner) { +static void pdlua_properties(t_gobj *z, t_glist *UNUSED(owner)) { + t_pdlua *pdlua = (t_pdlua *)z; t_pdlua_properties *p = &pdlua->properties; @@ -431,431 +385,391 @@ static void pdlua_properties_buildvar(t_pdlua *pdlua, char *out) static int pdlua_properties_newframe(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isnumber(L, 3)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - const char *title = lua_tostring(L, 2); - int col = lua_tonumber(L, 3); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + const char *title = luaL_checkstring(L, 2); + int col = luaL_checknumber(L, 3); #ifndef PURR_DATA - pdlua->properties.frame_count++; - char current_frameid[MAXPDSTRING]; - snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); - pdlua->properties.current_frame = gensym(current_frameid); - - // raised, sunken, flat, ridge, solid, and groove. - // Create main frame for set of configurations - pdgui_vmess(0, "sssssi", "frame", current_frameid, "-relief", "groove", "-borderwidth", 1); - pdgui_vmess(0, "sssssssisi", "pack", current_frameid, "-side", "top", "-fill", "x", "-padx", 10, - "-pady", 10); - - // Title of the Frame - char labelid[MAXPDSTRING]; - snprintf(labelid, MAXPDSTRING, "%s.title", current_frameid); - pdgui_vmess(0, "ssss", "label", labelid, "-text", title); - pdgui_vmess(0, "sssssf", "pack", labelid, "-side", "top", "-pady", 5.f); - - // Create content frame with grid layout - char content_frameid[MAXPDSTRING]; - snprintf(content_frameid, MAXPDSTRING, "%s.content", current_frameid); - pdgui_vmess(0, "ss", "frame", content_frameid); - pdgui_vmess(0, "ssss", "pack", content_frameid, "-side", "top", "-fill", "x"); - - // Configure grid with 2 equal columns - for (int i = 0; i < col; i++) { - pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frameid, i, "-weight", 1); - } - pdlua->properties.current_frame = gensym(content_frameid); - pdlua->properties.max_col = col; - pdlua->properties.current_col = 0; - pdlua->properties.current_row = 0; + pdlua->properties.frame_count++; + char current_frameid[MAXPDSTRING]; + snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); + pdlua->properties.current_frame = gensym(current_frameid); + + // raised, sunken, flat, ridge, solid, and groove. + // Create main frame for set of configurations + pdgui_vmess(0, "sssssi", "frame", current_frameid, "-relief", "groove", "-borderwidth", 1); + pdgui_vmess(0, "sssssssisi", "pack", current_frameid, "-side", "top", "-fill", "x", "-padx", 10, + "-pady", 10); + + // Title of the Frame + char labelid[MAXPDSTRING]; + snprintf(labelid, MAXPDSTRING, "%s.title", current_frameid); + pdgui_vmess(0, "ssss", "label", labelid, "-text", title); + pdgui_vmess(0, "sssssf", "pack", labelid, "-side", "top", "-pady", 5.f); + + // Create content frame with grid layout + char content_frameid[MAXPDSTRING]; + snprintf(content_frameid, MAXPDSTRING, "%s.content", current_frameid); + pdgui_vmess(0, "ss", "frame", content_frameid); + pdgui_vmess(0, "ssss", "pack", content_frameid, "-side", "top", "-fill", "x"); + + // Configure grid with 2 equal columns + for (int i = 0; i < col; i++) { + pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frameid, i, "-weight", 1); + } + pdlua->properties.current_frame = gensym(content_frameid); + pdlua->properties.max_col = col; + pdlua->properties.current_col = 0; + pdlua->properties.current_row = 0; #else - // TODO: purr-data implementation + // TODO: purr-data implementation #endif - } else{ - pd_error(NULL, "[pdlua] new_frame: invalid args"); - - } return 0; } static int pdlua_properties_addcheck(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isnumber(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - int init_value = lua_tonumber(L, 4); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + const char *text = luaL_checkstring(L, 2); + const char *method = luaL_checkstring(L, 3); + int init_value = luaL_checknumber(L, 4); #ifndef PURR_DATA - if(!pdlua->properties.current_frame) - { - pd_error(NULL, "[pdlua] add_check: no active frame"); - return 0; - } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_check: no active frame"); + return 0; + } - char pdsend[MAXPDSTRING]; - char checkid[MAXPDSTRING]; - char checkvariable[MAXPDSTRING]; + char pdsend[MAXPDSTRING]; + char checkid[MAXPDSTRING]; + char checkvariable[MAXPDSTRING]; - pdlua_properties_buildvar(pdlua, checkvariable); + pdlua_properties_buildvar(pdlua, checkvariable); - // Initialize the Tcl variable to 0 (unchecked) - pdgui_vmess(0, "ssi", "set", checkvariable, init_value); + // Initialize the Tcl variable to 0 (unchecked) + pdgui_vmess(0, "ssi", "set", checkvariable, init_value); - // Build the pdsend command - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties checkbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, checkvariable); + // Build the pdsend command + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties checkbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, checkvariable); - // Create the checkbox - snprintf(checkid, MAXPDSTRING, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "ssssssss", "checkbutton", checkid, "-text", text, "-variable", checkvariable, - "-command", pdsend); + // Create the checkbox + snprintf(checkid, MAXPDSTRING, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); + pdgui_vmess(0, "ssssssss", "checkbutton", checkid, "-text", text, "-variable", checkvariable, + "-command", pdsend); - pdgui_vmess(0, "sssisi", "grid", checkid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, - "-sticky", "we"); - pdlua_properties_updaterow(&pdlua->properties); + pdgui_vmess(0, "sssisi", "grid", checkid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, + "-sticky", "we"); + pdlua_properties_updaterow(&pdlua->properties); #else - pdlua_add_property(text, "toggle", init_value ? "1" : "0", method); + purrdata_add_property(text, "toggle", init_value ? "1" : "0", method); #endif - } else { - pd_error(NULL, "[pdlua] add_check: invalid args"); - } return 0; } static int pdlua_properties_addtext(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && lua_isstring(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - const char *init_value = lua_tostring(L, 4); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + const char *text = luaL_checkstring(L, 2); + const char *method = luaL_checkstring(L, 3); + const char *init_value = luaL_checkstring(L, 4); #ifndef PURR_DATA - if(!pdlua->properties.current_frame) - { - pd_error(NULL, "[pdlua] add_text: no active frame"); - return 0; - } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_text: no active frame"); + return 0; + } - char pdsend[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char entryid[MAXPDSTRING]; + char pdsend[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char entryid[MAXPDSTRING]; - char textvariable[MAXPDSTRING]; + char textvariable[MAXPDSTRING]; - pdlua_properties_buildvar(pdlua, textvariable); + pdlua_properties_buildvar(pdlua, textvariable); - pdgui_vmess(0, "sss", "set", textvariable, init_value); + pdgui_vmess(0, "sss", "set", textvariable, init_value); - // Command to send it to pd - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties textbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, textvariable); + // Command to send it to pd + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties textbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, textvariable); - // container for button to set and text input - char text_button_frame[MAXPDSTRING]; - snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, - pdlua->properties.property_count); - pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 0, - "-padx", 5, "-pady", 5); + // container for button to set and text input + char text_button_frame[MAXPDSTRING]; + snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, + pdlua->properties.property_count); + pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 0, + "-padx", 5, "-pady", 5); - // create text for identification - snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, pdlua->properties.property_count); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); + // create text for identification + snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, pdlua->properties.property_count); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); - snprintf(entryid, MAXPDSTRING, "%s.textbox%d", text_button_frame, pdlua->properties.property_count); - pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", 8); - pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); - pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); + snprintf(entryid, MAXPDSTRING, "%s.textbox%d", text_button_frame, pdlua->properties.property_count); + pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", 8); + pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); - // Pack the entry - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", entryid, "-side", "left"); - pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", pdlua->properties.current_row, "-column", - pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); - pdlua_properties_updaterow(&pdlua->properties); + // Pack the entry + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", entryid, "-side", "left"); + pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", pdlua->properties.current_row, "-column", + pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); + pdlua_properties_updaterow(&pdlua->properties); #else - pdlua_add_property(text, "symbol", init_value, method); + purrdata_add_property(text, "symbol", init_value, method); #endif - } else { - pd_error(NULL, "[pdlua] add_text: invalid args"); - } return 0; } static int pdlua_properties_addcolor(lua_State *L) { - if (lua_isuserdata(L, 1) && lua_isstring(L, 2) && lua_isstring(L, 3) && - (lua_isstring(L, 4) || lua_istable(L, 4))) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - - char initcolor[16]; - if (lua_isstring(L, 4)) { - const char *init = lua_tostring(L, 4); - snprintf(initcolor, sizeof(initcolor), "%s", init); - } - else if (lua_istable(L, 4)) { - lua_rawgeti(L, 4, 1); - lua_rawgeti(L, 4, 2); - lua_rawgeti(L, 4, 3); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + const char *text = luaL_checkstring(L, 2); + const char *method = luaL_checkstring(L, 3); + + char initcolor[16]; + if (lua_isstring(L, 4)) { + const char *init = lua_tostring(L, 4); + snprintf(initcolor, sizeof(initcolor), "%s", init); + } + else if (lua_istable(L, 4)) { + lua_rawgeti(L, 4, 1); + lua_rawgeti(L, 4, 2); + lua_rawgeti(L, 4, 3); - double r = luaL_checknumber(L, -3); - double g = luaL_checknumber(L, -2); - double b = luaL_checknumber(L, -1); + double r = luaL_checknumber(L, -3); + double g = luaL_checknumber(L, -2); + double b = luaL_checknumber(L, -1); - lua_pop(L, 3); + lua_pop(L, 3); - if (r <= 1.0 && g <= 1.0 && b <= 1.0) { - r *= 255.0; - g *= 255.0; - b *= 255.0; - } + if (r <= 1.0 && g <= 1.0 && b <= 1.0) { + r *= 255.0; + g *= 255.0; + b *= 255.0; + } - int ri = (int)(r < 0 ? 0 : (r > 255 ? 255 : r)); - int gi = (int)(g < 0 ? 0 : (g > 255 ? 255 : g)); - int bi = (int)(b < 0 ? 0 : (b > 255 ? 255 : b)); + int ri = (int)(r < 0 ? 0 : (r > 255 ? 255 : r)); + int gi = (int)(g < 0 ? 0 : (g > 255 ? 255 : g)); + int bi = (int)(b < 0 ? 0 : (b > 255 ? 255 : b)); - snprintf(initcolor, sizeof(initcolor), "#%02x%02x%02x", ri, gi, bi); - } - else { - pd_error(NULL, "[pdlua] add_color: invalid init value"); - return 0; - } + snprintf(initcolor, sizeof(initcolor), "#%02x%02x%02x", ri, gi, bi); + } + else { + pd_error(NULL, "[pdlua] add_color: invalid init value"); + return 0; + } #ifndef PURR_DATA - if (!pdlua->properties.current_frame) { - pd_error(NULL, "[pdlua] add_color: no active frame"); - return 0; - } + if (!pdlua->properties.current_frame) { + pd_error(NULL, "[pdlua] add_color: no active frame"); + return 0; + } - char container[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char colorboxid[MAXPDSTRING]; - char pdsend[MAXPDSTRING]; + char container[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char colorboxid[MAXPDSTRING]; + char pdsend[MAXPDSTRING]; - snprintf(container, MAXPDSTRING, "%s.color%d", - pdlua->properties.current_frame->s_name, - pdlua->properties.property_count); - snprintf(textid, MAXPDSTRING, "%s.label", container); - snprintf(colorboxid, MAXPDSTRING, "%s.box", container); + snprintf(container, MAXPDSTRING, "%s.color%d", + pdlua->properties.current_frame->s_name, + pdlua->properties.property_count); + snprintf(textid, MAXPDSTRING, "%s.label", container); + snprintf(colorboxid, MAXPDSTRING, "%s.box", container); - pdgui_vmess(0, "ss", "frame", container); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); - pdgui_vmess(0, "sssssisisssssi", "label", colorboxid, "-text", "", "-width", 4, "-height", 2, "-background", initcolor, "-relief", "sunken", "-borderwidth", 1); - pdgui_vmess(0, "ssss", colorboxid, "configure", "-cursor", "hand2"); + pdgui_vmess(0, "ss", "frame", container); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); + pdgui_vmess(0, "sssssisisssssi", "label", colorboxid, "-text", "", "-width", 4, "-height", 2, "-background", initcolor, "-relief", "sunken", "-borderwidth", 1); + pdgui_vmess(0, "ssss", colorboxid, "configure", "-cursor", "hand2"); - pdgui_vmess(0, "r", - "proc pdlua_choose_color {widget receiver method} {\n" - " set current [ $widget cget -background ]\n" - "\n" - " set c [tk_chooseColor -initialcolor $current -title \"Choose color\"]\n" - "\n" - " if {$c ne \"\"} {\n" - " $widget configure -background $c\n" - "\n" - " pdsend [concat $receiver _properties colorpicker $method $c]\n" - " }\n" - "}\n"); + pdgui_vmess(0, "r", + "proc pdlua_choose_color {widget receiver method} {\n" + " set current [ $widget cget -background ]\n" + "\n" + " set c [tk_chooseColor -initialcolor $current -title \"Choose color\"]\n" + "\n" + " if {$c ne \"\"} {\n" + " $widget configure -background $c\n" + "\n" + " pdsend [concat $receiver _properties colorpicker $method $c]\n" + " }\n" + "}\n"); - snprintf(pdsend, MAXPDSTRING, "pdlua_choose_color %s %s %s", colorboxid, pdlua->properties.properties_receiver->s_name, method); + snprintf(pdsend, MAXPDSTRING, "pdlua_choose_color %s %s %s", colorboxid, pdlua->properties.properties_receiver->s_name, method); - pdgui_vmess(0, "ssss", "bind", colorboxid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", colorboxid, "", pdsend); - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "sssssi", "pack", colorboxid, "-side", "top", "-pady", 2); + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "sssssi", "pack", colorboxid, "-side", "top", "-pady", 2); - pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w"); + pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w"); - pdlua_properties_updaterow(&pdlua->properties); + pdlua_properties_updaterow(&pdlua->properties); #else - pdlua_add_property(text, "symbol", initcolor, method); + purrdata_add_property(text, "symbol", initcolor, method); #endif - } else { - pd_error(NULL, "[pdlua] add_color: invalid args"); - } return 0; } static int pdlua_properties_addint(lua_State *L) { - if (lua_isuserdata(L, 1) && - lua_isstring(L, 2) && - lua_isstring(L, 3) && - lua_isnumber(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - int init = (int)lua_tonumber(L, 4); - double min = luaL_optnumber(L, 5, -1e36); - double max = luaL_optnumber(L, 6, 1e36); + const char *text = luaL_checkstring(L, 2); + const char *method = luaL_checkstring(L, 3); + int init = (int)luaL_checknumber(L, 4); + double min = luaL_optnumber(L, 5, -1e36); + double max = luaL_optnumber(L, 6, 1e36); #ifndef PURR_DATA - if(!pdlua->properties.current_frame) - { - pd_error(NULL, "[pdlua] add_int: no active frame"); - return 0; - } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_int: no active frame"); + return 0; + } - char pdsend[MAXPDSTRING]; - char spinboxid[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char numvariable[MAXPDSTRING]; - char container[MAXPDSTRING]; + char pdsend[MAXPDSTRING]; + char spinboxid[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char numvariable[MAXPDSTRING]; + char container[MAXPDSTRING]; - pdlua_properties_buildvar(pdlua, numvariable); + pdlua_properties_buildvar(pdlua, numvariable); - pdgui_vmess(0, "ssi", "set", numvariable, init); + pdgui_vmess(0, "ssi", "set", numvariable, init); - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, numvariable); + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, numvariable); - snprintf(container, MAXPDSTRING, "%s.numberbox%d", - pdlua->properties.current_frame->s_name, - pdlua->properties.property_count); + snprintf(container, MAXPDSTRING, "%s.numberbox%d", + pdlua->properties.current_frame->s_name, + pdlua->properties.property_count); - pdgui_vmess(0, "ss", "frame", container); + pdgui_vmess(0, "ss", "frame", container); - snprintf(textid, MAXPDSTRING, "%s.label", container); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); + snprintf(textid, MAXPDSTRING, "%s.label", container); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); - snprintf(spinboxid, MAXPDSTRING, "%s.spin", container); + snprintf(spinboxid, MAXPDSTRING, "%s.spin", container); - pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinboxid, - "-from", min, "-to", max, - "-increment", 1.0f, - "-textvariable", numvariable, - "-width", 8, - "-validate", "key", - "-validatecommand", "string is integer %P", - "-command", pdsend); + pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinboxid, + "-from", min, "-to", max, + "-increment", 1.0f, + "-textvariable", numvariable, + "-width", 8, + "-validate", "key", + "-validatecommand", "string is integer %P", + "-command", pdsend); - pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); - pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", spinboxid, "-side", "top"); - pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", spinboxid, "-side", "top"); + pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); - pdlua_properties_updaterow(&pdlua->properties); + pdlua_properties_updaterow(&pdlua->properties); #else - char init_value[MAXPDSTRING]; - snprintf(init_value, MAXPDSTRING, "%d", init); - pdlua_add_property(text, "number", init_value, method); + char init_value[MAXPDSTRING]; + snprintf(init_value, MAXPDSTRING, "%d", init); + purrdata_add_property(text, "number", init_value, method); #endif - } - else { - pd_error(NULL, "[pdlua] add_int: invalid args"); - } return 0; } static int pdlua_properties_addfloat(lua_State *L) { - if (lua_isuserdata(L, 1) && - lua_isstring(L, 2) && - lua_isstring(L, 3) && - lua_isnumber(L, 4)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); - const char *text = lua_tostring(L, 2); - const char *method = lua_tostring(L, 3); - double init = lua_tonumber(L, 4); - double min = luaL_optnumber(L, 5, -1e36); - double max = luaL_optnumber(L, 6, 1e36); + const char *text = luaL_checkstring(L, 2); + const char *method = luaL_checkstring(L, 3); + double init = luaL_checknumber(L, 4); + double min = luaL_optnumber(L, 5, -1e36); + double max = luaL_optnumber(L, 6, 1e36); #ifndef PURR_DATA - if(!pdlua->properties.current_frame) - { - pd_error(NULL, "[pdlua] add_float: no active frame"); - return 0; - } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_float: no active frame"); + return 0; + } - char pdsend[MAXPDSTRING]; - char entryid[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char numvariable[MAXPDSTRING]; - char container[MAXPDSTRING]; - - pdlua_properties_buildvar(pdlua, numvariable); - - pdgui_vmess(0, "ssf", "set", numvariable, init); - - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties floatbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, numvariable); - - snprintf(container, MAXPDSTRING, "%s.floatbox%d", - pdlua->properties.current_frame->s_name, - pdlua->properties.property_count); - - pdgui_vmess(0, "ss", "frame", container); - - snprintf(textid, MAXPDSTRING, "%s.label", container); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); - - snprintf(entryid, MAXPDSTRING, "%s.entry", container); - - pdgui_vmess(0, "sssssissss", "entry", entryid, - "-textvariable", numvariable, - "-width", 8, - "-validate", "key", - "-validatecommand", "regexp {^-?[0-9]*\\.?[0-9]*$} %P"); - - - char returncmd[MAXPDSTRING * 4]; - snprintf(returncmd, sizeof(returncmd), - "bind %s {" - " set v $%s;" - " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" - " pdsend \"%s _properties floatbox %s $%s\"" - "}\n", - entryid, - numvariable, - min, numvariable, min, - max, numvariable, max, - pdlua->properties.properties_receiver->s_name, method, numvariable); - pdgui_vmess(0, "r", returncmd); - - char focusoutcmd[MAXPDSTRING * 4]; - snprintf(focusoutcmd, sizeof(focusoutcmd), - "bind %s {" - " set v $%s;" - " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" - " pdsend \"%s _properties floatbox %s $%s\"" - "}\n", - entryid, - numvariable, - min, numvariable, min, - max, numvariable, max, - pdlua->properties.properties_receiver->s_name, method, numvariable); - pdgui_vmess(0, "r", focusoutcmd); - - - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", entryid, "-side", "top"); - pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); - - pdlua_properties_updaterow(&pdlua->properties); + char pdsend[MAXPDSTRING]; + char entryid[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char numvariable[MAXPDSTRING]; + char container[MAXPDSTRING]; + + pdlua_properties_buildvar(pdlua, numvariable); + + pdgui_vmess(0, "ssf", "set", numvariable, init); + + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties floatbox %s $%s]", + pdlua->properties.properties_receiver->s_name, method, numvariable); + + snprintf(container, MAXPDSTRING, "%s.floatbox%d", + pdlua->properties.current_frame->s_name, + pdlua->properties.property_count); + + pdgui_vmess(0, "ss", "frame", container); + + snprintf(textid, MAXPDSTRING, "%s.label", container); + pdgui_vmess(0, "ssss", "label", textid, "-text", text); + + snprintf(entryid, MAXPDSTRING, "%s.entry", container); + + pdgui_vmess(0, "sssssissss", "entry", entryid, + "-textvariable", numvariable, + "-width", 8, + "-validate", "key", + "-validatecommand", "regexp {^-?[0-9]*\\.?[0-9]*$} %P"); + + + char returncmd[MAXPDSTRING * 4]; + snprintf(returncmd, sizeof(returncmd), + "bind %s {" + " set v $%s;" + " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" + " pdsend \"%s _properties floatbox %s $%s\"" + "}\n", + entryid, + numvariable, + min, numvariable, min, + max, numvariable, max, + pdlua->properties.properties_receiver->s_name, method, numvariable); + pdgui_vmess(0, "r", returncmd); + + char focusoutcmd[MAXPDSTRING * 4]; + snprintf(focusoutcmd, sizeof(focusoutcmd), + "bind %s {" + " set v $%s;" + " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" + " pdsend \"%s _properties floatbox %s $%s\"" + "}\n", + entryid, + numvariable, + min, numvariable, min, + max, numvariable, max, + pdlua->properties.properties_receiver->s_name, method, numvariable); + pdgui_vmess(0, "r", focusoutcmd); + + + pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", entryid, "-side", "top"); + pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + + pdlua_properties_updaterow(&pdlua->properties); #else - char init_value[MAXPDSTRING]; - snprintf(init_value, MAXPDSTRING, "%f", init); - pdlua_add_property(text, "number", init_value, method); + char init_value[MAXPDSTRING]; + snprintf(init_value, MAXPDSTRING, "%f", init); + purrdata_add_property(text, "number", init_value, method); #endif - } - else { - pd_error(NULL, "[pdlua] add_float: invalid args"); - } return 0; } @@ -863,86 +777,75 @@ static int pdlua_properties_addfloat(lua_State *L) static int pdlua_properties_addcombo(lua_State *L) { - if (lua_isuserdata(L,1) && - lua_isstring(L,2) && - lua_isstring(L,3) && - lua_isnumber(L,4) && - lua_istable(L,5)) - { - t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L,1); + t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L,1); - const char *label = lua_tostring(L,2); - const char *method = lua_tostring(L,3); - int init = lua_tonumber(L,4) - 1; + const char *label = luaL_checkstring(L,2); + const char *method = luaL_checkstring(L,3); + int init = luaL_checknumber(L,4) - 1; - int options_count = lua_rawlen(L,5); - const char **opts = calloc(options_count, sizeof(char*)); - for (int i = 0; i < options_count; i++) - { - lua_rawgeti(L, 5, i+1); - opts[i] = lua_isstring(L, -1) ? lua_tostring(L, -1) : ""; - lua_pop(L, 1); - } + int options_count = lua_rawlen(L,5); + const char **opts = calloc(options_count, sizeof(char*)); + for (int i = 0; i < options_count; i++) + { + lua_rawgeti(L, 5, i+1); + opts[i] = lua_isstring(L, -1) ? lua_tostring(L, -1) : ""; + lua_pop(L, 1); + } #ifndef PURR_DATA - char pdsend[MAXPDSTRING]; - char comboid[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char combovar[MAXPDSTRING]; + char pdsend[MAXPDSTRING]; + char comboid[MAXPDSTRING]; + char textid[MAXPDSTRING]; + char combovar[MAXPDSTRING]; - pdlua_properties_buildvar(pdlua, combovar); + pdlua_properties_buildvar(pdlua, combovar); - if(!pdlua->properties.current_frame) - { - pd_error(NULL, "[pdlua] add_combo: no active frame"); - return 0; - } + if(!pdlua->properties.current_frame) + { + pd_error(NULL, "[pdlua] add_combo: no active frame"); + return 0; + } - if(init < options_count) { - pdgui_vmess(0,"sss","set", combovar, opts[init]); - } + if(init < options_count) { + pdgui_vmess(0,"sss","set", combovar, opts[init]); + } - snprintf(pdsend, MAXPDSTRING, - "eval pdsend [concat %s _properties combobox %s [expr {[%%W current] + 1}]]", - pdlua->properties.properties_receiver->s_name, method); + snprintf(pdsend, MAXPDSTRING, + "eval pdsend [concat %s _properties combobox %s [expr {[%%W current] + 1}]]", + pdlua->properties.properties_receiver->s_name, method); - char container[MAXPDSTRING]; - snprintf(container, MAXPDSTRING, "%s.combo%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); + char container[MAXPDSTRING]; + snprintf(container, MAXPDSTRING, "%s.combo%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0,"ss", "frame", container); + pdgui_vmess(0,"ss", "frame", container); - snprintf(textid, MAXPDSTRING, "%s.label", container); - pdgui_vmess(0,"ssss", "label", textid, "-text", label); + snprintf(textid, MAXPDSTRING, "%s.label", container); + pdgui_vmess(0,"ssss", "label", textid, "-text", label); - snprintf(comboid, MAXPDSTRING,"%s.widget",container); + snprintf(comboid, MAXPDSTRING,"%s.widget",container); - pdgui_vmess(0,"sssssSsssi", "ttk::combobox", comboid, "-textvariable",combovar, "-values", options_count, opts, "-state", "readonly", "-width", 8); + pdgui_vmess(0,"sssssSsssi", "ttk::combobox", comboid, "-textvariable",combovar, "-values", options_count, opts, "-state", "readonly", "-width", 8); - pdgui_vmess(0,"ssss", "bind", comboid, "<>", pdsend); + pdgui_vmess(0,"ssss", "bind", comboid, "<>", pdsend); - pdgui_vmess(0,"ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0,"ssss", "pack", comboid, "-side", "top"); + pdgui_vmess(0,"ssss", "pack", textid, "-side", "top"); + pdgui_vmess(0,"ssss", "pack", comboid, "-side", "top"); - pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); - pdlua_properties_updaterow(&pdlua->properties); + pdlua_properties_updaterow(&pdlua->properties); #else - char init_value[MAXPDSTRING]; - snprintf(init_value, MAXPDSTRING, "%d", init); - pdlua_add_property(text, "number", init_value, method); + char init_value[MAXPDSTRING]; + snprintf(init_value, MAXPDSTRING, "%d", init); + purrdata_add_property(text, "number", init_value, method); #endif - free(opts); - } - else - { - pd_error(NULL, "[pdlua] add_combo: invalid args"); - } + free(opts); return 0; } #endif -static void pdlua_properties_receiver(t_pdlua *o, t_symbol *s, int argc, t_atom *argv) +static void pdlua_properties_receiver(t_pdlua *o, t_symbol * UNUSED(s), int argc, t_atom *argv) { if (argc < 2) return; diff --git a/svg/nanosvg.h b/svg/nanosvg.h index 76e0dbe..05b3b05 100644 --- a/svg/nanosvg.h +++ b/svg/nanosvg.h @@ -284,7 +284,7 @@ static void nsvg__parseElement(char* s, // Get attribs while (!end && *s && nattr < NSVG_XML_MAX_ATTRIBS-3) { - char* name = NULL; + char* n = NULL; char* value = NULL; // Skip white space before the attrib name @@ -294,7 +294,7 @@ static void nsvg__parseElement(char* s, end = 1; break; } - name = s; + n = s; // Find end of the attrib name. while (*s && !nsvg__isspace(*s) && *s != '=') s++; if (*s) { *s++ = '\0'; } @@ -309,8 +309,8 @@ static void nsvg__parseElement(char* s, if (*s) { *s++ = '\0'; } // Store only well formed attributes - if (name && value) { - attr[nattr++] = name; + if (n && value) { + attr[nattr++] = n; attr[nattr++] = value; } } From 5d0906af83985f9d31d89fb37cb65fc98ca3ccb7 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 17:48:02 +0100 Subject: [PATCH 056/109] Fix compilation --- pdlua.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/pdlua.c b/pdlua.c index f874e62..37acdc8 100644 --- a/pdlua.c +++ b/pdlua.c @@ -105,16 +105,6 @@ # define UNUSED(x) x #endif -#if defined(__GNUC__) /* covers both GCC and Clang */ -#define PD_NEWMETHOD_CAST(f) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wcast-function-type\"") \ - (t_newmethod)(f) \ - _Pragma("GCC diagnostic pop") -#else -#define PD_NEWMETHOD_CAST(f) (t_newmethod)(f) -#endif - /* BAD: end of bad section */ /* If defined, PDLUA_DEBUG lets pdlua post a lot of text */ @@ -1521,18 +1511,20 @@ static int pdlua_class_new(lua_State *L) snprintf(name_gfx, MAXPDSTRING-1, "%s:gfx", name); PDLUA_DEBUG3("pdlua_class_new: L is %p, name is %s stack top is %d", L, name, lua_gettop(L)); - c = class_new(global_gensym((char *) name), PD_NEWMETHOD_CAST(pdlua_new), +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-function-type" + c = class_new(global_gensym((char *) name), (t_newmethod)pdlua_new, (t_method) pdlua_free, sizeof(t_pdlua), CLASS_NOINLET | CLASS_MULTICHANNEL, A_GIMME, 0); if (strcmp(name, "pdlua") && strcmp(name, "pdluax")) { // Shadow class for graphics objects. This is an exact clone of the // regular (non-gui) class, except that it has a different // widgetbehavior. We only need this for the regular Lua objects, the // pdlua and pdluax built-ins don't have this. - c_gfx = class_new(global_gensym((char *) name_gfx), PD_NEWMETHOD_CAST(pdlua_new), + c_gfx = class_new(global_gensym((char *) name_gfx), (t_newmethod)pdlua_new, (t_method) pdlua_free, sizeof(t_pdlua), CLASS_NOINLET | CLASS_MULTICHANNEL, A_GIMME, 0); class_sethelpsymbol(c_gfx, gensym((char *) name)); } - +#pragma GCC diagnostic pop // Let plugdata know this class is a lua object #if PLUGDATA plugdata_register_class(name); From 80a46120507dd0bb457554bb427d8044926d45ba Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 18:07:37 +0100 Subject: [PATCH 057/109] Wait for OK/Apply button to send properties to lua --- pdlua.h | 12 ++ pdlua_properties.h | 276 +++++++++++++++++++++++++++++++-------------- 2 files changed, 204 insertions(+), 84 deletions(-) diff --git a/pdlua.h b/pdlua.h index 52b3959..a6771f8 100644 --- a/pdlua.h +++ b/pdlua.h @@ -25,6 +25,15 @@ typedef struct _gfx_transform float x, y; } gfx_transform; +#define MAX_PENDING_PROPERTIES 128 +#define MAX_PROPERTY_ARGS 8 + +typedef struct { + char guitype[MAXPDSTRING]; + char method[MAXPDSTRING]; + int argc; + t_atom argv[MAX_PROPERTY_ARGS]; +} t_pending_property; typedef struct _pdlua_properties { @@ -36,6 +45,9 @@ typedef struct _pdlua_properties int property_count; int max_col, max_row; int current_col, current_row; + + t_pending_property pending[MAX_PENDING_PROPERTIES]; + int pending_count; #else int property_count; int max_properties; diff --git a/pdlua_properties.h b/pdlua_properties.h index 17826d9..0c53840 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -151,10 +151,8 @@ static inline void plugdata_add_property(lua_State* L, const char* sym, const ch va_end(defaults); } -static void pdlua_properties(t_gobj *z, t_glist *owner) +static void pdlua_properties(t_gobj *z, t_glist * UNUSED(owner)) { - UNUSED(owner); - t_pdlua *pdlua = (t_pdlua *)z; lua_State *L = __L(); @@ -217,7 +215,75 @@ static int pdlua_properties_addcombo(lua_State *L) return 0; } +static void pdlua_properties_receiver(t_pdlua *o, t_symbol * UNUSED(s), int argc, t_atom *argv) +{ + if (argc < 2) + return; + + lua_getglobal(__L(), "pd"); + lua_getfield(__L(), -1, "_set_properties"); + lua_remove(__L(), -2); + + lua_pushlightuserdata(__L(), o); + lua_pushstring(__L(), atom_getsymbol(argv + 1)->s_name); + lua_newtable(__L()); + + const char *guitype = atom_getsymbol(argv)->s_name; + if (strcmp(guitype, "colorpicker") == 0) + { + const char *hexcolor = atom_getsymbol(argv + 2)->s_name; + int isvalid = 1; + + if (hexcolor == NULL || hexcolor[0] != '#' || strlen(hexcolor) != 7) { + isvalid = 0; + } else { + for (int i = 1; i < 7; i++) { + if (!isxdigit(hexcolor[i])) isvalid = 0; + } + } + + if (!isvalid) { + pd_error(o, "Invalid color string"); + return; + } + + int r, g, b; + if (sscanf(hexcolor + 1, "%2x%2x%2x", &r, &g, &b) == 3) { + lua_newtable(__L()); + lua_pushinteger(__L(), r); + lua_rawseti(__L(), -2, 1); + lua_pushinteger(__L(), g); + lua_rawseti(__L(), -2, 2); + lua_pushinteger(__L(), b); + lua_rawseti(__L(), -2, 3); + lua_rawseti(__L(), -2, 1); + } else { + pd_error(o, "Invalid color format in sscanf"); + return; + } + } else { + for (int i = 2; i < argc; i++) + { + if (argv[i].a_type == A_FLOAT) + { + lua_pushnumber(__L(), atom_getfloat(argv + i)); + lua_rawseti(__L(), -2, i - 1); // Store at index (1-based in Lua) + } + else if (argv[i].a_type == A_SYMBOL) + { + lua_pushstring(__L(), atom_getsymbol(argv + i)->s_name); + lua_rawseti(__L(), -2, i - 1); + } + } + } + if (lua_pcall(__L(), 3, 0, 0)) + { + mylua_error(__L(), o, "_set_properties"); // Handle error + lua_pop(__L(), 1); // Pop error message + return; + } +} #else #ifdef PURR_DATA @@ -266,11 +332,12 @@ static void pdlua_properties(t_gobj *z, t_glist *UNUSED(owner)) { if(pdlua->properties.frame_count != 0) pd_unbind(&pdlua->pd.ob_pd, p->properties_receiver); - pdlua->properties.current_frame = NULL; - pdlua->properties.frame_count = 0; - pdlua->properties.property_count = 0; - pdlua->properties.current_row = 0; - pdlua->properties.current_col = 0; + p->current_frame = NULL; + p->frame_count = 0; + p->property_count = 0; + p->current_row = 0; + p->current_col = 0; + p->pending_count = 0; pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); @@ -338,24 +405,31 @@ static void pdlua_properties(t_gobj *z, t_glist *UNUSED(owner)) { pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); - // Cancel (Close window) - pdgui_vmess(0, "ssssss", "button", buttonCancelId, "-text", "Cancel", "-command", - destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); - - // Apply (send all data to pd and lua obj) for this must be necessary to save all the variables used in the object in a char [128][MAXPDSTRING], - // I don't think that this is good, or there is better solution? - // TODO: Need to dev the apply command - pdgui_vmess(0, "ssss", "button", buttonApplyId, "-text", "Apply"); - // pdgui_vmess(0, "ssssss", "button", buttonApplyId, "-text", "Apply", "-command", command); - pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); - - // Ok - pdgui_vmess(0, "ssssss", "button", buttonOkId, "-text", "OK", "-command", destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, - "-ipadx", 10); + + char applyCommand[MAXPDSTRING]; + snprintf(applyCommand, MAXPDSTRING, + "pdsend \"%s _properties apply\"", + p->properties_receiver->s_name); + + char okCommand[MAXPDSTRING * 2]; + snprintf(okCommand, MAXPDSTRING * 2, + "pdsend \"%s _properties apply\"; destroy .%p", + p->properties_receiver->s_name, (void *)p); + + pdgui_vmess(0, "ssssss", "button", buttonCancelId, + "-text", "Cancel", "-command", destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, + "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); + + pdgui_vmess(0, "ssssss", "button", buttonApplyId, + "-text", "Apply", "-command", applyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, + "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); + + pdgui_vmess(0, "ssssss", "button", buttonOkId, + "-text", "OK", "-command", okCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, + "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); #else t_symbol *gfx_tag = gfxstub_new2(&pdlua->pd.te_g.g_pd, x); @@ -510,7 +584,7 @@ static int pdlua_properties_addtext(lua_State *L) snprintf(entryid, MAXPDSTRING, "%s.textbox%d", text_button_frame, pdlua->properties.property_count); pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", 8); - pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); // Pack the entry @@ -666,7 +740,7 @@ static int pdlua_properties_addint(lua_State *L) "-validatecommand", "string is integer %P", "-command", pdsend); - pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); @@ -731,9 +805,9 @@ static int pdlua_properties_addfloat(lua_State *L) "-validatecommand", "regexp {^-?[0-9]*\\.?[0-9]*$} %P"); - char returncmd[MAXPDSTRING * 4]; - snprintf(returncmd, sizeof(returncmd), - "bind %s {" + char keypresscmd[MAXPDSTRING * 4]; + snprintf(keypresscmd, sizeof(keypresscmd), + "bind %s {" " set v $%s;" " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" " pdsend \"%s _properties floatbox %s $%s\"" @@ -743,7 +817,7 @@ static int pdlua_properties_addfloat(lua_State *L) min, numvariable, min, max, numvariable, max, pdlua->properties.properties_receiver->s_name, method, numvariable); - pdgui_vmess(0, "r", returncmd); + pdgui_vmess(0, "r", keypresscmd); char focusoutcmd[MAXPDSTRING * 4]; snprintf(focusoutcmd, sizeof(focusoutcmd), @@ -843,74 +917,108 @@ static int pdlua_properties_addcombo(lua_State *L) return 0; } -#endif -static void pdlua_properties_receiver(t_pdlua *o, t_symbol * UNUSED(s), int argc, t_atom *argv) +static void pdlua_properties_apply(t_pdlua *o) { - if (argc < 2) - return; - - lua_getglobal(__L(), "pd"); - lua_getfield(__L(), -1, "_set_properties"); - lua_remove(__L(), -2); - - lua_pushlightuserdata(__L(), o); - lua_pushstring(__L(), atom_getsymbol(argv + 1)->s_name); - lua_newtable(__L()); // Criando a tabela + lua_State *L = __L(); + t_pdlua_properties *p = &o->properties; - const char *guitype = atom_getsymbol(argv)->s_name; - if (strcmp(guitype, "colorpicker") == 0) + for (int i = 0; i < p->pending_count; i++) { - const char *hexcolor = atom_getsymbol(argv + 2)->s_name; - int isvalid = 1; + t_pending_property *entry = &p->pending[i]; - if (hexcolor == NULL || hexcolor[0] != '#' || strlen(hexcolor) != 7) { - isvalid = 0; - } else { - for (int i = 1; i < 7; i++) { - if (!isxdigit(hexcolor[i])) isvalid = 0; - } - } + lua_getglobal(L, "pd"); + lua_getfield(L, -1, "_set_properties"); + lua_remove(L, -2); - if (!isvalid) { - pd_error(o, "Invalid color string"); - return; - } + lua_pushlightuserdata(L, o); + lua_pushstring(L, entry->method); + lua_newtable(L); - int r, g, b; - if (sscanf(hexcolor + 1, "%2x%2x%2x", &r, &g, &b) == 3) { - lua_newtable(__L()); - lua_pushinteger(__L(), r); - lua_rawseti(__L(), -2, 1); - lua_pushinteger(__L(), g); - lua_rawseti(__L(), -2, 2); - lua_pushinteger(__L(), b); - lua_rawseti(__L(), -2, 3); - lua_rawseti(__L(), -2, 1); - } else { - pd_error(o, "Invalid color format in sscanf"); - return; - } - } else { - for (int i = 2; i < argc; i++) + if (strcmp(entry->guitype, "colorpicker") == 0) { - if (argv[i].a_type == A_FLOAT) + const char *hexcolor = atom_getsymbol(&entry->argv[0])->s_name; + int r, g, b; + if (sscanf(hexcolor + 1, "%2x%2x%2x", &r, &g, &b) == 3) { - lua_pushnumber(__L(), atom_getfloat(argv + i)); - lua_rawseti(__L(), -2, i - 1); // Store at index (1-based in Lua) + lua_newtable(L); + lua_pushinteger(L, r); lua_rawseti(L, -2, 1); + lua_pushinteger(L, g); lua_rawseti(L, -2, 2); + lua_pushinteger(L, b); lua_rawseti(L, -2, 3); + lua_rawseti(L, -2, 1); } - else if (argv[i].a_type == A_SYMBOL) + } + else + { + for (int j = 0; j < entry->argc; j++) { - lua_pushstring(__L(), atom_getsymbol(argv + i)->s_name); - lua_rawseti(__L(), -2, i - 1); + if (entry->argv[j].a_type == A_FLOAT) + lua_pushnumber(L, atom_getfloat(&entry->argv[j])); + else + lua_pushstring(L, atom_getsymbol(&entry->argv[j])->s_name); + lua_rawseti(L, -2, j + 1); } } + + if (lua_pcall(L, 3, 0, 0)) + { + mylua_error(L, o, "_set_properties"); + lua_pop(L, 1); + } } - if (lua_pcall(__L(), 3, 0, 0)) + p->pending_count = 0; +} + +static void pdlua_properties_receiver(t_pdlua *o, t_symbol *UNUSED(s), int argc, t_atom *argv) +{ + if (argc < 1) return; + + const char *guitype = atom_getsymbol(argv)->s_name; + + // Apply button sends this + if (strcmp(guitype, "apply") == 0) { - mylua_error(__L(), o, "_set_properties"); // Handle error - lua_pop(__L(), 1); // Pop error message + pdlua_properties_apply(o); return; } + + if (argc < 2) return; + + t_pdlua_properties *p = &o->properties; + const char *method = atom_getsymbol(argv + 1)->s_name; + + // Overwrite existing entry for the same method so only the latest value is kept + t_pending_property *entry = NULL; + for (int i = 0; i < p->pending_count; i++) + { + if (strcmp(p->pending[i].method, method) == 0) + { + entry = &p->pending[i]; + break; + } + } + + if (!entry) + { + if (p->pending_count >= MAX_PENDING_PROPERTIES) + { + pd_error(o, "[pdlua] too many pending properties"); + return; + } + entry = &p->pending[p->pending_count++]; + } + + snprintf(entry->guitype, MAXPDSTRING, "%s", guitype); + snprintf(entry->method, MAXPDSTRING, "%s", method); + entry->argc = 0; + + for (int i = 2; i < argc && (i - 2) < MAX_PROPERTY_ARGS; i++) + { + entry->argv[entry->argc++] = argv[i]; + } } + +#endif + + From 936c3defff7f8b7332a5325a22e399fd1de05c15 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 20:31:46 +0100 Subject: [PATCH 058/109] Follow pd's UX guidelines for properties panels more closely: different apply/return behaviour for macOS and Windows/Linux --- pdlua_properties.h | 60 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index 0c53840..b941020 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -401,35 +401,64 @@ static void pdlua_properties(t_gobj *z, t_glist *UNUSED(owner)) { char destroyCommand[MAXPDSTRING]; snprintf(destroyCommand, MAXPDSTRING, "destroy .%p", (void *)p); - // Criando o frame dos botões pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); - - char applyCommand[MAXPDSTRING]; - snprintf(applyCommand, MAXPDSTRING, - "pdsend \"%s _properties apply\"", - p->properties_receiver->s_name); +#if __APPLE__ + const char* okButtonState = "normal"; +#else + const char* okButtonState = "active"; +#endif char okCommand[MAXPDSTRING * 2]; snprintf(okCommand, MAXPDSTRING * 2, "pdsend \"%s _properties apply\"; destroy .%p", p->properties_receiver->s_name, (void *)p); + pdgui_vmess(0, "ssssssss", "button", buttonOkId, + "-text", "OK", "-command", okCommand, "-default", okButtonState); + +#if __APPLE__ + char returnbind[MAXPDSTRING * 4]; + snprintf(returnbind, MAXPDSTRING * 4, + "bind %s {" + " catch {" + " if {[focus] eq \"%s\"} {%s} " + " else {" + " pdsend \"%s _properties apply\";" + " %s configure -default active;" + " focus %s" + " }" + " };" + " break" + "}", + p->properties_receiver->s_name, + buttonOkId, okCommand, + p->properties_receiver->s_name, + buttonOkId, + buttonOkId); + pdgui_vmess(0, "r", returnbind); +#else + char returnbind[MAXPDSTRING * 2]; + snprintf(returnbind, MAXPDSTRING * 2, + "bind %s {catch {pdsend \"%s _properties apply\"; destroy .%p}; break}", + p->properties_receiver->s_name, + p->properties_receiver->s_name, + (void *)p); + pdgui_vmess(0, "r", returnbind); +#endif pdgui_vmess(0, "ssssss", "button", buttonCancelId, "-text", "Cancel", "-command", destroyCommand); pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); - - pdgui_vmess(0, "ssssss", "button", buttonApplyId, - "-text", "Apply", "-command", applyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, - "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); - - pdgui_vmess(0, "ssssss", "button", buttonOkId, - "-text", "OK", "-command", okCommand); pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); + + char okReturnBind[MAXPDSTRING * 2]; + snprintf(okReturnBind, MAXPDSTRING * 2, + "bind %s {%s}", + buttonOkId, okCommand); + pdgui_vmess(0, "r", okReturnBind); #else t_symbol *gfx_tag = gfxstub_new2(&pdlua->pd.te_g.g_pd, x); @@ -669,6 +698,9 @@ static int pdlua_properties_addcolor(lua_State *L) { " $widget configure -background $c\n" "\n" " pdsend [concat $receiver _properties colorpicker $method $c]\n" +#if __APPLE__ + " pdsend [concat $receiver _properties apply]\n" +#endif " }\n" "}\n"); From 519e55bee1b60e7f1bf1672adab235d447069d89 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 17 Mar 2026 21:12:17 +0100 Subject: [PATCH 059/109] Fix properties layout on Windows, fix compilation --- pdlua_properties.h | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index b941020..8a163b9 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -49,6 +49,9 @@ static void pdlua_properties_setup(lua_State* L) } #ifdef PLUGDATA +#ifdef _MSC_VER +#define alloca _alloca +#endif static inline void plugdata_add_property(lua_State* L, const char* sym, const char *fmt, ...) { @@ -417,6 +420,11 @@ static void pdlua_properties(t_gobj *z, t_glist *UNUSED(owner)) { pdgui_vmess(0, "ssssssss", "button", buttonOkId, "-text", "OK", "-command", okCommand, "-default", okButtonState); + pdgui_vmess(0, "ssssss", "button", buttonCancelId, + "-text", "Cancel", "-command", destroyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, + "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); + #if __APPLE__ char returnbind[MAXPDSTRING * 4]; snprintf(returnbind, MAXPDSTRING * 4, @@ -445,12 +453,17 @@ static void pdlua_properties(t_gobj *z, t_glist *UNUSED(owner)) { p->properties_receiver->s_name, (void *)p); pdgui_vmess(0, "r", returnbind); -#endif - pdgui_vmess(0, "ssssss", "button", buttonCancelId, - "-text", "Cancel", "-command", destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, + char applyCommand[MAXPDSTRING]; + snprintf(applyCommand, MAXPDSTRING, + "pdsend \"%s _properties apply\"", + p->properties_receiver->s_name); + pdgui_vmess(0, "ssssss", "button", buttonApplyId, + "-text", "Apply", "-command", applyCommand); + pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); +#endif + pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); From bd5a80e9a4e99c850490b5732485a37e11cd22ca Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 15:43:04 +0100 Subject: [PATCH 060/109] Build both luajit and lua into one external --- .github/workflows/makefile.yml | 1 + .gitmodules | 10 +- Makefile | 38 +++- Makefile.pdlibbuilder | 1 - lua | 1 - luas/lua | 1 + luas/lua-compat-5.3 | 1 + luas/lua.c | 172 ++++++++++++++++++ luas/luajit | 1 + luas/luajit.c | 66 +++++++ onelua_multi.c | 8 - pd.lua | 1 - pdlua.c | 240 ++++++++++++++------------ pdlua.h | 8 +- pdlua/hello-gui.pd_lua | 202 ---------------------- pdlua/tutorial/examples/properties.pd | 2 + pdlua/tutorial/examples/props.pd_lua | 100 ----------- pdlua_gfx.h | 21 ++- pdlua_properties.h | 10 +- svg/nanosvg.h | 23 ++- svg/nanosvgrast.h | 12 +- 21 files changed, 454 insertions(+), 465 deletions(-) delete mode 160000 lua create mode 160000 luas/lua create mode 160000 luas/lua-compat-5.3 create mode 100644 luas/lua.c create mode 160000 luas/luajit create mode 100644 luas/luajit.c delete mode 100644 onelua_multi.c delete mode 100644 pdlua/hello-gui.pd_lua delete mode 100644 pdlua/tutorial/examples/props.pd_lua diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 73a0347..9efaef0 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -6,6 +6,7 @@ on: tags: [ '*' ] pull_request: branches: [ master ] + workflow_dispatch: jobs: ubuntu-build: diff --git a/.gitmodules b/.gitmodules index 1cb6bef..44790c9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,9 @@ -[submodule "lua"] - path = lua +[submodule "luas/lua-compat-5.3"] + path = luas/lua-compat-5.3 + url = https://github.com/lunarmodules/lua-compat-5.3.git +[submodule "luas/luajit"] + path = luas/luajit + url = https://github.com/LuaJIT/LuaJIT +[submodule "luas/lua"] + path = luas/lua url = https://github.com/lua/lua.git diff --git a/Makefile b/Makefile index 3b199a1..28ee614 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ lib.name = pdlua pdlua_version := $(shell git describe --tags 2>/dev/null) -luasrc = $(wildcard lua/onelua.c) +luasrc = $(wildcard luas/lua/onelua.c) PKG_CONFIG ?= pkg-config @@ -27,7 +27,7 @@ lualibs = $(shell $(PKG_CONFIG) --libs lua) else # compile with Lua submodule $(info ++++ NOTE: using lua submodule) -luaflags = -DMAKE_LIB -Ilua +luaflags = -DMAKE_LIB -Iluas/luajit/src define forDarwin luaflags += -DLUA_USE_MACOSX endef @@ -39,13 +39,16 @@ luaflags += -DLUA_USE_WINDOWS endef endif -cflags = ${luaflags} -DPDLUA_VERSION="$(pdlua_version)" +luajit_dir = ./luas/luajit +luajit_lib = $(luajit_dir)/src/libluajit.a + +cflags = $(luaflags) -DPDLUA_VERSION="$(pdlua_version)" ifdef PD_MULTICHANNEL cflags += -DPD_MULTICHANNEL=$(PD_MULTICHANNEL) endif -pdlua.class.sources := pdlua.c $(luasrc) -pdlua.class.ldlibs := $(lualibs) +pdlua.class.sources := luas/lua.c luas/luajit.c +pdlua.class.ldlibs := $(lualibs) $(luajit_lib) datafiles = \ pd.lua $(wildcard pdlua*-help.pd) \ @@ -56,6 +59,29 @@ datafiles = \ # so we need to list all of them datadirs = $(shell find pdlua -type d) - PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder + +compat53_headers = \ + luas/lua-compat-5.3/compat53/compat53_init.h \ + luas/lua-compat-5.3/compat53/compat53_module.h \ + luas/lua-compat-5.3/compat53/compat53_file_mt.h + +$(luajit_lib): +ifeq ($(system), Windows) + $(MAKE) -C $(luajit_dir) SHELL=cmd + mv $(luajit_dir)/src/libluajit-5.1.dll.a $(luajit_lib) +else + $(MAKE) -C $(luajit_dir) CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.11 +endif + +# Generate binary data headers for compat53 lua files, so we can load them on init +luas/lua-compat-5.3/compat53/compat53_init.h: luas/lua-compat-5.3/compat53/init.lua + xxd -i $< > $@ +luas/lua-compat-5.3/compat53/compat53_module.h: luas/lua-compat-5.3/compat53/module.lua + xxd -i $< > $@ +luas/lua-compat-5.3/compat53/compat53_file_mt.h: luas/lua-compat-5.3/compat53/file_mt.lua + xxd -i $< > $@ +luas/luajit.$(extension).o: $(compat53_headers) + +pdlua.$(extension): $(luajit_lib) diff --git a/Makefile.pdlibbuilder b/Makefile.pdlibbuilder index 38a1220..a619e8b 100644 --- a/Makefile.pdlibbuilder +++ b/Makefile.pdlibbuilder @@ -1362,4 +1362,3 @@ coffee: # for syntax highlighting in vim and github # vim: set filetype=make: - diff --git a/lua b/lua deleted file mode 160000 index 1ab3208..0000000 --- a/lua +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1ab3208a1fceb12fca8f24ba57d6e13c5bff15e3 diff --git a/luas/lua b/luas/lua new file mode 160000 index 0000000..934fdd4 --- /dev/null +++ b/luas/lua @@ -0,0 +1 @@ +Subproject commit 934fdd481ced3a9d4a7aaace4479ce889ab23582 diff --git a/luas/lua-compat-5.3 b/luas/lua-compat-5.3 new file mode 160000 index 0000000..9c6f75a --- /dev/null +++ b/luas/lua-compat-5.3 @@ -0,0 +1 @@ +Subproject commit 9c6f75a88db1462ff655dc006588b25d3bc2a5be diff --git a/luas/lua.c b/luas/lua.c new file mode 100644 index 0000000..e2f367b --- /dev/null +++ b/luas/lua.c @@ -0,0 +1,172 @@ +#define luaL_addgsub lua54_luaL_addgsub +#define luaL_addlstring lua54_luaL_addlstring +#define luaL_addstring lua54_luaL_addstring +#define luaL_addvalue lua54_luaL_addvalue +#define luaL_argerror lua54_luaL_argerror +#define luaL_buffinit lua54_luaL_buffinit +#define luaL_buffinitsize lua54_luaL_buffinitsize +#define luaL_callmeta lua54_luaL_callmeta +#define luaL_checkany lua54_luaL_checkany +#define luaL_checkinteger lua54_luaL_checkinteger +#define luaL_checklstring lua54_luaL_checklstring +#define luaL_checknumber lua54_luaL_checknumber +#define luaL_checkoption lua54_luaL_checkoption +#define luaL_checkstack lua54_luaL_checkstack +#define luaL_checktype lua54_luaL_checktype +#define luaL_checkudata lua54_luaL_checkudata +#define luaL_checkversion_ lua54_luaL_checkversion_ +#define luaL_error lua54_luaL_error +#define luaL_execresult lua54_luaL_execresult +#define luaL_fileresult lua54_luaL_fileresult +#define luaL_getmetafield lua54_luaL_getmetafield +#define luaL_getsubtable lua54_luaL_getsubtable +#define luaL_gsub lua54_luaL_gsub +#define luaL_len lua54_luaL_len +#define luaL_loadbufferx lua54_luaL_loadbufferx +#define luaL_loadfilex lua54_luaL_loadfilex +#define luaL_loadstring lua54_luaL_loadstring +#define luaL_newmetatable lua54_luaL_newmetatable +#define luaL_newstate lua54_luaL_newstate +#define luaL_openselectedlibs lua54_openselectedlibs +#define luaL_optinteger lua54_luaL_optinteger +#define luaL_optlstring lua54_luaL_optlstring +#define luaL_optnumber lua54_luaL_optnumber +#define luaL_prepbuffsize lua54_luaL_prepbuffsize +#define luaL_pushresult lua54_luaL_pushresult +#define luaL_pushresultsize lua54_luaL_pushresultsize +#define luaL_ref lua54_luaL_ref +#define luaL_requiref lua54_luaL_requiref +#define luaL_setfuncs lua54_luaL_setfuncs +#define luaL_setmetatable lua54_luaL_setmetatable +#define luaL_testudata lua54_luaL_testudata +#define luaL_tolstring lua54_luaL_tolstring +#define luaL_traceback lua54_luaL_traceback +#define luaL_typeerror lua54_luaL_typeerror +#define luaL_unref lua54_luaL_unref +#define luaL_where lua54_luaL_where +#define luaL_openlibs lua54_luaL_openlibs +#define lua_absindex lua54_lua_absindex +#define lua_arith lua54_lua_arith +#define lua_atpanic lua54_lua_atpanic +#define lua_callk lua54_lua_callk +#define lua_checkstack lua54_lua_checkstack +#define lua_close lua54_lua_close +#define lua_closeslot lua54_lua_closeslot +#define lua_closethread lua54_lua_closethread +#define lua_compare lua54_lua_compare +#define lua_concat lua54_lua_concat +#define lua_copy lua54_lua_copy +#define lua_createtable lua54_lua_createtable +#define lua_dump lua54_lua_dump +#define lua_error lua54_lua_error +#define lua_gc lua54_lua_gc +#define lua_getallocf lua54_lua_getallocf +#define lua_getfield lua54_lua_getfield +#define lua_getglobal lua54_lua_getglobal +#define lua_gethook lua54_lua_gethook +#define lua_gethookcount lua54_lua_gethookcount +#define lua_gethookmask lua54_lua_gethookmask +#define lua_geti lua54_lua_geti +#define lua_getinfo lua54_lua_getinfo +#define lua_getiuservalue lua54_lua_getiuservalue +#define lua_getlocal lua54_lua_getlocal +#define lua_getmetatable lua54_lua_getmetatable +#define lua_getstack lua54_lua_getstack +#define lua_gettable lua54_lua_gettable +#define lua_gettop lua54_lua_gettop +#define lua_getupvalue lua54_lua_getupvalue +#define lua_iscfunction lua54_lua_iscfunction +#define lua_isinteger lua54_lua_isinteger +#define lua_isnumber lua54_lua_isnumber +#define lua_isstring lua54_lua_isstring +#define lua_isuserdata lua54_lua_isuserdata +#define lua_isyieldable lua54_lua_isyieldable +#define lua_len lua54_lua_len +#define lua_load lua54_lua_load +#define lua_newstate lua54_lua_newstate +#define lua_newthread lua54_lua_newthread +#define lua_newuserdatauv lua54_lua_newuserdatauv +#define lua_next lua54_lua_next +#define lua_pcallk lua54_lua_pcallk +#define lua_pushboolean lua54_lua_pushboolean +#define lua_pushcclosure lua54_lua_pushcclosure +#define lua_pushfstring lua54_lua_pushfstring +#define lua_pushinteger lua54_lua_pushinteger +#define lua_pushlightuserdata lua54_lua_pushlightuserdata +#define lua_pushlstring lua54_lua_pushlstring +#define lua_pushnil lua54_lua_pushnil +#define lua_pushnumber lua54_lua_pushnumber +#define lua_pushstring lua54_lua_pushstring +#define lua_pushthread lua54_lua_pushthread +#define lua_pushvalue lua54_lua_pushvalue +#define lua_pushvfstring lua54_lua_pushvfstring +#define lua_rawequal lua54_lua_rawequal +#define lua_rawget lua54_lua_rawget +#define lua_rawgeti lua54_lua_rawgeti +#define lua_rawgetp lua54_lua_rawgetp +#define lua_rawlen lua54_lua_rawlen +#define lua_rawset lua54_lua_rawset +#define lua_rawseti lua54_lua_rawseti +#define lua_rawsetp lua54_lua_rawsetp +#define lua_resume lua54_lua_resume +#define lua_rotate lua54_lua_rotate +#define lua_setallocf lua54_lua_setallocf +#define lua_setcstacklimit lua54_lua_setcstacklimit +#define lua_setfield lua54_lua_setfield +#define lua_setglobal lua54_lua_setglobal +#define lua_sethook lua54_lua_sethook +#define lua_seti lua54_lua_seti +#define lua_setiuservalue lua54_lua_setiuservalue +#define lua_setlocal lua54_lua_setlocal +#define lua_setmetatable lua54_lua_setmetatable +#define lua_settable lua54_lua_settable +#define lua_settop lua54_lua_settop +#define lua_setupvalue lua54_lua_setupvalue +#define lua_setwarnf lua54_lua_setwarnf +#define lua_status lua54_lua_status +#define lua_stringtonumber lua54_lua_stringtonumber +#define lua_toboolean lua54_lua_toboolean +#define lua_tocfunction lua54_lua_tocfunction +#define lua_toclose lua54_lua_toclose +#define lua_tointegerx lua54_lua_tointegerx +#define lua_tolstring lua54_lua_tolstring +#define lua_tonumberx lua54_lua_tonumberx +#define lua_topointer lua54_lua_topointer +#define lua_tothread lua54_lua_tothread +#define lua_touserdata lua54_lua_touserdata +#define lua_type lua54_lua_type +#define lua_typename lua54_lua_typename +#define lua_upvalueid lua54_lua_upvalueid +#define lua_upvaluejoin lua54_lua_upvaluejoin +#define lua_version lua54_lua_version +#define lua_warning lua54_lua_warning +#define lua_xmove lua54_lua_xmove +#define lua_yieldk lua54_lua_yieldk +#define luaopen_base lua54_luaopen_base +#define luaopen_coroutine lua54_luaopen_coroutine +#define luaopen_debug lua54_luaopen_debug +#define luaopen_io lua54_luaopen_io +#define luaopen_math lua54_luaopen_math +#define luaopen_os lua54_luaopen_os +#define luaopen_package lua54_luaopen_package +#define luaopen_string lua54_luaopen_string +#define luaopen_table lua54_luaopen_table +#define luaopen_utf8 lua54_luaopen_utf8 +#define l_likely(x) luai_likely(x) +#define l_unlikely(x) luai_unlikely(x) + +#ifdef PDINSTANCE +#include +pthread_mutex_t lua_global_lock = PTHREAD_MUTEX_INITIALIZER; +#define lua_lock(L) pthread_mutex_lock(&lua_global_lock) +#define lua_unlock(L) pthread_mutex_unlock(&lua_global_lock) +#endif + +#include "lua/lua.h" +#include "lua/lauxlib.h" +#include "lua/lualib.h" + +#define LUA_FILE_EXTENSION ".pd_lua" + +#include "../pdlua.c" +#include "lua/onelua.c" diff --git a/luas/luajit b/luas/luajit new file mode 160000 index 0000000..659a616 --- /dev/null +++ b/luas/luajit @@ -0,0 +1 @@ +Subproject commit 659a61693aa3b87661864ad0f12eee14c865cd7f diff --git a/luas/luajit.c b/luas/luajit.c new file mode 100644 index 0000000..726349f --- /dev/null +++ b/luas/luajit.c @@ -0,0 +1,66 @@ +#define LUA_USE_JIT 1 + +#include "luajit/src/lua.h" +#include "luajit/src/lauxlib.h" +#include "luajit/src/lualib.h" + +// Include 5.3 C-API compatibility layer +#include "lua-compat-5.3/c-api/compat-5.3.h" + +// Include 5.3 lua compatibility layer +#include "lua-compat-5.3/compat53/compat53_init.h" +#include "lua-compat-5.3/compat53/compat53_module.h" +#include "lua-compat-5.3/compat53/compat53_file_mt.h" + +static void preload_compat53(lua_State *L) { + lua_getglobal(L, "package"); + lua_getfield(L, -1, "preload"); + + luaL_loadbuffer(L, (const char*)luas_lua_compat_5_3_compat53_init_lua, + luas_lua_compat_5_3_compat53_init_lua_len, "compat53"); + lua_setfield(L, -2, "compat53"); + + luaL_loadbuffer(L, (const char*)luas_lua_compat_5_3_compat53_module_lua, + luas_lua_compat_5_3_compat53_module_lua_len, "compat53.module"); + lua_setfield(L, -2, "compat53.module"); + + luaL_loadbuffer(L, (const char*)luas_lua_compat_5_3_compat53_file_mt_lua, + luas_lua_compat_5_3_compat53_file_mt_lua_len, "compat53.file_mt"); + lua_setfield(L, -2, "compat53.file_mt"); + + lua_pop(L, 2); + + lua_getglobal(L, "require"); + lua_pushstring(L, "compat53"); + lua_call(L, 1, 0); +} + +#ifdef PDINSTANCE +#include +pthread_mutex_t lua_global_lock = PTHREAD_MUTEX_INITIALIZER; +#define lua_lock(L) pthread_mutex_lock(&lua_global_lock) +#define lua_unlock(L) pthread_mutex_unlock(&lua_global_lock) +#endif + +#define LUA_FILE_EXTENSION ".pd_luajit" +#define LUA_USE_JIT 1 + +#undef lua_load +#undef lua_gc +#define lua_gc(L, what) lua_gc(L, what, 0) + +#define pdlua_gfx_free pdluajit_gfx_free +#define pdlua_gfx_mouse_down pdluajit_gfx_mouse_down +#define pdlua_gfx_mouse_drag pdluajit_gfx_mouse_drag +#define pdlua_gfx_mouse_enter pdluajit_gfx_mouse_enter +#define pdlua_gfx_mouse_event pdluajit_gfx_mouse_event +#define pdlua_gfx_mouse_exit pdluajit_gfx_mouse_exit +#define pdlua_gfx_mouse_move pdluajit_gfx_mouse_move +#define pdlua_gfx_mouse_up pdluajit_gfx_mouse_up +#define pdlua_gfx_repaint pdluajit_gfx_repaint +#define pdlua_gfx_setup pdluajit_gfx_setup +#define pdlua_instance_setup pdluajit_instance_setup +#define pdlua_setup pdluajit_setup +#define pdlua_datadir pdluajit_datadir + +#include "../pdlua.c" diff --git a/onelua_multi.c b/onelua_multi.c deleted file mode 100644 index a87bd6c..0000000 --- a/onelua_multi.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -pthread_mutex_t lua_global_lock = PTHREAD_MUTEX_INITIALIZER; - -#define lua_lock(L) pthread_mutex_lock(&lua_global_lock) -#define lua_unlock(L) pthread_mutex_unlock(&lua_global_lock) - -#include "lua/onelua.c" diff --git a/pd.lua b/pd.lua index fa6cdaa..41e3b42 100644 --- a/pd.lua +++ b/pd.lua @@ -607,7 +607,6 @@ function lua:in_1_load(atoms) -- execute a script self:dofile(atoms[1]) end - local luax = pd.Class:new():register("pdluax") -- classless lua externals (like [pdluax foo]) function luax:initialize(sel, atoms) -- motivation: pd-list 2007-09-23 diff --git a/pdlua.c b/pdlua.c index 37acdc8..1ae420a 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1,6 +1,6 @@ /* This is a version hacked by Martin Peach 20110120 martin.peach@sympatico.ca */ /* Reformmatted the code and added some debug messages. Changed the name of the class to pdlua */ -/** @file lua.c +/** @file lua.c * @brief pdlua -- a Lua embedding for Pd. * @author Claude Heiland-Allen * @date 2008 @@ -22,7 +22,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - */ + */ /* various C stuff, mainly for reading files */ #include @@ -46,11 +46,6 @@ #include // for open #include #endif -/* we use Lua */ -#include -#include -#include - #include "pdlua.h" #include "s_stuff.h" // for sys_register_loader() @@ -96,13 +91,13 @@ # define CLASS_MULTICHANNEL 0 #endif -#ifdef UNUSED +#ifdef IGNORE_UNUSED #elif defined(__GNUC__) -# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) +# define IGNORE_UNUSED(x) UNUSED_ ## x __attribute__((unused)) #elif defined(__LCLINT__) -# define UNUSED(x) /*@unused@*/ x +# define IGNORE_UNUSED(x) /*@unused@*/ x #else -# define UNUSED(x) x +# define IGNORE_UNUSED(x) x #endif /* BAD: end of bad section */ @@ -122,7 +117,7 @@ #include "pdlua_gfx.h" #include "pdlua_properties.h" -typedef void (*t_signal_setmultiout)(t_signal **, int); +typedef void (*t_signal_setmultiout)(t_signal **, int); static t_signal_setmultiout g_signal_setmultiout; // Check for absolute filenames in the second argument. Otherwise, @@ -139,7 +134,7 @@ typedef struct _lua_Instance { lua_Instance* lua_threads = NULL; -lua_State* __L() +static lua_State* __L() { lua_Instance* iter = lua_threads; while(iter) @@ -154,7 +149,7 @@ lua_State* __L() return NULL; // should never happen } -void initialise_lua_state() +static void initialize_lua_state() { if(!lua_threads) { @@ -164,20 +159,20 @@ void initialise_lua_state() lua_threads->next = NULL; return; } - + lua_Instance* iter = lua_threads; while(iter->next) { iter = iter->next; } - + lua_checkstack(lua_threads->state, 1); - + iter->next = t_getbytes(sizeof(lua_Instance)); iter->next->pd_instance = pd_this; iter->next->state = lua_newthread(lua_threads->state); iter->next->next = NULL; - + // TODO: lua state will leak, we should clean it up somewhere //axluaL_ref(lua_threads->state, LUA_REGISTRYINDEX); } @@ -186,12 +181,12 @@ void initialise_lua_state() static lua_State* __lua_state = NULL; -lua_State* __L() +static lua_State* __L() { return __lua_state; } -void initialise_lua_state() +static void initialize_lua_state() { if (!__lua_state) { __lua_state = luaL_newstate(); @@ -201,7 +196,7 @@ void initialise_lua_state() #endif // class_new class names need to use gensym of the global pure-data instance -t_symbol* global_gensym(const char* s) +static t_symbol* global_gensym(const char* s) { #ifdef PDINSTANCE t_pdinstance* last_instance = pd_get_instance(); @@ -368,7 +363,7 @@ static int pdlua_loader_legacy (t_canvas *canvas, char *name, char *path); /** Start the Lua runtime and register our loader hook. */ #ifdef _WIN32 __declspec(dllexport) -#endif +#endif #ifdef PLUGDATA void pdlua_setup(const char *datadir, char *versbuf, int versbuf_length, void(*register_class_callback)(const char*)); #else @@ -393,7 +388,7 @@ static t_class *pdlua_proxycanvas_class; /** Lua file reader callback. */ static const char *pdlua_reader ( - lua_State *UNUSED(L), /**< Lua interpreter state. */ + lua_State *IGNORE_UNUSED(L), /**< Lua interpreter state. */ void *rr, /**< Lua file reader state. */ size_t *size /**< How much data we have read. */ ) @@ -421,21 +416,21 @@ static void pdlua_proxycanvas_anything(t_pdlua_proxycanvas *p, t_symbol *s, int if (!p->p_parent) return; if (s != gensym("motion")) return; if (argc != 3) return; - + t_pdlua *x = p->p_parent; if (!x->has_gui || x->gfx.mouse_down) return; - + float new_x = atom_getfloat(argv); float new_y = atom_getfloat(argv + 1); - + int zoom = glist_getzoom(x->canvas); int obj_x = text_xpix(&x->pd, x->canvas); int obj_y = text_ypix(&x->pd, x->canvas); - + int xpos = (new_x - obj_x) / zoom; int ypos = (new_y - obj_y) / zoom; - - int inside = (xpos >= 0 && xpos < x->gfx.width && + + int inside = (xpos >= 0 && xpos < x->gfx.width && ypos >= 0 && ypos < x->gfx.height); // Handle state changes first @@ -446,12 +441,12 @@ static void pdlua_proxycanvas_anything(t_pdlua_proxycanvas *p, t_symbol *s, int pdlua_gfx_mouse_enter(x, xpos, ypos); x->gfx.mouse_inside = 1; } - + // Only then send move event if we're inside if (inside) { pdlua_gfx_mouse_move(x, xpos, ypos); } - + x->gfx.mouse_x = new_x; x->gfx.mouse_y = new_y; #endif @@ -459,17 +454,17 @@ static void pdlua_proxycanvas_anything(t_pdlua_proxycanvas *p, t_symbol *s, int static t_pdlua_proxycanvas *pdlua_proxycanvas_new(struct pdlua *owner, t_symbol *s) { if (!owner || !s || s == &s_) return NULL; - + t_pdlua_proxycanvas *p = (t_pdlua_proxycanvas *)pd_new(pdlua_proxycanvas_class); if (!p) return NULL; - + memset(p, 0, sizeof(t_pdlua_proxycanvas)); p->pd = pdlua_proxycanvas_class; p->p_sym = s; p->p_parent = owner; p->p_clock = clock_new(p, (t_method)pdlua_proxycanvas_free); pd_bind(&p->pd, p->p_sym); - + return p; } @@ -494,7 +489,7 @@ static void pdlua_proxyinlet_anything static void pdlua_proxyinlet_fwd ( t_pdlua_proxyinlet *p, /**< The proxy inlet that received the message. */ - t_symbol *UNUSED(s), /**< The message selector, which is always "fwd" */ + t_symbol *IGNORE_UNUSED(s), /**< The message selector, which is always "fwd" */ int argc, /**< The message length. */ t_atom *argv /**< The atoms in the message. The first atom is the actual selector */ ) @@ -602,9 +597,9 @@ static void pdlua_proxycanvas_setup(void) pdlua_proxycanvas_class = class_new( gensym("pdlua proxy canvas"), 0, (t_method)pdlua_proxycanvas_free, - sizeof(t_pdlua_proxycanvas), + sizeof(t_pdlua_proxycanvas), CLASS_NOINLET | CLASS_PD, - 0); + 0); if (pdlua_proxycanvas_class) class_addanything(pdlua_proxycanvas_class, (t_method)pdlua_proxycanvas_anything); #else @@ -739,7 +734,7 @@ static t_pdlua *pdlua_new return NULL; } } - + PDLUA_DEBUG("pdlua_new: start with stack top %d", lua_gettop(__L())); lua_getglobal(__L(), "pd"); lua_getfield(__L(), -1, "_checkbase"); @@ -758,7 +753,7 @@ static t_pdlua *pdlua_new { PDLUA_DEBUG("basename open: stack top %d", lua_gettop(__L())); /* save old loadname, restore later in case of - * nested loading */ + * nested loading */ int n, load_name_save, load_path_save; lua_getfield(__L(), -1, "_loadname"); load_name_save = luaL_ref(__L(), LUA_REGISTRYINDEX); @@ -770,7 +765,7 @@ static t_pdlua *pdlua_new lua_setfield(__L(), -2, "_loadpath"); PDLUA_DEBUG("pdlua_new (basename load) path is %s", buf); - //pdlua_setpathname(o, buf);/* change the scriptname to include its path + //pdlua_setpathname(o, buf);/* change the scriptname to include its path pdlua_setrequirepath(__L(), buf); class_set_extern_dir(global_gensym(buf)); strncpy(buf, s->s_name, MAXPDSTRING - 8); @@ -813,7 +808,7 @@ static t_pdlua *pdlua_new } else pd_error(NULL, "lua: constructor: couldn't locate `%s'", buf); } - + PDLUA_DEBUG("pdlua_new: after load script. stack top %d", lua_gettop(__L())); lua_getfield(__L(), -1, "_constructor"); lua_pushstring(__L(), s->s_name); @@ -873,15 +868,15 @@ static void pdlua_free( t_pdlua *o /**< The object to destruct. */) } lua_pop(__L(), 1); /* pop the global "pd" */ PDLUA_DEBUG("pdlua_free: end. stack top %d", lua_gettop(__L())); - + // Collect garbage // If we don't do this here, it could potentially leak if no other pdlua objects are used afterwards lua_gc(__L(), LUA_GCCOLLECT); - + return; } -void pdlua_vis(t_gobj *z, t_glist *glist, int vis){ +static void pdlua_vis(t_gobj *z, t_glist *glist, int vis){ t_pdlua* x = (t_pdlua *)z; // If there's no gui, use default text vis behavior if(!x->has_gui) @@ -910,9 +905,9 @@ static void pdlua_delete(t_gobj *z, t_glist *glist) { if(glist_isvisible(glist) && gobj_shouldvis(z, glist)) { pdlua_vis(z, glist, 0); } - + canvas_deletelinesfor(glist, (t_text *)z); - + #if !PLUGDATA if (x->gfx.proxycanvas) { // Schedule deferred cleanup (similar to receivecanvas external code) @@ -942,7 +937,7 @@ static void pdlua_motion(t_gobj *z, t_floatarg dx, t_floatarg dy, x->gfx.mouse_down = 0; // After mouse up, check if we need to send exit - int inside = (xpos >= 0 && xpos < x->gfx.width && + int inside = (xpos >= 0 && xpos < x->gfx.width && ypos >= 0 && ypos < x->gfx.height); if (!inside && x->gfx.mouse_inside) { pdlua_gfx_mouse_exit(x, xpos, ypos); @@ -953,7 +948,7 @@ static void pdlua_motion(t_gobj *z, t_floatarg dx, t_floatarg dy, #endif x->gfx.mouse_x += dx; - x->gfx.mouse_y += dy; + x->gfx.mouse_y += dy; int zoom = glist_getzoom(glist_getcanvas(x->canvas)); int xpos = (x->gfx.mouse_x - text_xpix(&x->pd, x->canvas)) / zoom; int ypos = (x->gfx.mouse_y - text_ypix(&x->pd, x->canvas)) / zoom; @@ -967,7 +962,7 @@ static int pdlua_click(t_gobj *z, t_glist *gl, int xpos, int ypos, int shift, in if(x->has_gui) { int zoom = glist_getzoom(gl); - int xpix = (xpos - text_xpix(&x->pd, gl)) / zoom; + int xpix = (xpos - text_xpix(&x->pd, gl)) / zoom; int ypix = (ypos - text_ypix(&x->pd, gl)) / zoom; if (doit) { @@ -1010,7 +1005,7 @@ static void pdlua_displace(t_gobj *z, t_glist *glist, int dx, int dy){ text_widgetbehavior.w_displacefn(z, glist, dx, dy); } - + canvas_fixlinesfor(glist, (t_text*)x); } @@ -1191,7 +1186,7 @@ static void pdlua_menu_open(t_pdlua *o) } //post("path = %s, name = %s, pathname = %s", path, name, pathname); lua_pop(__L(), 2); /* pop name, global "pd"*/ - + #if PD_MAJOR_VERSION==0 && PD_MINOR_VERSION<43 post("Opening %s for editing", pathname); #else @@ -1222,14 +1217,14 @@ static t_int *pdlua_perform(t_int *w){ lua_getglobal(__L(), "pd"); lua_getfield (__L(), -1, "_perform_dsp"); lua_pushlightuserdata(__L(), o); - + for (int i = 0; i < o->siginlets; i++) { lua_newtable(__L()); t_float *in = sig_vecs[i]; int nchans = o->sig_nchans[i]; int s_n_allchans = blocksize * nchans; - + for (int j = 0; j < s_n_allchans; j++) { lua_pushinteger(__L(), j + 1); @@ -1237,14 +1232,14 @@ static t_int *pdlua_perform(t_int *w){ lua_settable(__L(), -3); } } - + if (lua_pcall(__L(), 1 + o->siginlets, o->sigoutlets, 0)) { mylua_error(__L(), o, "perform"); lua_pop(__L(), 1); /* pop the global pd */ return w + o->siginlets + o->sigoutlets + 3; } - + if (!lua_istable(__L(), -1)) { const char *s = "lua: perform: function should return"; @@ -1262,13 +1257,13 @@ static t_int *pdlua_perform(t_int *w){ lua_pop(__L(), 1 + o->sigoutlets); return w + o->siginlets + o->sigoutlets + 3; } - + for (int i = o->sigoutlets - 1; i >= 0; i--) { t_float *out = sig_vecs[o->siginlets + i]; int nchans = o->sig_nchans[o->siginlets + i]; int s_n_allchans = blocksize * nchans; - + for (int j = 0; j < s_n_allchans; j++) { lua_pushinteger(__L(), (lua_Integer)(j + 1)); lua_gettable(__L(), -2); @@ -1284,9 +1279,9 @@ static t_int *pdlua_perform(t_int *w){ } lua_pop(__L(), 1); /* pop the global "pd" */ - + PDLUA_DEBUG("pdlua_perform: end. stack top %d", lua_gettop(__L())); - + return w + o->siginlets + o->sigoutlets + 3; } @@ -1323,22 +1318,22 @@ static void pdlua_dsp(t_pdlua *x, t_signal **sp){ #endif lua_settable(__L(), -3); } - + if (lua_pcall(__L(), 4, 0, 0)) mylua_error(__L(), x, "dsp"); lua_pop(__L(), 1); /* pop the global "pd" */ - + PDLUA_DEBUG("pdlua_dsp: end. stack top %d", lua_gettop(__L())); - + // Allocate memory for sigvec and sig_nchans int sigvecsize = sum + 2; // +1 for x, +1 for blocksize t_int* sigvec = getbytes(sigvecsize * sizeof(t_int)); - x->sig_nchans = (t_int *)resizebytes(x->sig_nchans, + x->sig_nchans = (t_int *)resizebytes(x->sig_nchans, x->sig_count * sizeof(t_int), sum * sizeof(t_int)); x->sig_count = sum; - + sigvec[0] = (t_int)x; sigvec[1] = (t_int)blocksize; @@ -1350,7 +1345,7 @@ static void pdlua_dsp(t_pdlua *x, t_signal **sp){ x->sig_nchans[i] = 1; #endif } - + dsp_addv(pdlua_perform, sigvecsize, sigvec); freebytes(sigvec, sigvecsize * sizeof(t_int)); } @@ -1508,7 +1503,7 @@ static int pdlua_class_new(lua_State *L) // fail silently, return nothing return 0; } - + snprintf(name_gfx, MAXPDSTRING-1, "%s:gfx", name); PDLUA_DEBUG3("pdlua_class_new: L is %p, name is %s stack top is %d", L, name, lua_gettop(L)); #pragma GCC diagnostic push @@ -1605,7 +1600,7 @@ static int pdlua_object_new(lua_State *L) o->gfx.width = 80; o->gfx.height = 80; - + #ifndef PLUGDATA // Init graphics state for pd o->gfx.mouse_x = 0; @@ -1615,7 +1610,7 @@ static int pdlua_object_new(lua_State *L) // NULL until plugdata overrides them with something useful o->gfx.plugdata_draw_callback = NULL; #endif - + lua_pushlightuserdata(L, o); PDLUA_DEBUG("pdlua_object_new: success end. stack top is %d", lua_gettop(L)); return 1; @@ -1790,7 +1785,7 @@ static int pdlua_object_createinlets(lua_State *L) } canvas_resume_dsp(dspstate); } - + } PDLUA_DEBUG("pdlua_object_createinlets: end. stack top is %d", lua_gettop(L)); return 0; @@ -1856,7 +1851,7 @@ static int pdlua_object_createoutlets(lua_State *L) canvas_fixlinesfor(o->canvas, (t_text*)o); } canvas_resume_dsp(dspstate); - + } } PDLUA_DEBUG("pdlua_object_createoutlets: end stack top is %d", lua_gettop(L)); @@ -2067,20 +2062,20 @@ static int pdlua_object_free(lua_State *L) if (lua_islightuserdata(L, 1)) { t_pdlua *o = lua_touserdata(L, 1); - + if (o) { pdlua_gfx_free(&o->gfx); - + if(o->in) { for (i = 0; i < o->inlets; ++i) inlet_free(o->in[i]); free(o->in); o->in = NULL; } - + if (o->proxy_in) free(o->proxy_in); - + if(o->out) { for (i = 0; i < o->outlets; ++i) outlet_free(o->out[i]); @@ -2116,17 +2111,17 @@ static void pdlua_dispatch lua_pushnumber(__L(), inlet + 1); /* C has 0.., Lua has 1.. */ lua_pushstring(__L(), s->s_name); pdlua_pushatomtable(argc, argv); - + if (lua_pcall(__L(), 4, 0, 0)) { mylua_error(__L(), o, "dispatcher"); } lua_pop(__L(), 1); /* pop the global "pd" */ - - - + + + PDLUA_DEBUG("pdlua_dispatch: end. stack top %d", lua_gettop(__L())); - return; + return; } /** Dispatch Pd receive messages to Lua objects. */ @@ -2144,14 +2139,14 @@ static void pdlua_receivedispatch lua_pushlightuserdata(__L(), r); lua_pushstring(__L(), s->s_name); pdlua_pushatomtable(argc, argv); - + if (lua_pcall(__L(), 3, 0, 0)) { mylua_error(__L(), r->owner, "receive dispatcher"); } lua_pop(__L(), 1); /* pop the global "pd" */ PDLUA_DEBUG("pdlua_receivedispatch: end. stack top %d", lua_gettop(__L())); - return; + return; } /** Dispatch Pd clock messages to Lua objects. */ @@ -2169,7 +2164,7 @@ static void pdlua_clockdispatch( t_pdlua_proxyclock *clock) } lua_pop(__L(), 1); /* pop the global "pd" */ PDLUA_DEBUG("pdlua_clockdispatch: end. stack top %d", lua_gettop(__L())); - return; + return; } /** Convert a Lua table into a Pd atom array. */ @@ -2247,7 +2242,7 @@ static t_atom *pdlua_popatomtable ok = 0; } } - else + else { /* ag 20240907: We must not leave *count uninitialized here, and we must actually set it to a nonzero value which indicates an error @@ -2288,7 +2283,7 @@ static int pdlua_outlet(lua_State *L) if (lua_islightuserdata(L, 1)) { o = lua_touserdata(L, 1); - if (o) + if (o) { if (lua_isnumber(L, 2)) out = lua_tonumber(L, 2) - 1; /* C has 0.., Lua has 1.. */ else @@ -2297,9 +2292,9 @@ static int pdlua_outlet(lua_State *L) lua_pop(L, 4); /* pop all the arguments */ return 0; } - if (0 <= out && out < o->outlets) + if (0 <= out && out < o->outlets) { - if (lua_isstring(L, 3)) + if (lua_isstring(L, 3)) { s = lua_tolstring(L, 3, &sl); sym = gensym((char *) s); /* const cast */ @@ -2310,7 +2305,7 @@ static int pdlua_outlet(lua_State *L) atoms = pdlua_popatomtable(L, &count, o); if (count == 0 || atoms) outlet_anything(o->out[out], sym, count, atoms); else pd_error(o, "%s: error: %s atoms table [outlet %d]", src_info(L, msg), lua_isnoneornil(L, 4)?"missing":"invalid", out+1); - if (atoms) + if (atoms) { free(atoms); lua_pop(L, 4); /* pop all the arguments */ @@ -2352,14 +2347,14 @@ static int pdlua_send(lua_State *L) char msg[MAXPDSTRING]; PDLUA_DEBUG("pdlua_send: stack top is %d", lua_gettop(L)); - if (lua_isstring(L, 1)) + if (lua_isstring(L, 1)) { receivename = lua_tolstring(L, 1, &receivenamel); receivesym = gensym((char *) receivename); /* const cast */ - if (receivesym) + if (receivesym) { if (strlen(receivename) != receivenamel) pd_error(NULL, "%s: warning: receive symbol munged (contains \\0 in body) [send %s]", src_info(L, msg), receivename); - if (lua_isstring(L, 2)) + if (lua_isstring(L, 2)) { selname = lua_tolstring(L, 2, &selnamel); selsym = gensym((char *) selname); /* const cast */ @@ -2370,7 +2365,7 @@ static int pdlua_send(lua_State *L) atoms = pdlua_popatomtable(L, &count, NULL); if ((count == 0 || atoms) && (receivesym->s_thing)) typedmess(receivesym->s_thing, selsym, count, atoms); else pd_error(NULL, "%s: error: %s atoms table [send %s]", src_info(L, msg), lua_isnoneornil(L, 3)?"missing":"invalid", receivename); - if (atoms) + if (atoms) { free(atoms); PDLUA_DEBUG("pdlua_send: success end. stack top is %d", lua_gettop(L)); @@ -2444,19 +2439,19 @@ static int pdlua_getarray(lua_State *L) const char *str = luaL_checkstring(L, 1); PDLUA_DEBUG("pdlua_getarray: stack top is %d", lua_gettop(L)); - if (!(a = (t_garray *) pd_findbyclass(gensym(str), garray_class))) + if (!(a = (t_garray *) pd_findbyclass(gensym(str), garray_class))) { lua_pushnumber(L, -1); PDLUA_DEBUG("pdlua_getarray: end 1. stack top is %d", lua_gettop(L)); return 1; } - else if (!PDLUA_ARRAYGRAB(a, &n, &v)) + else if (!PDLUA_ARRAYGRAB(a, &n, &v)) { lua_pushnumber(L, -2); PDLUA_DEBUG("pdlua_getarray: end 2. stack top is %d", lua_gettop(L)); return 1; } - else + else { lua_pushnumber(L, n); lua_pushlightuserdata(L, v); @@ -2481,7 +2476,7 @@ static int pdlua_readarray(lua_State *L) int i = luaL_checknumber(L, 3); PDLUA_DEBUG("pdlua_readarray: stack top is %d", lua_gettop(L)); - if (0 <= i && i < n && v) + if (0 <= i && i < n && v) { lua_pushnumber(L, PDLUA_ARRAYELEM(v, i)); PDLUA_DEBUG("pdlua_readarray: end 1. stack top is %d", lua_gettop(L)); @@ -2717,7 +2712,7 @@ static int pdlua_dofilex(lua_State *L) else pd_error(NULL, "lua: dofilex: wrong type of object"); lua_pushstring(L, buf); /* return the path as well so we can open it later with pdlua_menu_open() */ PDLUA_DEBUG("pdlua_dofilex end. stack top is %d", lua_gettop(L)); - + return lua_gettop(L) - n; } @@ -2788,7 +2783,7 @@ static int pdlua_dofile(lua_State *L) else pd_error(NULL, "lua: dofile: wrong type of object"); lua_pushstring(L, buf); /* return the path as well so we can open it later with pdlua_menu_open() */ PDLUA_DEBUG("pdlua_dofile end. stack top is %d", lua_gettop(L)); - + return lua_gettop(L) - n; } @@ -3077,7 +3072,7 @@ static int pdlua_loader_legacy ( t_canvas *canvas, /**< Pd canvas to use to find the script. */ char *name, /**< The name of the script (without .pd_lua extension). */ - char *UNUSED(path) /**< Path variable for new loader, unused here */ + char *IGNORE_UNUSED(path) /**< Path variable for new loader, unused here */ ) { char dirbuf[MAXPDSTRING]; @@ -3090,7 +3085,7 @@ static int pdlua_loader_legacy static int pdlua_loader_pathwise ( - t_canvas *UNUSED(canvas), /**< Pd canvas to use to find the script. */ + t_canvas *IGNORE_UNUSED(canvas), /**< Pd canvas to use to find the script. */ const char *objectname, /**< The name of the script (without .pd_lua extension). */ const char *path /**< The directory to search for the script */ ) @@ -3111,7 +3106,7 @@ static int pdlua_loader_pathwise /* ag: Try loading /.pd_lua (experimental). sys_trytoopenone will correctly find the file in a subdirectory if a path is given, and it will then return that subdir in dirbuf. */ - if ((fd = trytoopenone(path, objectname, ".pd_lua", + if ((fd = trytoopenone(path, objectname, LUA_FILE_EXTENSION, dirbuf, &ptr, MAXPDSTRING, 1)) >= 0) if(pdlua_loader_wrappath(fd, objectname, dirbuf)) return 1; @@ -3122,7 +3117,7 @@ static int pdlua_loader_pathwise strcat(filename, "/"); strncat(filename, classname, MAXPDSTRING-strlen(filename)); filename[MAXPDSTRING-1] = 0; - if ((fd = trytoopenone(path, filename, ".pd_lua", + if ((fd = trytoopenone(path, filename, LUA_FILE_EXTENSION, dirbuf, &ptr, MAXPDSTRING, 1)) >= 0) if(pdlua_loader_wrappath(fd, objectname, dirbuf)) return 1; @@ -3153,7 +3148,7 @@ __declspec(dllexport) void pdlua_instance_setup() { #if PDINSTANCE - initialise_lua_state(); + initialize_lua_state(); #endif } @@ -3190,17 +3185,24 @@ void pdlua_setup(void) // NOTE: This should be set from the Makefile, otherwise we fall back to: pdlua_version = "0.12.23"; } + +#ifndef LUA_USE_JIT snprintf(pdluaver, MAXPDSTRING-1, "pdlua %s (GPL) 2008 Claude Heiland-Allen, 2014 Martin Peach et al.", pdlua_version); snprintf(compiled, MAXPDSTRING-1, "pdlua: compiled for pd-%d.%d on %s", PD_MAJOR_VERSION, PD_MINOR_VERSION, BUILD_DATE); +#endif lvm = (*luaversion)/100; lvl = (*luaversion) - (100*lvm); +#ifdef LUA_USE_JIT + snprintf(luaversionStr, MAXPDSTRING-1, "Using luajit with lua version %d.%d", lvm, lvl); +#else snprintf(luaversionStr, MAXPDSTRING-1, "Using lua version %d.%d", lvm, lvl); +#endif #if PLUGDATA plugdata_register_class = register_class_callback; - + snprintf(versbuf, versbuf_length-1, #ifdef ELSE "pdlua %s ELSE (lua %d.%d)", @@ -3253,14 +3255,19 @@ void pdlua_setup(void) pd_error(NULL, "lua: (is Pd using a different float size?)"); return; } - - initialise_lua_state(); - + + initialize_lua_state(); + PDLUA_DEBUG("pdlua lua_open done L = %p", __L()); luaL_openlibs(__L()); PDLUA_DEBUG("pdlua luaL_openlibs done", 0); pdlua_init(__L()); PDLUA_DEBUG("pdlua pdlua_init done", 0); + +#if LUA_USE_JIT + preload_compat53(__L()); +#endif + /* "pd.lua" is the Lua part of pdlua, want to keep the C part minimal */ /* canvas_open can't find pd.lua unless we give the path to pd beforehand like pd -path /usr/lib/extra/pdlua */ /* To avoid this we can use c_externdir from m_imp.h, struct _class: t_symbol *c_externdir; */ @@ -3309,7 +3316,7 @@ void pdlua_setup(void) result = lua_pcall(__L(), 0, 0, 0); PDLUA_DEBUG ("pdlua lua_pcall returned %d", result); } - + if (0 != result) { mylua_error(__L(), NULL, NULL); @@ -3350,6 +3357,25 @@ void pdlua_setup(void) post("pdlua: using JavaScript interface (nw.js)"); #endif +#ifndef LUA_USE_JIT +#ifdef PLUGDATA + void pdluajit_setup(const char *datadir, char *versbuf, int versbuf_length, void(*register_class_callback)(const char*)); + pdluajit_setup(datadir, versbuf, versbuf_length, register_class_callback); +#else + void pdluajit_setup(); + pdluajit_setup(); +#endif +#else + lua_getglobal(__L(), "jit"); + lua_getfield(__L(), -1, "on"); + lua_call(__L(), 0, 0); + + lua_getglobal(__L(), "jit"); + lua_getfield(__L(), -1, "opt"); + lua_getfield(__L(), -1, "start"); + lua_pushstring(__L(), "hotloop=1"); + lua_call(__L(), 1, 0); +#endif } /* EOF */ diff --git a/pdlua.h b/pdlua.h index a6771f8..4cdf0c7 100644 --- a/pdlua.h +++ b/pdlua.h @@ -66,7 +66,7 @@ typedef struct _pdlua_gfx // Size variables int width, height; void *object; - + #ifndef PLUGDATA char object_tag[128]; // Tcl/tk tag that is attached to all drawings char order_tag[64]; // Tag for invisible line, used to preserve correct object ordering @@ -77,7 +77,7 @@ typedef struct _pdlua_gfx gfx_transform* transforms; int num_transforms; char current_color[10]; // Keep track of current color - + // Variables to keep track of mouse position, button state and whether the mouse is inside the object int mouse_x, mouse_y, mouse_down, mouse_inside; int first_draw; @@ -94,7 +94,7 @@ typedef struct _pdlua_gfx /** Pd object data. */ -typedef struct pdlua +typedef struct pdlua { t_object pd; // We are a Pd object. int inlets; // Number of inlets. @@ -116,4 +116,4 @@ typedef struct pdlua t_signal **sp; // Array of signal pointers for multichannel audio. } t_pdlua; -lua_State* __L(); +static lua_State* __L(); diff --git a/pdlua/hello-gui.pd_lua b/pdlua/hello-gui.pd_lua deleted file mode 100644 index a6dd973..0000000 --- a/pdlua/hello-gui.pd_lua +++ /dev/null @@ -1,202 +0,0 @@ -local hello = pd.Class:new():register("hello-gui") - --- rendering speed (slows down rendering by the given factor) --- In most cases it should be fine to just set this to 1 to run at full speed, --- if you have a modern high-speed CPU and GPU. But we use a larger value as --- default here to deal with low frame rates on some systems. You may have to --- increase the value even further when running on low-spec systems like the --- Raspberry Pi. -local R = 3 - -function hello:initialize(sel, atoms) - self.inlets = 1 - - self.circle_x = 485 - self.circle_y = 15 - self.circle_radius = 15 - self.animation_speed = 2*R - self.delay_time = 16*R - - self.draggable_rect_x = 550 - self.draggable_rect_y = 130 - self.draggable_rect_size = 50 - self.dragging_rect = false - self.mouse_down_pos = {0, 0} - self.rect_down_pos = {0, 0} - - self:set_size(850, 230) - return true -end - -function math.clamp(val, lower, upper) - if lower > upper then lower, upper = upper, lower end -- swap if boundaries supplied the wrong way - return math.max(lower, math.min(upper, val)) -end - -function hello:postinitialize() - self.clock = pd.Clock:new():register(self, "tick") - self.clock:delay(self.delay_time) -end - -function hello:finalize() - self.clock:destruct() -end - -function hello:mouse_down(x, y) - if x > self.draggable_rect_x and y > self.draggable_rect_y and x < self.draggable_rect_x + self.draggable_rect_size and y < self.draggable_rect_y + self.draggable_rect_size then - dragging_rect = true - self.mouse_down_pos[0] = x - self.mouse_down_pos[1] = y - self.rect_down_pos[0] = self.draggable_rect_x - self.rect_down_pos[1] = self.draggable_rect_y - else - dragging_rect = false - end -end - -function hello:mouse_drag(x, y) - if dragging_rect == true then - self.draggable_rect_x = self.rect_down_pos[0] + (x - self.mouse_down_pos[0]) - self.draggable_rect_y = self.rect_down_pos[1] + (y - self.mouse_down_pos[1]) - self.draggable_rect_x = math.clamp(self.draggable_rect_x, 0, 710 - self.draggable_rect_size) - self.draggable_rect_y = math.clamp(self.draggable_rect_y, 0, 230 - self.draggable_rect_size) - self:repaint(3) - end -end - -function hello:paint(g) - g:set_color(50, 50, 50) - g:fill_all() - - -- Filled examples - g:set_color(66, 207, 201, 0.3) - g:fill_ellipse(30, 50, 30, 30) - g:set_color(0, 159, 147, 1) - g:fill_rect(120, 50, 30, 30) - g:set_color(250, 84, 108, 1) - g:fill_rounded_rect(210, 50, 30, 30, 5) - - g:set_color(252, 118, 81, 1) - - -- Star using line_to paths - local starX1, starY1 = 310, 45 - local starSize = 15 - - local star = Path(starX1, starY1) - - -- Star using line_to paths - star:line_to(starX1 + 5, starY1 + 14) - star:line_to(starX1 + 20, starY1 + 14) - star:line_to(starX1 + 8, starY1 + 22) - star:line_to(starX1 + 14, starY1 + 36) - star:line_to(starX1, starY1 + 27) - star:line_to(starX1 - 14, starY1 + 36) - star:line_to(starX1 - 6, starY1 + 22) - star:line_to(starX1 - 18, starY1 + 14) - star:line_to(starX1 - 3, starY1 + 14) - star:close() - - g:fill_path(star) - - g:set_color(255, 219, 96, 1) - -- Bezier curve example - g:translate(140, 20) - g:scale(0.5, 1.0) - local curve = Path(450, 50) - curve:cubic_to(500, 30, 550, 70, 600, 50) - curve:close() - g:stroke_path(curve, 2) - g:reset_transform() - - -- Stroked examples - g:set_color(66, 207, 201, 1) - g:stroke_ellipse(30, 150, 30, 30, 2) - g:set_color(0, 159, 147, 1) - g:stroke_rect(120, 150, 30, 30, 2) - g:set_color(250, 84, 108, 1) - g:stroke_rounded_rect(210, 150, 30, 30, 5, 2) - - g:set_color(252, 118, 81, 1) - - local starX2, starY2 = 310, 145 - local starSize = 15 - - -- Star using line_to paths - local star2 = Path(starX2, starY2) - star2:line_to(starX2 + 5, starY2 + 14) - star2:line_to(starX2 + 20, starY2 + 14) - star2:line_to(starX2 + 8, starY2 + 22) - star2:line_to(starX2 + 14, starY2 + 36) - star2:line_to(starX2, starY2 + 27) - star2:line_to(starX2 - 14, starY2 + 36) - star2:line_to(starX2 - 6, starY2 + 22) - star2:line_to(starX2 - 18, starY2 + 14) - star2:line_to(starX2 - 3, starY2 + 14) - star2:close() - g:stroke_path(star2, 2) - - g:set_color(255, 219, 96, 1) - -- Bezier curve example - g:translate(140, 20) - g:scale(0.5, 1.0) - local curve2 = Path(450, 150) - curve2:cubic_to(500, 130, 550, 170, 600, 150) - g:fill_path(curve2) - g:reset_transform() - - -- Titles - g:set_color(252, 118, 81, 1) - g:draw_text("Ellipse", 25, 190, 120, 12) - g:draw_text("Rectangle", 100, 190, 120, 12) - g:draw_text("Rounded Rect", 188, 190, 120, 12) - g:draw_text("Paths", 295, 190, 120, 12) - g:draw_text("Bezier Paths", 360, 190, 120, 12) - g:draw_text("Animation", 460, 190, 120, 12) - g:draw_text(" Mouse\nInteraction", 540, 190, 120, 12) - g:draw_text(" SVG\nRendering", 640, 190, 120, 12) - g:draw_text(" Image\nRendering", 740, 190, 120, 12) -end - -function hello:paint_layer_2(g) - g:set_color(250, 84, 108, 1) - g:fill_ellipse(self.circle_x, self.circle_y, self.circle_radius, self.circle_radius) -end - -function hello:paint_layer_3(g) - -- Draggable rectangle - g:set_color(66, 207, 201, 1) - g:fill_rounded_rect(self.draggable_rect_x, self.draggable_rect_y, self.draggable_rect_size, self.draggable_rect_size, 5) - g:set_color(0, 0, 0, 1) - g:draw_text("Drag\n me!", self.draggable_rect_x + 8, self.draggable_rect_y + 10, self.draggable_rect_size, 12) -end - -function hello:paint_layer_4(g) - -- Draggable rectangle - local svg_demo_1 = [[ - - ]] - - local svg_demo_2 = [[ - - ]] - - g:draw_svg(svg_demo_1, 650, 40) - g:draw_svg(svg_demo_2, 650, 120) - - g:scale(0.8, 0.8) - g:draw_image("examples/pdlogo.gif", 900, 75) -end - -function hello:tick() - self.circle_y = self.circle_y + self.animation_speed - if self.circle_y > 160 + self.circle_radius then - self.circle_y = -self.circle_radius - end - self:repaint(2) - self.clock:delay(self.delay_time) -end - - -function hello:in_1_bang() - self:repaint() -end diff --git a/pdlua/tutorial/examples/properties.pd b/pdlua/tutorial/examples/properties.pd index 275678a..5fb7aa5 100644 --- a/pdlua/tutorial/examples/properties.pd +++ b/pdlua/tutorial/examples/properties.pd @@ -1,5 +1,6 @@ #N canvas 849 44 951 1016 10; #X declare -lib pdlua; +#X declare -lib pdluajit; #X obj 784 43 declare -lib pdlua; #X obj 33 87 props; #X text 25 18 pdlua's properties allow you to add properties panels to both text and gui pdlua objects.; @@ -18,3 +19,4 @@ #X text 366 665 -- Add a section with a title. This is required before adding properties. Properties get added to the last defined frame. The column argument is ignored for plugdata \; -- Add a checkbox property \; -- Add a text input property \; -- Add a color picker property \; -- Add a floating-point number property \; -- Add an integer number property \; -- Add a combo box property \, options should be a list of items in curly brackets, f 104; #X text 33 397 p:add_text("Text 1" \, "updatetext1" \, self.textinput1), f 61; #X text 30 629 -- Functions you can call \; pd:Class:properties(p) \; \; p:new_frame(name \, column) \; \; p:add_check(label \, callback \, init) \; p:add_text(label \, callback \, init) \; p:add_color(label \, callback \, init) \; p:add_float(label \, callback \, init \, min=-inf \, max=inf) \; p:add_int(label \, callback \, init \, min=-inf \, max=inf) \; p:add_combo(label \, callback \, init \, options) \;; +#X obj 766 85 declare -lib pdluajit; diff --git a/pdlua/tutorial/examples/props.pd_lua b/pdlua/tutorial/examples/props.pd_lua deleted file mode 100644 index c566b26..0000000 --- a/pdlua/tutorial/examples/props.pd_lua +++ /dev/null @@ -1,100 +0,0 @@ -local properties = pd.Class:new():register("props") - -function properties:initialize(sel, atoms) - self.inlets = 1 - self.outlets = 1 - self.phase = 0 - self:set_size(127, 127) - - self.checkbox1 = 1 - self.checkbox2 = 0 - self.color = {155,155,155} - - self.textinput1 = "Hello" - self.textinput2 = "World" - - self.float = 0.5 - self.int = 4 - self.combo = 1 - - return true -end - -function properties:properties(p) - -- Checkboxes - p:new_frame("First CheckBox", 2) - p:add_check("Check Box 1", "updatecheckbox1", self.checkbox1) - p:add_check("Check Box 2", "updatecheckbox2", self.checkbox2) - - -- Text inputs - p:new_frame("First textinput", 2) - p:add_text("Check text 1", "updatetext1", self.textinput1) - p:add_text("Check text 2", "updatetext2", self.textinput2) - - -- Color picker - p:new_frame("My Color Picker", 1) - p:add_color("Background", "updatecolorbg", self.color) - - -- Number boxes - p:new_frame("Numbers", 2) - p:add_float("Float", "updatefloat", self.float, 0, 1) - p:add_int("Int", "updateint", self.int, 1, 16) - - -- Combobox - p:new_frame("Combo", 1) - p:add_combo("Waveform", "updatecombo", self.combo, { "Sine", "Square", "Saw", "Triangle" }) -end - -function properties:updatecolorbg(args) - self.color[1] = args[1][1] - self.color[2] = args[1][2] - self.color[3] = args[1][3] - self:repaint(1) -end - -function properties:updatetext1(args) - self.textinput1 = args[1] - pd.post("textinput1 is now " .. self.textinput1); -end - -function properties:updatetext2(args) - self.textinput2 = args[1] - pd.post("textinput2 is now " .. self.textinput2); -end - -function properties:updatecheckbox1(args) - self.checkbox1 = args[1] - pd.post("checkbox1 is now " .. self.checkbox1); -end - -function properties:updatecheckbox2(args) - self.checkbox2 = args[1] - pd.post("checkbox2 is now " .. self.checkbox2); -end - - -function properties:updatefloat(args) - self.float = args[1] - pd.post("float is now " .. self.float); -end - -function properties:updateint(args) - self.int = args[1] - pd.post("int is now " .. self.int); -end - -function properties:updatecombo(args) - self.combo = args[1] - pd.post("combo is now " .. self.combo); -end - -function properties:updatecheckbox2(args) - self.checkbox2 = args[1] - pd.post("checkbox2 is now " .. self.checkbox2); -end - - -function properties:paint(g) - g:set_color(table.unpack(self.color)) - g:fill_all() -end diff --git a/pdlua_gfx.h b/pdlua_gfx.h index e6e8c21..e332acc 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -22,19 +22,25 @@ */ #if !defined(PLUGDATA) && !defined(PURR_DATA) + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" #define NANOSVG_IMPLEMENTATION #include "svg/nanosvg.h" #define NANOSVGRAST_IMPLEMENTATION #include "svg/nanosvgrast.h" - +#define STB_IMAGE_STATIC #define STBI_NO_THREAD_LOCALS #define STB_IMAGE_IMPLEMENTATION #include "svg/stb_image.h" +#define STB_IMAGE_WRITE_STATIC #define STB_IMAGE_WRITE_IMPLEMENTATION #include "svg/stb_image_write.h" +#define STB_IMAGE_RESIZE_STATIC #define STB_IMAGE_RESIZE_IMPLEMENTATION #include "svg/stb_image_resize2.h" #endif +#pragma GCC diagnostic pop #ifdef PURR_DATA @@ -199,9 +205,9 @@ typedef struct _path_state // Pops the graphics context off the argument list and returns it static t_pdlua_gfx *pop_graphics_context(lua_State* L) { - t_pdlua_gfx* ctx = (t_pdlua_gfx*)luaL_checkudata(L, 1, "GraphicsContext"); + t_pdlua_gfx **ud = (t_pdlua_gfx**)luaL_checkudata(L, 1, "GraphicsContext"); lua_remove(L, 1); - return ctx; + return *ud; } // Register functions with Lua @@ -294,9 +300,6 @@ static inline void plugdata_draw(t_pdlua *obj, int layer, t_symbol* sym, int arg static inline void plugdata_draw_args(lua_State* L, const char* sym, const char *fmt, ...) { - if (!lua_islightuserdata(L, 1)) - return; - t_pdlua_gfx *gfx = pop_graphics_context(L); t_atom atoms[16]; int argc = strlen(fmt); @@ -357,7 +360,8 @@ static int start_paint(lua_State* L) { t_pdlua *obj = (t_pdlua*)lua_touserdata(L, 1); int layer = luaL_checknumber(L, 2); - lua_pushlightuserdata(L, &obj->gfx); + t_pdlua_gfx **ud = (t_pdlua_gfx**)lua_newuserdata(L, sizeof(t_pdlua_gfx*)); + *ud = &obj->gfx; luaL_setmetatable(L, "GraphicsContext"); plugdata_draw_callback = obj->gfx.plugdata_draw_callback; @@ -891,7 +895,8 @@ static int start_paint(lua_State* L) { gfx->num_transforms = 0; gfx->transforms = NULL; - lua_pushlightuserdata(L, gfx); + t_pdlua_gfx **ud = (t_pdlua_gfx**)lua_newuserdata(L, sizeof(t_pdlua_gfx*)); + *ud = &obj->gfx; luaL_setmetatable(L, "GraphicsContext"); #ifndef PURR_DATA diff --git a/pdlua_properties.h b/pdlua_properties.h index 8a163b9..9ced91c 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -154,7 +154,7 @@ static inline void plugdata_add_property(lua_State* L, const char* sym, const ch va_end(defaults); } -static void pdlua_properties(t_gobj *z, t_glist * UNUSED(owner)) +static void pdlua_properties(t_gobj *z, t_glist * IGNORE_UNUSED(owner)) { t_pdlua *pdlua = (t_pdlua *)z; lua_State *L = __L(); @@ -218,7 +218,7 @@ static int pdlua_properties_addcombo(lua_State *L) return 0; } -static void pdlua_properties_receiver(t_pdlua *o, t_symbol * UNUSED(s), int argc, t_atom *argv) +static void pdlua_properties_receiver(t_pdlua *o, t_symbol * IGNORE_UNUSED(s), int argc, t_atom *argv) { if (argc < 2) return; @@ -318,7 +318,7 @@ static void pdlua_properties_updaterow(t_pdlua_properties *p) } } -static void pdlua_properties(t_gobj *z, t_glist *UNUSED(owner)) { +static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { t_pdlua *pdlua = (t_pdlua *)z; t_pdlua_properties *p = &pdlua->properties; @@ -1015,7 +1015,7 @@ static void pdlua_properties_apply(t_pdlua *o) p->pending_count = 0; } -static void pdlua_properties_receiver(t_pdlua *o, t_symbol *UNUSED(s), int argc, t_atom *argv) +static void pdlua_properties_receiver(t_pdlua *o, t_symbol *IGNORE_UNUSED(s), int argc, t_atom *argv) { if (argc < 1) return; @@ -1065,5 +1065,3 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol *UNUSED(s), int argc, } #endif - - diff --git a/svg/nanosvg.h b/svg/nanosvg.h index 05b3b05..41dbeea 100644 --- a/svg/nanosvg.h +++ b/svg/nanosvg.h @@ -167,17 +167,17 @@ typedef struct NSVGimage } NSVGimage; // Parses SVG file from a file, returns SVG image as paths. -NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi); +static NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi); // Parses SVG file from a null terminated string, returns SVG image as paths. // Important note: changes the string. -NSVGimage* nsvgParse(char* input, const char* units, float dpi); +static NSVGimage* nsvgParse(char* input, const char* units, float dpi); // Duplicates a path. -NSVGpath* nsvgDuplicatePath(NSVGpath* p); +static NSVGpath* nsvgDuplicatePath(NSVGpath* p); // Deletes an image. -void nsvgDelete(NSVGimage* image); +static void nsvgDelete(NSVGimage* image); #ifndef NANOSVG_CPLUSPLUS #ifdef __cplusplus @@ -326,7 +326,7 @@ static void nsvg__parseElement(char* s, (*endelCb)(ud, name); } -int nsvg__parseXML(char* input, +static int nsvg__parseXML(char* input, void (*startelCb)(void* ud, const char* el, const char** attr), void (*endelCb)(void* ud, const char* el), void (*contentCb)(void* ud, const char* s), @@ -1289,7 +1289,7 @@ typedef struct NSVGNamedColor { unsigned int color; } NSVGNamedColor; -NSVGNamedColor nsvg__colors[] = { +static NSVGNamedColor nsvg__colors[] = { { "red", NSVG_RGB(255, 0, 0) }, { "green", NSVG_RGB( 0, 128, 0) }, @@ -1301,8 +1301,6 @@ NSVGNamedColor nsvg__colors[] = { { "grey", NSVG_RGB(128, 128, 128) }, { "gray", NSVG_RGB(128, 128, 128) }, { "white", NSVG_RGB(255, 255, 255) }, - -#ifdef NANOSVG_ALL_COLOR_KEYWORDS { "aliceblue", NSVG_RGB(240, 248, 255) }, { "antiquewhite", NSVG_RGB(250, 235, 215) }, { "aqua", NSVG_RGB( 0, 255, 255) }, @@ -1440,7 +1438,6 @@ NSVGNamedColor nsvg__colors[] = { { "wheat", NSVG_RGB(245, 222, 179) }, { "whitesmoke", NSVG_RGB(245, 245, 245) }, { "yellowgreen", NSVG_RGB(154, 205, 50) }, -#endif }; static unsigned int nsvg__parseColorName(const char* str) @@ -2991,7 +2988,7 @@ static void nsvg__createGradients(NSVGparser* p) } } -NSVGimage* nsvgParse(char* input, const char* units, float dpi) +static NSVGimage* nsvgParse(char* input, const char* units, float dpi) { NSVGparser* p; NSVGimage* ret = 0; @@ -3018,7 +3015,7 @@ NSVGimage* nsvgParse(char* input, const char* units, float dpi) return ret; } -NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi) +static NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi) { FILE* fp = NULL; size_t size; @@ -3047,7 +3044,7 @@ NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi) return NULL; } -NSVGpath* nsvgDuplicatePath(NSVGpath* p) +static NSVGpath* nsvgDuplicatePath(NSVGpath* p) { NSVGpath* res = NULL; @@ -3077,7 +3074,7 @@ NSVGpath* nsvgDuplicatePath(NSVGpath* p) return NULL; } -void nsvgDelete(NSVGimage* image) +static void nsvgDelete(NSVGimage* image) { NSVGshape *snext, *shape; if (image == NULL) return; diff --git a/svg/nanosvgrast.h b/svg/nanosvgrast.h index 90d42e9..5df8731 100644 --- a/svg/nanosvgrast.h +++ b/svg/nanosvgrast.h @@ -49,7 +49,7 @@ typedef struct NSVGrasterizer NSVGrasterizer; */ // Allocated rasterizer context. -NSVGrasterizer* nsvgCreateRasterizer(void); +static NSVGrasterizer* nsvgCreateRasterizer(void); // Rasterizes SVG image, returns RGBA image (non-premultiplied alpha) // r - pointer to rasterizer context @@ -60,12 +60,12 @@ NSVGrasterizer* nsvgCreateRasterizer(void); // w - width of the image to render // h - height of the image to render // stride - number of bytes per scaleline in the destination buffer -void nsvgRasterize(NSVGrasterizer* r, +static void nsvgRasterize(NSVGrasterizer* r, NSVGimage* image, float tx, float ty, float scale, unsigned char* dst, int w, int h, int stride); // Deletes rasterizer context. -void nsvgDeleteRasterizer(NSVGrasterizer*); +static void nsvgDeleteRasterizer(NSVGrasterizer*); #ifndef NANOSVGRAST_CPLUSPLUS @@ -150,7 +150,7 @@ struct NSVGrasterizer int width, height, stride; }; -NSVGrasterizer* nsvgCreateRasterizer(void) +static NSVGrasterizer* nsvgCreateRasterizer(void) { NSVGrasterizer* r = (NSVGrasterizer*)malloc(sizeof(NSVGrasterizer)); if (r == NULL) goto error; @@ -166,7 +166,7 @@ NSVGrasterizer* nsvgCreateRasterizer(void) return NULL; } -void nsvgDeleteRasterizer(NSVGrasterizer* r) +static void nsvgDeleteRasterizer(NSVGrasterizer* r) { NSVGmemPage* p; @@ -1366,7 +1366,7 @@ static void dumpEdges(NSVGrasterizer* r, const char* name) } */ -void nsvgRasterize(NSVGrasterizer* r, +static void nsvgRasterize(NSVGrasterizer* r, NSVGimage* image, float tx, float ty, float scale, unsigned char* dst, int w, int h, int stride) { From 5a9fb5f4b2fee616f4364cf0539da64082f79fd0 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 18:18:34 +0100 Subject: [PATCH 061/109] Fix missing property_count increment --- pdlua_properties.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index 8a163b9..b8a45cd 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -690,6 +690,8 @@ static int pdlua_properties_addcolor(lua_State *L) { char colorboxid[MAXPDSTRING]; char pdsend[MAXPDSTRING]; + pdlua->properties.property_count++; + snprintf(container, MAXPDSTRING, "%s.color%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); @@ -1065,5 +1067,3 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol *UNUSED(s), int argc, } #endif - - From f381064adaaf831bfe9fbfbeb5431aff2802cee8 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 18:18:34 +0100 Subject: [PATCH 062/109] Fix missing property_count increment --- pdlua_properties.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pdlua_properties.h b/pdlua_properties.h index 9ced91c..9fca3c9 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -690,6 +690,8 @@ static int pdlua_properties_addcolor(lua_State *L) { char colorboxid[MAXPDSTRING]; char pdsend[MAXPDSTRING]; + pdlua->properties.property_count++; + snprintf(container, MAXPDSTRING, "%s.color%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); From 58d882d88972560c486792fc431487a7a446dfb9 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 18:30:32 +0100 Subject: [PATCH 063/109] Add plugdata support for multiple luas --- pdlua.c | 8 ++++++++ pdlua.h | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/pdlua.c b/pdlua.c index 1ae420a..0391514 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1609,6 +1609,14 @@ static int pdlua_object_new(lua_State *L) #else // NULL until plugdata overrides them with something useful o->gfx.plugdata_draw_callback = NULL; + + o->gfx.pdlua_gfx_repaint = pdlua_gfx_repaint; + o->gfx.pdlua_gfx_mouse_down = pdlua_gfx_mouse_down; + o->gfx.pdlua_gfx_mouse_up = pdlua_gfx_mouse_up; + o->gfx.pdlua_gfx_mouse_drag = pdlua_gfx_mouse_drag; + o->gfx.pdlua_gfx_mouse_move = pdlua_gfx_mouse_move; + o->gfx.pdlua_gfx_mouse_enter = pdlua_gfx_mouse_enter; + o->gfx.pdlua_gfx_mouse_exit = pdlua_gfx_mouse_exit; #endif lua_pushlightuserdata(L, o); diff --git a/pdlua.h b/pdlua.h index 4cdf0c7..2d13fc9 100644 --- a/pdlua.h +++ b/pdlua.h @@ -89,6 +89,13 @@ typedef struct _pdlua_gfx #else int current_layer; void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*); // Callback to perform drawing in plugdata + void(*pdlua_gfx_mouse_down)(void* o, int x, int y); + void(*pdlua_gfx_mouse_up)(void* o, int x, int y); + void(*pdlua_gfx_mouse_move)(void* o, int x, int y); + void(*pdlua_gfx_mouse_drag)(void* o, int x, int y); + void(*pdlua_gfx_mouse_enter)(void *x, int xpos, int ypos); + void(*pdlua_gfx_mouse_exit)(void *x, int xpos, int ypos); + void(*pdlua_gfx_repaint)(void* o, int firsttime); #endif } t_pdlua_gfx; From 49d369111c1fa4efcf0f80d3e99a088b15619b16 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 18:32:36 +0100 Subject: [PATCH 064/109] Replace all file extensions --- pdlua.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pdlua.c b/pdlua.c index 0391514..d90f0f5 100644 --- a/pdlua.c +++ b/pdlua.c @@ -748,7 +748,7 @@ static t_pdlua *pdlua_new char *ptr; t_pdlua_readerdata reader; t_canvas* current = canvas_getcurrent(); - int fd = canvas_open(current, s->s_name, ".pd_lua", buf, &ptr, MAXPDSTRING, 1); + int fd = canvas_open(current, s->s_name, LUA_FILE_EXTENSION, buf, &ptr, MAXPDSTRING, 1); if (fd >= 0) { PDLUA_DEBUG("basename open: stack top %d", lua_gettop(__L())); @@ -769,7 +769,7 @@ static t_pdlua *pdlua_new pdlua_setrequirepath(__L(), buf); class_set_extern_dir(global_gensym(buf)); strncpy(buf, s->s_name, MAXPDSTRING - 8); - strcat(buf, ".pd_lua"); + strcat(buf, LUA_FILE_EXTENSION); reader.fd = fd; n = lua_gettop(__L()); #if LUA_VERSION_NUM < 502 @@ -3087,7 +3087,7 @@ static int pdlua_loader_legacy char *ptr; int fd; - fd = canvas_open(canvas, name, ".pd_lua", dirbuf, &ptr, MAXPDSTRING, 1); + fd = canvas_open(canvas, name, LUA_FILE_EXTENSION, dirbuf, &ptr, MAXPDSTRING, 1); return pdlua_loader_wrappath(fd, name, dirbuf); } From c90be107758da0396780911f7b474c5c24841092 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 18:42:02 +0100 Subject: [PATCH 065/109] Return correct scriptname when running luajit --- pd.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pd.lua b/pd.lua index 41e3b42..fc0cd2c 100644 --- a/pd.lua +++ b/pd.lua @@ -369,11 +369,12 @@ function pd.Class:register(name) self._class, self._class_gfx = pd._register(name) -- register new class self._name = name self._loadpath = fullpath + local suffix = jit and ".pd_luajit" or ".pd_lua" if name == "pdlua" then self._scriptname = "pd.lua" else - self._scriptname = name .. ".pd_lua" - end -- mrpeach 20111027 + self._scriptname = name .. suffix + end-- mrpeach 20111027 return self -- return new end From 4856d79d5708c2c1e6d95d629dd05e20430ac61d Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 19:52:43 +0100 Subject: [PATCH 066/109] Add pdluajit documentation, make [pdluajit] object available --- pd.lua | 4 +- pdlua.c | 4 +- pdlua/tutorial/examples/lua-benchmark.pd_lua | 70 ++++++++++++ .../examples/luajit-benchmark.pd_luajit | 70 ++++++++++++ pdlua/tutorial/examples/luajit-ffi.lua | 12 +++ pdlua/tutorial/examples/luajit.pd | 36 +++++++ pdlua/tutorial/examples/props.pd_lua | 100 ++++++++++++++++++ 7 files changed, 292 insertions(+), 4 deletions(-) create mode 100644 pdlua/tutorial/examples/lua-benchmark.pd_lua create mode 100644 pdlua/tutorial/examples/luajit-benchmark.pd_luajit create mode 100644 pdlua/tutorial/examples/luajit-ffi.lua create mode 100644 pdlua/tutorial/examples/luajit.pd create mode 100644 pdlua/tutorial/examples/props.pd_lua diff --git a/pd.lua b/pd.lua index fc0cd2c..429ed5d 100644 --- a/pd.lua +++ b/pd.lua @@ -596,7 +596,7 @@ function pd.Class:get_class() -- accessor for t_class* return pd._get_class(self) or nil end -local lua = pd.Class:new():register("pdlua") -- global controls (the [pdlua] object only) +local lua = pd.Class:new():register(jit and "pdluajit" or "pdlua") -- global controls (the [pdlua] object only) function lua:initialize(sel, atoms) self.inlets = 1 @@ -608,7 +608,7 @@ function lua:in_1_load(atoms) -- execute a script self:dofile(atoms[1]) end -local luax = pd.Class:new():register("pdluax") -- classless lua externals (like [pdluax foo]) +local luax = pd.Class:new():register(jit and "pdluaxjit" or "pdluax") -- classless lua externals (like [pdluax foo]) function luax:initialize(sel, atoms) -- motivation: pd-list 2007-09-23 if not atoms[1] then diff --git a/pdlua.c b/pdlua.c index d90f0f5..ace1011 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1510,7 +1510,7 @@ static int pdlua_class_new(lua_State *L) #pragma GCC diagnostic ignored "-Wcast-function-type" c = class_new(global_gensym((char *) name), (t_newmethod)pdlua_new, (t_method) pdlua_free, sizeof(t_pdlua), CLASS_NOINLET | CLASS_MULTICHANNEL, A_GIMME, 0); - if (strcmp(name, "pdlua") && strcmp(name, "pdluax")) { + if (strcmp(name, "pdlua") && strcmp(name, "pdluax") && strcmp(name, "pdluajit") && strcmp(name, "pdluaxjit")) { // Shadow class for graphics objects. This is an exact clone of the // regular (non-gui) class, except that it has a different // widgetbehavior. We only need this for the regular Lua objects, the @@ -1609,7 +1609,7 @@ static int pdlua_object_new(lua_State *L) #else // NULL until plugdata overrides them with something useful o->gfx.plugdata_draw_callback = NULL; - + o->gfx.pdlua_gfx_repaint = pdlua_gfx_repaint; o->gfx.pdlua_gfx_mouse_down = pdlua_gfx_mouse_down; o->gfx.pdlua_gfx_mouse_up = pdlua_gfx_mouse_up; diff --git a/pdlua/tutorial/examples/lua-benchmark.pd_lua b/pdlua/tutorial/examples/lua-benchmark.pd_lua new file mode 100644 index 0000000..32723f2 --- /dev/null +++ b/pdlua/tutorial/examples/lua-benchmark.pd_lua @@ -0,0 +1,70 @@ +local Benchmark = pd.Class:new():register("lua-benchmark") + +function Benchmark:initialize(name, atoms) + self.inlets = 1; + pd.post("Hello, world!") + return true +end + +local clock = os.clock + +local function benchmark(name, fn) + local start = clock() + fn() + local elapsed = clock() - start + pd.post(string.format("%-20s %.6f sec", name, elapsed)) +end + +function Benchmark:in_1_bang() + local N = 1e7 -- adjust if too slow/fast on your machine + + pd.post("benchmarking pdlua:") + pd.post("-----------------------------------") + + -- 1. Empty loop + benchmark("empty loop", function() + for i = 1, N do end + end) + + -- 2. Arithmetic + benchmark("arithmetic", function() + local x = 0 + for i = 1, N do + x = x + i * 2 - 3 + end + end) + + -- 3. Function calls + local function f(x) + return x + 1 + end + + benchmark("function calls", function() + local x = 0 + for i = 1, N do + x = f(x) + end + end) + + -- 4. Table access + benchmark("table access", function() + local t = {} + for i = 1, 100 do + t[i] = i + end + + local sum = 0 + for i = 1, N do + sum = sum + t[(i % 100) + 1] + end + end) + + -- 5. Math library + benchmark("math.sin", function() + local x = 0 + for i = 1, N do + x = x + math.sin(i) + end + end) + pd.post("-----------------------------------") +end diff --git a/pdlua/tutorial/examples/luajit-benchmark.pd_luajit b/pdlua/tutorial/examples/luajit-benchmark.pd_luajit new file mode 100644 index 0000000..a0810c6 --- /dev/null +++ b/pdlua/tutorial/examples/luajit-benchmark.pd_luajit @@ -0,0 +1,70 @@ +local Benchmark = pd.Class:new():register("luajit-benchmark") + +function Benchmark:initialize(name, atoms) + self.inlets = 1; + pd.post("Hello, world!") + return true +end + +local clock = os.clock + +local function benchmark(name, fn) + local start = clock() + fn() + local elapsed = clock() - start + pd.post(string.format("%-20s %.6f sec", name, elapsed)) +end + +function Benchmark:in_1_bang() + local N = 1e7 -- adjust if too slow/fast on your machine + + pd.post("benchmarking pdluajit:") + pd.post("-----------------------------------") + + -- 1. Empty loop + benchmark("empty loop", function() + for i = 1, N do end + end) + + -- 2. Arithmetic + benchmark("arithmetic", function() + local x = 0 + for i = 1, N do + x = x + i * 2 - 3 + end + end) + + -- 3. Function calls + local function f(x) + return x + 1 + end + + benchmark("function calls", function() + local x = 0 + for i = 1, N do + x = f(x) + end + end) + + -- 4. Table access + benchmark("table access", function() + local t = {} + for i = 1, 100 do + t[i] = i + end + + local sum = 0 + for i = 1, N do + sum = sum + t[(i % 100) + 1] + end + end) + + -- 5. Math library + benchmark("math.sin", function() + local x = 0 + for i = 1, N do + x = x + math.sin(i) + end + end) + pd.post("-----------------------------------") +end diff --git a/pdlua/tutorial/examples/luajit-ffi.lua b/pdlua/tutorial/examples/luajit-ffi.lua new file mode 100644 index 0000000..f6ac362 --- /dev/null +++ b/pdlua/tutorial/examples/luajit-ffi.lua @@ -0,0 +1,12 @@ +local ffi = require("ffi") + +ffi.cdef[[ +void post(const char *fmt, ...); +float sys_getsr(void); +double clock_getlogicaltime(void); +]] + +ffi.C.post("=== Pd via LuaJIT FFI ===") +ffi.C.post("Samplerate: " .. tostring(ffi.C.sys_getsr())) +ffi.C.post("Block size: " .. tostring(ffi.C.sys_getblksize())) +ffi.C.post("Time: " .. tostring(ffi.C.clock_getlogicaltime())) diff --git a/pdlua/tutorial/examples/luajit.pd b/pdlua/tutorial/examples/luajit.pd new file mode 100644 index 0000000..89e19ac --- /dev/null +++ b/pdlua/tutorial/examples/luajit.pd @@ -0,0 +1,36 @@ +#N canvas 33 78 1057 730 12; +#X declare -lib pdlua; +#X obj 830 39 declare -lib pdlua; +#X obj 66 245 bng 25 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 323 243 bng 25 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X text 108 244 <- print pdlua benchmark to console, f 24; +#X text 378 241 <- print pdluajit benchmark to console, f 28; +#X text 309 474 pdlua; +#X text 506 473 pdluajit; +#X text 156 508 file extension; +#X text 299 506 .pd_lua; +#X text 497 505 .pd_luajit; +#X text 178 539 Lua version; +#X text 313 537 5.4; +#X text 487 537 5.1 + compat53; +#X text 178 569 Performance; +#X text 298 569 baseline; +#X text 495 567 ~6x faster; +#X text 57 102 Currently \, the standard pdlua parser is based on Lua 5.4. The pdluajit parser is based on Lua 5.1 \, with a compatibility layer (compat53) that makes some (but not all) of the Lua 5.3 syntax available as well. The LuaJIT version used is v2.1, f 93; +#X text 50 157 Note that Lua and LuaJIT have their own separate environment \, so while global variables declared inside Lua can be seen from other files \, they will not cross the Lua/LuaJIT border, f 94; +#X text 58 42 pdlua can either use Lua or LuaJIT as its parser. While the regular Lua parser offers more modern Lua syntax \, the LuaJIT parser offers much better performance. Files that end with .pd_lua will be picked up by Lua \, whereas files ending with .pd_luajit will run in LuaJIT, f 93; +#X obj 322 310 luajit-benchmark; +#X obj 65 309 lua-benchmark; +#X text 116 599 Standard complicance; +#X text 294 601 complete; +#X text 497 601 incomplete; +#X text 233 629 FFI; +#X text 320 629 no; +#X text 523 630 yes; +#X obj 611 394 pdluajit; +#X msg 611 366 load luajit-ffi.lua; +#X text 53 359 Additionally \, pdluajit has the ability to directly interface with C functions \, using its FFI (Foreign Function Interface) abilities. You can use this to load shared libraries and call functions from it \, or directly interface with pure-data's API functions., f 75; +#X text 769 362 <- Directly interface with Pd's API to print audio device into to the console, f 31; +#X connect 1 0 20 0; +#X connect 2 0 19 0; +#X connect 28 0 27 0; diff --git a/pdlua/tutorial/examples/props.pd_lua b/pdlua/tutorial/examples/props.pd_lua new file mode 100644 index 0000000..c566b26 --- /dev/null +++ b/pdlua/tutorial/examples/props.pd_lua @@ -0,0 +1,100 @@ +local properties = pd.Class:new():register("props") + +function properties:initialize(sel, atoms) + self.inlets = 1 + self.outlets = 1 + self.phase = 0 + self:set_size(127, 127) + + self.checkbox1 = 1 + self.checkbox2 = 0 + self.color = {155,155,155} + + self.textinput1 = "Hello" + self.textinput2 = "World" + + self.float = 0.5 + self.int = 4 + self.combo = 1 + + return true +end + +function properties:properties(p) + -- Checkboxes + p:new_frame("First CheckBox", 2) + p:add_check("Check Box 1", "updatecheckbox1", self.checkbox1) + p:add_check("Check Box 2", "updatecheckbox2", self.checkbox2) + + -- Text inputs + p:new_frame("First textinput", 2) + p:add_text("Check text 1", "updatetext1", self.textinput1) + p:add_text("Check text 2", "updatetext2", self.textinput2) + + -- Color picker + p:new_frame("My Color Picker", 1) + p:add_color("Background", "updatecolorbg", self.color) + + -- Number boxes + p:new_frame("Numbers", 2) + p:add_float("Float", "updatefloat", self.float, 0, 1) + p:add_int("Int", "updateint", self.int, 1, 16) + + -- Combobox + p:new_frame("Combo", 1) + p:add_combo("Waveform", "updatecombo", self.combo, { "Sine", "Square", "Saw", "Triangle" }) +end + +function properties:updatecolorbg(args) + self.color[1] = args[1][1] + self.color[2] = args[1][2] + self.color[3] = args[1][3] + self:repaint(1) +end + +function properties:updatetext1(args) + self.textinput1 = args[1] + pd.post("textinput1 is now " .. self.textinput1); +end + +function properties:updatetext2(args) + self.textinput2 = args[1] + pd.post("textinput2 is now " .. self.textinput2); +end + +function properties:updatecheckbox1(args) + self.checkbox1 = args[1] + pd.post("checkbox1 is now " .. self.checkbox1); +end + +function properties:updatecheckbox2(args) + self.checkbox2 = args[1] + pd.post("checkbox2 is now " .. self.checkbox2); +end + + +function properties:updatefloat(args) + self.float = args[1] + pd.post("float is now " .. self.float); +end + +function properties:updateint(args) + self.int = args[1] + pd.post("int is now " .. self.int); +end + +function properties:updatecombo(args) + self.combo = args[1] + pd.post("combo is now " .. self.combo); +end + +function properties:updatecheckbox2(args) + self.checkbox2 = args[1] + pd.post("checkbox2 is now " .. self.checkbox2); +end + + +function properties:paint(g) + g:set_color(table.unpack(self.color)) + g:fill_all() +end From bc38ecb01297a9a3f1fe088cdd03c713b9309088 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 20:15:30 +0100 Subject: [PATCH 067/109] multi-instance: give each pdinstance its own Lua state, remove multi-threading locks --- luas/lua.c | 7 -- luas/luajit.c | 7 -- pdlua.c | 262 ++++++++++++++++++++++------------------- pdlua/hello-gui.pd_lua | 202 +++++++++++++++++++++++++++++++ 4 files changed, 342 insertions(+), 136 deletions(-) create mode 100644 pdlua/hello-gui.pd_lua diff --git a/luas/lua.c b/luas/lua.c index e2f367b..50d7a4f 100644 --- a/luas/lua.c +++ b/luas/lua.c @@ -155,13 +155,6 @@ #define l_likely(x) luai_likely(x) #define l_unlikely(x) luai_unlikely(x) -#ifdef PDINSTANCE -#include -pthread_mutex_t lua_global_lock = PTHREAD_MUTEX_INITIALIZER; -#define lua_lock(L) pthread_mutex_lock(&lua_global_lock) -#define lua_unlock(L) pthread_mutex_unlock(&lua_global_lock) -#endif - #include "lua/lua.h" #include "lua/lauxlib.h" #include "lua/lualib.h" diff --git a/luas/luajit.c b/luas/luajit.c index 726349f..0376bf8 100644 --- a/luas/luajit.c +++ b/luas/luajit.c @@ -35,13 +35,6 @@ static void preload_compat53(lua_State *L) { lua_call(L, 1, 0); } -#ifdef PDINSTANCE -#include -pthread_mutex_t lua_global_lock = PTHREAD_MUTEX_INITIALIZER; -#define lua_lock(L) pthread_mutex_lock(&lua_global_lock) -#define lua_unlock(L) pthread_mutex_unlock(&lua_global_lock) -#endif - #define LUA_FILE_EXTENSION ".pd_luajit" #define LUA_USE_JIT 1 diff --git a/pdlua.c b/pdlua.c index ace1011..3d7c813 100644 --- a/pdlua.c +++ b/pdlua.c @@ -127,73 +127,75 @@ static t_signal_setmultiout g_signal_setmultiout; #ifdef PDINSTANCE typedef struct _lua_Instance { - void* pd_instance; - lua_State* state; + void* pd_instance; + lua_State* state; struct _lua_Instance* next; } lua_Instance; -lua_Instance* lua_threads = NULL; +static lua_Instance* lua_instances = NULL; -static lua_State* __L() +static lua_State* __L(void) { - lua_Instance* iter = lua_threads; - while(iter) - { - if(iter->pd_instance == pd_this) - { + lua_Instance* iter = lua_instances; + while (iter) { + if (iter->pd_instance == pd_this) return iter->state; - } iter = iter->next; } - - return NULL; // should never happen + return NULL; /* should never happen */ } -static void initialize_lua_state() +static lua_State* create_lua_state(void) { - if(!lua_threads) - { - lua_threads = t_getbytes(sizeof(lua_Instance)); - lua_threads->pd_instance = pd_this; - lua_threads->state = luaL_newstate(); - lua_threads->next = NULL; - return; - } - - lua_Instance* iter = lua_threads; - while(iter->next) - { - iter = iter->next; - } + /* Always a fresh, fully independent state – never lua_newthread. */ + lua_State* L = luaL_newstate(); + if (!L) return NULL; - lua_checkstack(lua_threads->state, 1); + lua_Instance* node = t_getbytes(sizeof(lua_Instance)); + node->pd_instance = pd_this; + node->state = L; + node->next = NULL; - iter->next = t_getbytes(sizeof(lua_Instance)); - iter->next->pd_instance = pd_this; - iter->next->state = lua_newthread(lua_threads->state); - iter->next->next = NULL; + if (!lua_instances) { + lua_instances = node; + } else { + lua_Instance* tail = lua_instances; + while (tail->next) tail = tail->next; + tail->next = node; + } + return L; +} - // TODO: lua state will leak, we should clean it up somewhere - //axluaL_ref(lua_threads->state, LUA_REGISTRYINDEX); +static void destroy_lua_state(void) +{ + /* Walk the list and remove the node for the current pd instance. */ + lua_Instance** pp = &lua_instances; + while (*pp) { + if ((*pp)->pd_instance == pd_this) { + lua_Instance* dead = *pp; + *pp = dead->next; + lua_close(dead->state); + t_freebytes(dead, sizeof(lua_Instance)); + return; + } + pp = &(*pp)->next; + } } -#else +#else /* !PDINSTANCE – single global state */ static lua_State* __lua_state = NULL; -static lua_State* __L() -{ - return __lua_state; -} +static lua_State* __L(void) { return __lua_state; } -static void initialize_lua_state() +static lua_State* create_lua_state(void) { - if (!__lua_state) { + if (!__lua_state) __lua_state = luaL_newstate(); - } + return __lua_state; } -#endif +#endif /* PDINSTANCE */ // class_new class names need to use gensym of the global pure-data instance static t_symbol* global_gensym(const char* s) @@ -3152,24 +3154,97 @@ static int pdlua_loader_pathwise __declspec(dllexport) #endif +static int init_pdlua_environment(lua_State* L, const char* datadir) +{ + char pd_lua_path[MAXPDSTRING]; + t_pdlua_readerdata reader; + int fd, result; + + luaL_openlibs(L); + PDLUA_DEBUG("pdlua luaL_openlibs done", 0); + + pdlua_init(L); + PDLUA_DEBUG("pdlua pdlua_init done", 0); + +#if LUA_USE_JIT + preload_compat53(L); +#endif + + snprintf(pd_lua_path, MAXPDSTRING-1, "%s/pd.lua", datadir); + PDLUA_DEBUG("pd_lua_path %s", pd_lua_path); + + fd = open(pd_lua_path, O_RDONLY); + PDLUA_DEBUG("pdlua canvas_open done fd = %d", fd); + PDLUA_DEBUG("pdlua_setup: stack top %d", lua_gettop(L)); + + if (fd < 0) { + pd_error(NULL, "lua: error loading `pd.lua': open() failed"); + pd_error(NULL, "lua: loader will not be registered!"); + return 0; + } + + reader.fd = fd; + pdlua_packagepath(L, datadir); /* so pdx.lua can be found */ + +#if LUA_VERSION_NUM < 502 + result = lua_load(L, pdlua_reader, &reader, "pd.lua"); +#else + result = lua_load(L, pdlua_reader, &reader, "pd.lua", NULL); +#endif + PDLUA_DEBUG("pdlua lua_load returned %d", result); + + if (result == 0) { + result = lua_pcall(L, 0, 0, 0); + PDLUA_DEBUG("pdlua lua_pcall returned %d", result); + } + + close(fd); + + if (result != 0) { + mylua_error(L, NULL, NULL); + pd_error(NULL, "lua: loader will not be registered!"); + pd_error(NULL, "lua: (is `pd.lua' in Pd's path list?)"); + return 0; + } + + pdlua_gfx_setup(L); + pdlua_properties_setup(L); + +#if LUA_USE_JIT + lua_getglobal(L, "jit"); + lua_getfield(L, -1, "on"); + lua_call(L, 0, 0); + + lua_getglobal(L, "jit"); + lua_getfield(L, -1, "opt"); + lua_getfield(L, -1, "start"); + lua_pushstring(L, "hotloop=1"); + lua_call(L, 1, 0); +#endif + + return 1; /* success */ +} void pdlua_instance_setup() { #if PDINSTANCE - initialize_lua_state(); + lua_State* L = create_lua_state(); + if (!L) { + pd_error(NULL, "lua: luaL_newstate() failed"); + return; + } + PDLUA_DEBUG("pdlua lua_open done L = %p", L); + init_pdlua_environment(L, pdlua_datadir); #endif } + #ifdef PLUGDATA void pdlua_setup(const char *datadir, char *versbuf, int versbuf_length, void(*register_class_callback)(const char*)) #else void pdlua_setup(void) #endif { - char pd_lua_path[MAXPDSTRING]; - t_pdlua_readerdata reader; - int fd; - int result; char pdluaver[MAXPDSTRING]; char compiled[MAXPDSTRING]; char luaversionStr[MAXPDSTRING]; @@ -3264,18 +3339,6 @@ void pdlua_setup(void) return; } - initialize_lua_state(); - - PDLUA_DEBUG("pdlua lua_open done L = %p", __L()); - luaL_openlibs(__L()); - PDLUA_DEBUG("pdlua luaL_openlibs done", 0); - pdlua_init(__L()); - PDLUA_DEBUG("pdlua pdlua_init done", 0); - -#if LUA_USE_JIT - preload_compat53(__L()); -#endif - /* "pd.lua" is the Lua part of pdlua, want to keep the C part minimal */ /* canvas_open can't find pd.lua unless we give the path to pd beforehand like pd -path /usr/lib/extra/pdlua */ /* To avoid this we can use c_externdir from m_imp.h, struct _class: t_symbol *c_externdir; */ @@ -3297,63 +3360,28 @@ void pdlua_setup(void) if (!getcwd(pdlua_cwd, MAXPDSTRING)) // if we can't get the cwd, this is the best that we can do strcpy(pdlua_cwd, "."); - snprintf(pd_lua_path, MAXPDSTRING-1, "%s/pd.lua", pdlua_datadir); /* the full path to pd.lua */ - PDLUA_DEBUG("pd_lua_path %s", pd_lua_path); - fd = open(pd_lua_path, O_RDONLY); -/* fd = canvas_open(canvas_getcurrent(), "pd", ".lua", buf, &ptr, MAXPDSTRING, 1); looks all over and rarely succeeds */ - PDLUA_DEBUG ("pd.lua loaded from %s", pd_lua_path); - PDLUA_DEBUG("pdlua canvas_open done fd = %d", fd); - PDLUA_DEBUG("pdlua_setup: stack top %d", lua_gettop(__L())); - if (fd >= 0) - { /* pd.lua was opened */ - reader.fd = fd; - // We need to set up Lua's package.path here so that pdx.lua can be - // found (and possibly other pre-loaded extension modules in the - // future). Note that we can't just use pdlua_setrequirepath() here - // because it calls pd._setrequirepath in pd.lua which isn't loaded - // yet at this point. - pdlua_packagepath(__L(), pdlua_datadir); -#if LUA_VERSION_NUM < 502 - result = lua_load(__L(), pdlua_reader, &reader, "pd.lua"); -#else // 5.2 style - result = lua_load(__L(), pdlua_reader, &reader, "pd.lua", NULL); // mode bt for binary or text -#endif // LUA_VERSION_NUM < 502 - PDLUA_DEBUG ("pdlua lua_load returned %d", result); - if (0 == result) - { - result = lua_pcall(__L(), 0, 0, 0); - PDLUA_DEBUG ("pdlua lua_pcall returned %d", result); - } - if (0 != result) - { - mylua_error(__L(), NULL, NULL); - pd_error(NULL, "lua: loader will not be registered!"); - pd_error(NULL, "lua: (is `pd.lua' in Pd's path list?)"); - } - else - { - int maj=0,min=0,bug=0; - sys_getversion(&maj,&min,&bug); - if((maj==0) && (min<47)) - /* before Pd<0.47, the loaders had to iterate over each path themselves */ - sys_register_loader((loader_t)pdlua_loader_legacy); - else - /* since Pd>=0.47, Pd tries the loaders for each path */ - sys_register_loader((loader_t)pdlua_loader_pathwise); - } - close(fd); + lua_State* L = create_lua_state(); + if (!L) { + pd_error(NULL, "lua: luaL_newstate() failed"); + return; } - else + PDLUA_DEBUG("pdlua lua_open done L = %p", L); + + if (!init_pdlua_environment(L, pdlua_datadir)) + return; { - pd_error(NULL, "lua: error loading `pd.lua': canvas_open() failed"); - pd_error(NULL, "lua: loader will not be registered!"); + int maj = 0, min = 0, bug = 0; + sys_getversion(&maj, &min, &bug); + if (maj == 0 && min < 47) + sys_register_loader((loader_t)pdlua_loader_legacy); + else + sys_register_loader((loader_t)pdlua_loader_pathwise); } - pdlua_gfx_setup(__L()); - pdlua_properties_setup(__L()); + PDLUA_DEBUG("pdlua_setup: end. stack top %d", lua_gettop(L)); - PDLUA_DEBUG("pdlua_setup: end. stack top %d", lua_gettop(__L())); + /* ── nw.js support ── */ #ifndef PLUGDATA /* nw.js support. */ #ifdef WIN32 @@ -3372,17 +3400,7 @@ void pdlua_setup(void) #else void pdluajit_setup(); pdluajit_setup(); -#endif -#else - lua_getglobal(__L(), "jit"); - lua_getfield(__L(), -1, "on"); - lua_call(__L(), 0, 0); - - lua_getglobal(__L(), "jit"); - lua_getfield(__L(), -1, "opt"); - lua_getfield(__L(), -1, "start"); - lua_pushstring(__L(), "hotloop=1"); - lua_call(__L(), 1, 0); +# endif #endif } diff --git a/pdlua/hello-gui.pd_lua b/pdlua/hello-gui.pd_lua new file mode 100644 index 0000000..a6dd973 --- /dev/null +++ b/pdlua/hello-gui.pd_lua @@ -0,0 +1,202 @@ +local hello = pd.Class:new():register("hello-gui") + +-- rendering speed (slows down rendering by the given factor) +-- In most cases it should be fine to just set this to 1 to run at full speed, +-- if you have a modern high-speed CPU and GPU. But we use a larger value as +-- default here to deal with low frame rates on some systems. You may have to +-- increase the value even further when running on low-spec systems like the +-- Raspberry Pi. +local R = 3 + +function hello:initialize(sel, atoms) + self.inlets = 1 + + self.circle_x = 485 + self.circle_y = 15 + self.circle_radius = 15 + self.animation_speed = 2*R + self.delay_time = 16*R + + self.draggable_rect_x = 550 + self.draggable_rect_y = 130 + self.draggable_rect_size = 50 + self.dragging_rect = false + self.mouse_down_pos = {0, 0} + self.rect_down_pos = {0, 0} + + self:set_size(850, 230) + return true +end + +function math.clamp(val, lower, upper) + if lower > upper then lower, upper = upper, lower end -- swap if boundaries supplied the wrong way + return math.max(lower, math.min(upper, val)) +end + +function hello:postinitialize() + self.clock = pd.Clock:new():register(self, "tick") + self.clock:delay(self.delay_time) +end + +function hello:finalize() + self.clock:destruct() +end + +function hello:mouse_down(x, y) + if x > self.draggable_rect_x and y > self.draggable_rect_y and x < self.draggable_rect_x + self.draggable_rect_size and y < self.draggable_rect_y + self.draggable_rect_size then + dragging_rect = true + self.mouse_down_pos[0] = x + self.mouse_down_pos[1] = y + self.rect_down_pos[0] = self.draggable_rect_x + self.rect_down_pos[1] = self.draggable_rect_y + else + dragging_rect = false + end +end + +function hello:mouse_drag(x, y) + if dragging_rect == true then + self.draggable_rect_x = self.rect_down_pos[0] + (x - self.mouse_down_pos[0]) + self.draggable_rect_y = self.rect_down_pos[1] + (y - self.mouse_down_pos[1]) + self.draggable_rect_x = math.clamp(self.draggable_rect_x, 0, 710 - self.draggable_rect_size) + self.draggable_rect_y = math.clamp(self.draggable_rect_y, 0, 230 - self.draggable_rect_size) + self:repaint(3) + end +end + +function hello:paint(g) + g:set_color(50, 50, 50) + g:fill_all() + + -- Filled examples + g:set_color(66, 207, 201, 0.3) + g:fill_ellipse(30, 50, 30, 30) + g:set_color(0, 159, 147, 1) + g:fill_rect(120, 50, 30, 30) + g:set_color(250, 84, 108, 1) + g:fill_rounded_rect(210, 50, 30, 30, 5) + + g:set_color(252, 118, 81, 1) + + -- Star using line_to paths + local starX1, starY1 = 310, 45 + local starSize = 15 + + local star = Path(starX1, starY1) + + -- Star using line_to paths + star:line_to(starX1 + 5, starY1 + 14) + star:line_to(starX1 + 20, starY1 + 14) + star:line_to(starX1 + 8, starY1 + 22) + star:line_to(starX1 + 14, starY1 + 36) + star:line_to(starX1, starY1 + 27) + star:line_to(starX1 - 14, starY1 + 36) + star:line_to(starX1 - 6, starY1 + 22) + star:line_to(starX1 - 18, starY1 + 14) + star:line_to(starX1 - 3, starY1 + 14) + star:close() + + g:fill_path(star) + + g:set_color(255, 219, 96, 1) + -- Bezier curve example + g:translate(140, 20) + g:scale(0.5, 1.0) + local curve = Path(450, 50) + curve:cubic_to(500, 30, 550, 70, 600, 50) + curve:close() + g:stroke_path(curve, 2) + g:reset_transform() + + -- Stroked examples + g:set_color(66, 207, 201, 1) + g:stroke_ellipse(30, 150, 30, 30, 2) + g:set_color(0, 159, 147, 1) + g:stroke_rect(120, 150, 30, 30, 2) + g:set_color(250, 84, 108, 1) + g:stroke_rounded_rect(210, 150, 30, 30, 5, 2) + + g:set_color(252, 118, 81, 1) + + local starX2, starY2 = 310, 145 + local starSize = 15 + + -- Star using line_to paths + local star2 = Path(starX2, starY2) + star2:line_to(starX2 + 5, starY2 + 14) + star2:line_to(starX2 + 20, starY2 + 14) + star2:line_to(starX2 + 8, starY2 + 22) + star2:line_to(starX2 + 14, starY2 + 36) + star2:line_to(starX2, starY2 + 27) + star2:line_to(starX2 - 14, starY2 + 36) + star2:line_to(starX2 - 6, starY2 + 22) + star2:line_to(starX2 - 18, starY2 + 14) + star2:line_to(starX2 - 3, starY2 + 14) + star2:close() + g:stroke_path(star2, 2) + + g:set_color(255, 219, 96, 1) + -- Bezier curve example + g:translate(140, 20) + g:scale(0.5, 1.0) + local curve2 = Path(450, 150) + curve2:cubic_to(500, 130, 550, 170, 600, 150) + g:fill_path(curve2) + g:reset_transform() + + -- Titles + g:set_color(252, 118, 81, 1) + g:draw_text("Ellipse", 25, 190, 120, 12) + g:draw_text("Rectangle", 100, 190, 120, 12) + g:draw_text("Rounded Rect", 188, 190, 120, 12) + g:draw_text("Paths", 295, 190, 120, 12) + g:draw_text("Bezier Paths", 360, 190, 120, 12) + g:draw_text("Animation", 460, 190, 120, 12) + g:draw_text(" Mouse\nInteraction", 540, 190, 120, 12) + g:draw_text(" SVG\nRendering", 640, 190, 120, 12) + g:draw_text(" Image\nRendering", 740, 190, 120, 12) +end + +function hello:paint_layer_2(g) + g:set_color(250, 84, 108, 1) + g:fill_ellipse(self.circle_x, self.circle_y, self.circle_radius, self.circle_radius) +end + +function hello:paint_layer_3(g) + -- Draggable rectangle + g:set_color(66, 207, 201, 1) + g:fill_rounded_rect(self.draggable_rect_x, self.draggable_rect_y, self.draggable_rect_size, self.draggable_rect_size, 5) + g:set_color(0, 0, 0, 1) + g:draw_text("Drag\n me!", self.draggable_rect_x + 8, self.draggable_rect_y + 10, self.draggable_rect_size, 12) +end + +function hello:paint_layer_4(g) + -- Draggable rectangle + local svg_demo_1 = [[ + + ]] + + local svg_demo_2 = [[ + + ]] + + g:draw_svg(svg_demo_1, 650, 40) + g:draw_svg(svg_demo_2, 650, 120) + + g:scale(0.8, 0.8) + g:draw_image("examples/pdlogo.gif", 900, 75) +end + +function hello:tick() + self.circle_y = self.circle_y + self.animation_speed + if self.circle_y > 160 + self.circle_radius then + self.circle_y = -self.circle_radius + end + self:repaint(2) + self.clock:delay(self.delay_time) +end + + +function hello:in_1_bang() + self:repaint() +end From 1c2a12b4ca3c1055021585804daf3601205b9679 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Wed, 18 Mar 2026 20:39:58 +0100 Subject: [PATCH 068/109] Include generated headers directly --- Makefile | 9 - luas/lua-compat-headers/compat53_file_mt.h | 166 ++ luas/lua-compat-headers/compat53_init.h | 1000 +++++++++ luas/lua-compat-headers/compat53_module.h | 2343 ++++++++++++++++++++ luas/luajit.c | 20 +- 5 files changed, 3520 insertions(+), 18 deletions(-) create mode 100644 luas/lua-compat-headers/compat53_file_mt.h create mode 100644 luas/lua-compat-headers/compat53_init.h create mode 100644 luas/lua-compat-headers/compat53_module.h diff --git a/Makefile b/Makefile index 28ee614..9c3f04d 100644 --- a/Makefile +++ b/Makefile @@ -75,13 +75,4 @@ else $(MAKE) -C $(luajit_dir) CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.11 endif -# Generate binary data headers for compat53 lua files, so we can load them on init -luas/lua-compat-5.3/compat53/compat53_init.h: luas/lua-compat-5.3/compat53/init.lua - xxd -i $< > $@ -luas/lua-compat-5.3/compat53/compat53_module.h: luas/lua-compat-5.3/compat53/module.lua - xxd -i $< > $@ -luas/lua-compat-5.3/compat53/compat53_file_mt.h: luas/lua-compat-5.3/compat53/file_mt.lua - xxd -i $< > $@ -luas/luajit.$(extension).o: $(compat53_headers) - pdlua.$(extension): $(luajit_lib) diff --git a/luas/lua-compat-headers/compat53_file_mt.h b/luas/lua-compat-headers/compat53_file_mt.h new file mode 100644 index 0000000..e888327 --- /dev/null +++ b/luas/lua-compat-headers/compat53_file_mt.h @@ -0,0 +1,166 @@ +unsigned char lua_compat_5_3_compat53_file_mt_lua[] = { + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x56, 0x45, 0x52, + 0x53, 0x49, 0x4f, 0x4e, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x2d, 0x33, 0x29, + 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4d, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x35, + 0x2e, 0x31, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x28, 0x66, + 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x66, 0x6d, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x66, 0x6d, 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, + 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x2a, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x2a, 0x22, 0x2e, 0x2e, 0x66, 0x6d, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6d, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, + 0x74, 0x35, 0x32, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, + 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, + 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, + 0x64, 0x64, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x28, 0x61, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x65, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, + 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x27, + 0x2a, 0x27, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, 0x65, 0x72, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x61, 0x20, 0x7e, 0x3d, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x2b, 0x31, 0x2c, 0x20, 0x6e, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, + 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x69, 0x73, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x6a, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6e, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x72, + 0x65, 0x61, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x2e, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x69, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x69, 0x73, 0x6b, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, + 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x77, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, + 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x61, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x73, 0x6f, 0x6d, 0x65, + 0x77, 0x68, 0x65, 0x72, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x7e, 0x3d, 0x20, 0x62, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x2e, 0x2e, 0x2e, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, + 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, + 0x2b, 0x31, 0x2c, 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x64, + 0x64, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x28, 0x61, 0x72, + 0x67, 0x73, 0x5b, 0x6a, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x72, + 0x65, 0x61, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x72, + 0x65, 0x61, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, + 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x35, 0x32, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x74, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, + 0x0a +}; +unsigned int lua_compat_5_3_compat53_file_mt_lua_len = 1945; diff --git a/luas/lua-compat-headers/compat53_init.h b/luas/lua-compat-headers/compat53_init.h new file mode 100644 index 0000000..55e817e --- /dev/null +++ b/luas/lua-compat-headers/compat53_init.h @@ -0,0 +1,1000 @@ +unsigned char lua_compat_5_3_compat53_init_lua[] = { + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x56, 0x45, 0x52, + 0x53, 0x49, 0x4f, 0x4e, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x2d, 0x33, 0x29, + 0x0a, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3c, 0x20, 0x22, 0x35, 0x2e, 0x33, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x47, 0x2c, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, + 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x47, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x2c, 0x20, 0x69, 0x6f, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x2c, 0x20, 0x69, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, + 0x75, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x35, 0x2e, 0x31, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4d, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, + 0x73, 0x74, 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, + 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x64, 0x65, 0x62, 0x75, 0x67, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x4c, 0x75, 0x61, 0x27, 0x73, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x20, 0x69, 0x6f, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, + 0x67, 0x6d, 0x74, 0x28, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x6f, 0x75, + 0x74, 0x29, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, + 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x4c, 0x55, 0x41, 0x4a, 0x49, 0x54, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, + 0x45, 0x5f, 0x4c, 0x55, 0x41, 0x35, 0x32, 0x43, 0x4f, 0x4d, 0x50, 0x41, + 0x54, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, + 0x69, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x22, 0x22, 0x29, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, + 0x33, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5c, 0x30, 0x32, 0x37, 0x4c, + 0x4a, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x35, 0x32, 0x20, + 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x73, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, + 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x7d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x0a, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x74, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6d, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x74, 0x2e, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2c, 0x20, + 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x35, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x67, + 0x6f, 0x74, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x4c, 0x75, + 0x61, 0x20, 0x35, 0x2e, 0x31, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x35, 0x2e, 0x31, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x2c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x72, 0x61, 0x77, + 0x73, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x2c, 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x2c, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, + 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x75, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x5f, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, 0x65, + 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x69, 0x6f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x6c, 0x69, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x70, 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6b, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x73, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x22, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0x2c, 0x20, 0x76, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, + 0x77, 0x73, 0x65, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x76, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, + 0x6a, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x28, 0x5f, 0x2c, 0x20, 0x76, 0x61, + 0x72, 0x5f, 0x31, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x2c, 0x20, 0x32, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x28, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x28, + 0x73, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x2e, 0x66, 0x3a, 0x72, 0x65, 0x61, + 0x64, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x73, 0x74, 0x2c, + 0x20, 0x31, 0x2c, 0x20, 0x73, 0x74, 0x2e, 0x6e, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x2c, 0x20, + 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x20, 0x3d, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6d, 0x73, + 0x67, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x6f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x66, + 0x3d, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x3d, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x73, + 0x74, 0x2e, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6d, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x22, 0x5e, 0x2a, 0x3f, 0x28, 0x5b, 0x61, 0x6c, 0x6e, 0x5d, 0x29, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6d, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x62, 0x61, + 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x23, + 0x22, 0x2e, 0x2e, 0x28, 0x69, 0x2b, 0x31, 0x29, 0x2e, 0x2e, 0x22, 0x20, + 0x74, 0x6f, 0x20, 0x27, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x28, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x29, 0x22, 0x2c, + 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x2a, + 0x22, 0x2e, 0x2e, 0x66, 0x6d, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x20, 0x7e, 0x3d, + 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x62, 0x61, 0x64, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x23, 0x22, 0x2e, 0x2e, + 0x28, 0x69, 0x2b, 0x31, 0x29, 0x2e, 0x2e, 0x22, 0x20, 0x74, 0x6f, 0x20, + 0x27, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x27, 0x20, 0x28, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x29, 0x22, 0x2c, 0x20, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, + 0x75, 0x61, 0x6a, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x0a, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x28, 0x78, 0x29, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x61, 0x20, 0x6e, + 0x65, 0x77, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x4c, + 0x75, 0x61, 0x20, 0x35, 0x2e, 0x31, 0x2e, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x63, 0x63, + 0x75, 0x72, 0x61, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x73, 0x20, 0x77, 0x65, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, + 0x74, 0x72, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x65, + 0x61, 0x6b, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x65, + 0x6c, 0x6f, 0x77, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x76, 0x22, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x70, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x2a, 0x73, 0x68, 0x6f, 0x75, + 0x6c, 0x64, 0x2a, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x69, 0x66, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x64, 0x69, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x66, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x6d, 0x61, 0x70, 0x73, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, + 0x69, 0x74, 0x20, 0x28, 0x75, 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x2a, 0x6f, 0x72, 0x2a, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x21, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, + 0x20, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x66, 0x60, 0x2e, 0x20, + 0x6d, 0x61, 0x70, 0x73, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, + 0x6e, 0x20, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, + 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, + 0x20, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x69, 0x6d, + 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x60, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x66, 0x60, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x6f, + 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x28, 0x74, 0x68, + 0x75, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x65, 0x63, 0x65, 0x73, 0x73, 0x61, + 0x72, 0x79, 0x21, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, + 0x7d, 0x2c, 0x20, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x64, 0x65, 0x62, 0x75, 0x67, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x67, 0x65, 0x74, + 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x2e, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x66, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x63, 0x6f, 0x2c, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x31, 0x2f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x63, 0x6f, 0x3d, 0x3d, 0x6e, + 0x69, 0x6c, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x5f, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x5f, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x66, 0x6f, 0x28, + 0x63, 0x6f, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x22, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x61, 0x78, 0x20, 0x3d, 0x20, 0x6f, 0x75, 0x74, 0x2d, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3c, 0x3d, 0x20, + 0x6d, 0x61, 0x78, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2d, 0x6d, + 0x61, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x3d, 0x20, + 0x22, 0x5c, 0x6e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x63, + 0x6f, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x76, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x69, 0x6c, 0x6d, 0x73, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, 0x6f, 0x29, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2c, 0x20, + 0x63, 0x6f, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x73, 0x67, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, + 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x69, + 0x6c, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6d, 0x73, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x20, 0x3d, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, + 0x6b, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x78, 0x70, 0x63, 0x6f, 0x20, 0x3d, 0x20, 0x78, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x5b, 0x63, 0x6f, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x78, 0x70, 0x63, 0x6f, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x76, 0x6c, 0x2c, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x28, 0x78, 0x70, 0x63, 0x6f, 0x2c, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6c, 0x76, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x78, + 0x70, 0x63, 0x6f, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x6c, 0x76, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, + 0x73, 0x67, 0x2e, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x76, 0x6c, 0x2c, 0x20, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x28, 0x63, 0x6f, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6c, 0x76, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x20, 0x3d, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x62, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x6f, 0x2c, 0x20, 0x22, 0x22, 0x2c, + 0x20, 0x6c, 0x76, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, + 0x6d, 0x73, 0x67, 0x2e, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x3a, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x20, 0x3d, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x4f, 0x66, + 0x5b, 0x63, 0x6f, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x76, 0x6c, 0x2c, + 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x63, 0x6f, 0x2c, 0x20, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x76, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, + 0x28, 0x63, 0x6f, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x6c, 0x76, + 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, + 0x73, 0x67, 0x2e, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5b, 0x63, 0x6f, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x63, + 0x6f, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x76, 0x6c, + 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x63, 0x61, + 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x63, 0x6f, 0x2c, 0x20, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x76, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x6f, + 0x2c, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x6c, 0x76, 0x6c, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x2e, 0x2e, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5b, 0x63, 0x6f, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x69, 0x6c, 0x6d, 0x73, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, + 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x5c, + 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, + 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, + 0x5c, 0x74, 0x25, 0x28, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x25, 0x29, 0x3a, 0x20, 0x25, 0x3f, 0x22, 0x2c, 0x20, 0x22, 0x5c, + 0x30, 0x30, 0x30, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, + 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x5c, 0x6e, 0x5c, 0x74, 0x25, 0x2e, 0x25, 0x2e, 0x25, 0x2e, 0x5c, + 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x5c, 0x30, 0x30, 0x31, 0x5c, 0x6e, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, + 0x73, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x6e, 0x5c, + 0x74, 0x25, 0x2e, 0x25, 0x2e, 0x25, 0x2e, 0x24, 0x22, 0x2c, 0x20, 0x22, + 0x5c, 0x30, 0x30, 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, + 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x28, 0x25, 0x7a, 0x2b, 0x29, 0x5c, 0x30, 0x30, 0x31, 0x28, + 0x25, 0x7a, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x6f, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x74, + 0x68, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5c, 0x6e, 0x5c, 0x74, 0x28, + 0x2e, 0x2e, 0x2e, 0x22, 0x2e, 0x2e, 0x23, 0x73, 0x6f, 0x6d, 0x65, 0x2b, + 0x23, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x2e, 0x22, 0x2b, 0x20, 0x74, + 0x61, 0x69, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x29, 0x2e, + 0x2e, 0x2e, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x73, + 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x30, 0x30, 0x31, + 0x28, 0x25, 0x7a, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x5c, 0x6e, 0x5c, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x22, 0x2e, + 0x2e, 0x23, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x2e, 0x2e, 0x22, 0x2b, 0x20, + 0x74, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x29, + 0x2e, 0x2e, 0x2e, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, + 0x73, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x28, 0x25, 0x7a, + 0x2b, 0x29, 0x5c, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x5c, 0x6e, 0x5c, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x22, + 0x2e, 0x2e, 0x23, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x2e, 0x2e, 0x22, 0x2b, + 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x73, + 0x29, 0x2e, 0x2e, 0x2e, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, + 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, 0x7a, + 0x2b, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x5c, 0x6e, + 0x5c, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x22, 0x2e, 0x2e, 0x23, 0x7a, 0x65, + 0x72, 0x6f, 0x73, 0x2e, 0x2e, 0x22, 0x20, 0x74, 0x61, 0x69, 0x6c, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x29, 0x2e, 0x2e, 0x2e, 0x29, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, 0x3a, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x22, 0x5c, 0x30, 0x30, 0x31, 0x22, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, + 0x5c, 0x6e, 0x5c, 0x74, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6d, 0x73, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x20, + 0x2d, 0x2d, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x75, + 0x61, 0x6a, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, + 0x61, 0x6a, 0x69, 0x74, 0x35, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x35, 0x32, 0x20, 0x3d, + 0x20, 0x4d, 0x2e, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x2e, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x2c, 0x20, 0x69, + 0x73, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x35, 0x32, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x6d, + 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x66, 0x5b, 0x63, 0x6f, 0x5d, 0x20, + 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, + 0x6a, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x28, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x2c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, + 0x63, 0x61, 0x6c, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x75, + 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x28, 0x63, 0x61, + 0x6c, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x5f, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x63, + 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5b, + 0x63, 0x61, 0x6c, 0x6c, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x69, + 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x4f, 0x66, 0x5b, 0x63, 0x61, 0x6c, 0x6c, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x3d, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x4f, 0x66, 0x5b, + 0x6d, 0x61, 0x69, 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x63, 0x61, 0x6c, + 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x66, 0x5b, 0x63, 0x61, 0x6c, + 0x6c, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x69, 0x6e, + 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x61, 0x69, + 0x6e, 0x4f, 0x66, 0x5b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5d, + 0x20, 0x6f, 0x72, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x66, + 0x5b, 0x63, 0x61, 0x6c, 0x6c, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x69, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5b, 0x63, 0x61, 0x6c, 0x6c, 0x5d, + 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x4f, 0x66, 0x5b, 0x6d, 0x61, 0x69, 0x6e, 0x5d, 0x20, 0x3d, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, + 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x35, 0x32, + 0x20, 0x3d, 0x20, 0x4d, 0x2e, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x29, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x35, 0x32, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x29, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x78, 0x70, 0x63, + 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x2c, + 0x20, 0x6d, 0x73, 0x67, 0x68, 0x2c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x70, 0x63, 0x61, + 0x6c, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5b, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x61, + 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x6b, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, + 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6d, 0x73, 0x67, 0x68, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x70, 0x63, + 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x6f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x22, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x29, 0x2e, 0x2e, 0x22, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x78, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x68, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x20, + 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, + 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x68, 0x2c, + 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x28, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, + 0x20, 0x35, 0x2e, 0x31, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x2c, 0x20, 0x74, + 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x66, 0x72, 0x6f, 0x6d, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x74, 0x6f, 0x5b, 0x6b, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x6f, 0x5b, 0x6b, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x76, 0x2c, + 0x20, 0x74, 0x6f, 0x5b, 0x6b, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, + 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x4d, 0x2c, 0x20, 0x5f, 0x47, 0x29, 0x0a, + 0x0a, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x20, + 0x3c, 0x20, 0x35, 0x2e, 0x33, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x76, 0x69, + 0x3a, 0x20, 0x73, 0x65, 0x74, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, + 0x74, 0x61, 0x62, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x74, 0x61, 0x62, 0x73, + 0x74, 0x6f, 0x70, 0x3d, 0x33, 0x20, 0x73, 0x68, 0x69, 0x66, 0x74, 0x77, + 0x69, 0x64, 0x74, 0x68, 0x3d, 0x33, 0x20, 0x3a, 0x0a +}; +unsigned int lua_compat_5_3_compat53_init_lua_len = 11961; diff --git a/luas/lua-compat-headers/compat53_module.h b/luas/lua-compat-headers/compat53_module.h new file mode 100644 index 0000000..f5e4041 --- /dev/null +++ b/luas/lua-compat-headers/compat53_module.h @@ -0,0 +1,2343 @@ +unsigned char lua_compat_5_3_compat53_module_lua[] = { + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x47, 0x2c, 0x20, 0x5f, 0x56, + 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x2c, + 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x0a, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, + 0x4f, 0x4e, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x2d, 0x33, 0x29, 0x0a, 0x0a, + 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4d, 0x20, 0x3d, 0x20, 0x5f, + 0x47, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3c, 0x20, 0x22, 0x35, 0x2e, 0x33, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, 0x69, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x73, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x2c, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x2c, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x2c, 0x20, 0x69, 0x6f, 0x2c, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2c, 0x20, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x2c, 0x20, 0x69, 0x6f, 0x2c, 0x20, 0x6d, 0x61, 0x74, + 0x68, 0x2c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x6f, + 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, + 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, + 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69, + 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x35, 0x2e, 0x31, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x4d, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4d, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x5f, 0x47, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x69, 0x73, 0x20, 0x73, 0x65, 0x74, 0x20, 0x61, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x4d, 0x2c, 0x20, 0x4d, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x73, 0x75, 0x62, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x4d, 0x2e, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, + 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x4d, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, + 0x20, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x67, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x67, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x64, 0x65, 0x62, 0x75, 0x67, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x72, + 0x67, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x2c, + 0x20, 0x69, 0x2c, 0x20, 0x66, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x62, 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x23, 0x22, 0x2e, 0x2e, 0x69, 0x2e, + 0x2e, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x22, 0x2e, 0x2e, 0x66, 0x2e, + 0x2e, 0x22, 0x27, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x2e, 0x2e, 0x22, 0x29, 0x22, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x75, 0x74, 0x66, 0x38, 0x20, 0x6c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6f, 0x6b, 0x2c, 0x20, + 0x75, 0x74, 0x66, 0x38, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x70, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, + 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, 0x2e, 0x75, + 0x74, 0x66, 0x38, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x75, + 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x35, 0x2e, 0x31, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x66, + 0x38, 0x6c, 0x69, 0x62, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x22, 0x5b, 0x25, 0x7a, 0x5c, + 0x31, 0x2d, 0x5c, 0x31, 0x32, 0x37, 0x5c, 0x31, 0x39, 0x34, 0x2d, 0x5c, + 0x32, 0x34, 0x34, 0x5d, 0x5b, 0x5c, 0x31, 0x32, 0x38, 0x2d, 0x5c, 0x31, + 0x39, 0x31, 0x5d, 0x2a, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x75, 0x74, 0x66, 0x38, 0x6c, 0x69, 0x62, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4d, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, + 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, 0x75, 0x74, + 0x66, 0x38, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x4d, 0x2e, 0x75, 0x74, 0x66, + 0x38, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x0a, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6f, 0x6b, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x69, + 0x62, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x35, 0x33, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x61, 0x62, 0x6c, + 0x69, 0x62, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, + 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x20, 0x69, 0x6f, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6f, 0x5f, 0x6f, 0x6b, 0x2c, 0x20, 0x69, 0x6f, 0x6c, 0x69, 0x62, 0x20, + 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x35, 0x33, 0x2e, 0x69, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, + 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x69, 0x6f, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x5b, + 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x74, 0x72, 0x5f, 0x6f, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x6c, 0x69, + 0x62, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x35, 0x33, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x5f, + 0x6f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x74, 0x72, 0x6c, 0x69, + 0x62, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5b, + 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x72, 0x79, 0x20, + 0x52, 0x6f, 0x62, 0x65, 0x72, 0x74, 0x6f, 0x27, 0x73, 0x20, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x2f, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, 0x2e, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x72, 0x5f, 0x6f, + 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x5f, 0x6f, 0x6b, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6f, 0x6b, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, + 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, + 0x61, 0x63, 0x6b, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x6d, + 0x61, 0x74, 0x68, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x0a, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, + 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x2b, 0x31, 0x20, 0x3e, + 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x32, 0x2a, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x20, 0x3e, 0x20, 0x6d, + 0x61, 0x78, 0x69, 0x6e, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x20, 0x2a, 0x20, + 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x32, 0x2a, 0x6d, + 0x61, 0x78, 0x69, 0x6e, 0x74, 0x20, 0x3c, 0x3d, 0x20, 0x6d, 0x61, 0x78, + 0x69, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x32, 0x2a, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x2d, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x2d, 0x6d, 0x61, 0x78, + 0x69, 0x6e, 0x74, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6d, + 0x61, 0x78, 0x69, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x2d, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4d, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x69, + 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x6d, + 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x74, + 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x28, 0x6e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x20, 0x3d, + 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6e, 0x20, 0x3c, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x6d, 0x69, + 0x6e, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x20, 0x25, + 0x20, 0x31, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x6d, + 0x61, 0x74, 0x68, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x20, 0x3c, 0x3d, 0x20, 0x6d, 0x61, 0x78, + 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x20, 0x3e, 0x3d, + 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6e, 0x20, 0x25, 0x20, 0x31, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x28, 0x78, 0x2c, 0x20, 0x69, + 0x2c, 0x20, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x7e, 0x3d, + 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x62, 0x61, + 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x23, + 0x22, 0x2e, 0x2e, 0x69, 0x2e, 0x2e, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x27, + 0x22, 0x2e, 0x2e, 0x66, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x27, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x22, 0x2e, 0x2e, 0x74, 0x2e, 0x2e, 0x22, 0x29, 0x22, 0x2c, + 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x78, 0x20, 0x3e, 0x20, + 0x6d, 0x61, 0x78, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x78, 0x20, + 0x3c, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x78, 0x20, 0x25, 0x20, 0x31, 0x20, 0x7e, 0x3d, 0x20, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x62, + 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x23, 0x22, 0x2e, 0x2e, 0x69, 0x2e, 0x2e, 0x22, 0x20, 0x74, 0x6f, 0x20, + 0x27, 0x22, 0x2e, 0x2e, 0x66, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x27, 0x20, 0x28, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x22, 0x2c, 0x20, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x78, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x75, 0x6c, + 0x74, 0x28, 0x6d, 0x2c, 0x20, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x28, 0x6d, 0x2c, + 0x20, 0x22, 0x31, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x74, 0x68, 0x2e, + 0x75, 0x6c, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x28, 0x6e, 0x2c, 0x20, 0x22, + 0x32, 0x22, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x75, 0x6c, + 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6d, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x20, 0x3c, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6d, 0x20, 0x3c, 0x20, 0x30, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x20, 0x3e, 0x3d, 0x20, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6d, 0x20, 0x3c, 0x20, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x2c, + 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x21, + 0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x72, 0x65, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x5f, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x73, 0x74, 0x2c, 0x20, 0x76, + 0x61, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x72, 0x20, 0x2b, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x5b, 0x76, 0x61, 0x72, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x20, + 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x2c, 0x20, + 0x73, 0x74, 0x5b, 0x76, 0x61, 0x72, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x67, 0x6d, + 0x74, 0x28, 0x74, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x20, 0x68, 0x61, + 0x73, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, + 0x74, 0x2c, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x61, 0x64, 0x64, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x28, + 0x66, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x6d, + 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6d, 0x74, 0x3a, 0x73, + 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x20, 0x7e, 0x3d, 0x20, + 0x22, 0x2a, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x22, 0x2a, 0x22, 0x2e, 0x2e, 0x66, 0x6d, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6d, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, 0x72, 0x65, + 0x61, 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, + 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x69, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x28, 0x61, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x65, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x61, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, 0x68, + 0x65, 0x72, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x7e, 0x3d, + 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x2b, + 0x31, 0x2c, 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, + 0x61, 0x64, 0x64, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x28, + 0x61, 0x72, 0x67, 0x73, 0x5b, 0x6a, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x28, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, + 0x50, 0x55, 0x43, 0x2d, 0x52, 0x69, 0x6f, 0x20, 0x4c, 0x75, 0x61, 0x20, + 0x35, 0x2e, 0x31, 0x20, 0x75, 0x73, 0x65, 0x73, 0x20, 0x61, 0x20, 0x64, + 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x21, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, + 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x69, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x28, 0x61, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x65, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x65, 0x20, 0x61, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x61, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x77, + 0x68, 0x65, 0x72, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x7e, + 0x3d, 0x20, 0x62, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, + 0x2b, 0x31, 0x2c, 0x20, 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, + 0x20, 0x61, 0x64, 0x64, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, + 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x6a, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x28, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, + 0x20, 0x31, 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x62, + 0x72, 0x61, 0x72, 0x79, 0x20, 0x28, 0x69, 0x66, 0x20, 0x43, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x65, + 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x6d, 0x74, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, 0x5f, + 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, + 0x69, 0x2c, 0x20, 0x6a, 0x20, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x2c, 0x20, + 0x69, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2c, 0x20, 0x6a, 0x20, 0x6f, 0x72, + 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x28, 0x73, 0x72, + 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x69, + 0x2c, 0x20, 0x6a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x72, 0x63, 0x5b, + 0x6b, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x2c, 0x20, + 0x69, 0x2c, 0x20, 0x6a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x6d, 0x74, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6d, + 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, + 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6c, 0x65, + 0x6e, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x28, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x65, 0x6e, + 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6e, + 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x20, 0x3d, 0x20, + 0x28, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x23, 0x6c, 0x69, 0x73, 0x74, + 0x29, 0x2b, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x72, 0x67, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x28, 0x27, 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x3d, 0x20, 0x65, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, + 0x3d, 0x20, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x28, 0x70, 0x6f, 0x73, 0x2c, 0x20, + 0x22, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x72, 0x67, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x31, 0x20, 0x3c, + 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, + 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x65, 0x2c, 0x20, 0x22, 0x32, 0x22, 0x2c, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x73, 0x22, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x77, + 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x27, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x27, + 0x22, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x65, 0x2d, 0x31, 0x2c, 0x20, 0x70, + 0x6f, 0x73, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x69, 0x2b, 0x31, 0x5d, 0x20, 0x3d, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x70, 0x6f, 0x73, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x61, 0x31, 0x2c, 0x20, + 0x66, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x74, 0x2c, 0x20, 0x61, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x32, + 0x20, 0x3d, 0x20, 0x61, 0x32, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x20, 0x3d, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, + 0x72, 0x28, 0x66, 0x2c, 0x20, 0x22, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x66, 0x20, 0x3e, 0x20, 0x30, 0x2c, + 0x20, 0x22, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x28, 0x65, 0x2c, 0x20, 0x22, 0x33, 0x22, 0x2c, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x76, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x28, 0x74, 0x2c, 0x20, 0x22, 0x34, 0x22, 0x2c, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x76, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x65, 0x20, 0x3e, 0x3d, 0x20, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x2c, 0x20, + 0x6e, 0x2c, 0x20, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x65, 0x2d, + 0x66, 0x2c, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3e, 0x20, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x2c, 0x20, 0x6e, 0x2c, + 0x20, 0x64, 0x20, 0x3d, 0x20, 0x6e, 0x2c, 0x20, 0x6d, 0x2c, 0x20, 0x2d, + 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x6d, 0x2c, 0x20, 0x6e, 0x2c, 0x20, 0x64, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x32, 0x5b, 0x74, 0x2b, 0x69, 0x5d, 0x20, + 0x3d, 0x20, 0x61, 0x31, 0x5b, 0x66, 0x2b, 0x69, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x32, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4d, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x6d, + 0x74, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, + 0x61, 0x73, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6d, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6c, + 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, + 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, + 0x5f, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x68, 0x61, 0x73, + 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x74, 0x2e, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x74, + 0x2e, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x65, 0x20, 0x3d, 0x20, 0x28, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x65, 0x6e, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6c, 0x65, + 0x6e, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x23, + 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, + 0x70, 0x6f, 0x73, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x28, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x22, 0x32, 0x22, + 0x2c, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x7e, 0x3d, 0x20, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x28, 0x31, 0x20, 0x3c, 0x3d, 0x20, 0x70, 0x6f, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3c, 0x3d, 0x20, + 0x65, 0x2b, 0x31, 0x2c, 0x20, 0x22, 0x32, 0x22, 0x2c, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x22, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x70, 0x6f, 0x73, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3c, 0x20, 0x65, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x70, + 0x6f, 0x73, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x70, + 0x6f, 0x73, 0x2b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, + 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x70, 0x6f, 0x73, 0x5d, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, + 0x20, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x69, 0x76, 0x6f, 0x74, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x70, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, + 0x62, 0x20, 0x2d, 0x20, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x20, 0x3e, + 0x20, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x20, 0x2b, + 0x20, 0x28, 0x6d, 0x2d, 0x6d, 0x25, 0x32, 0x29, 0x2f, 0x32, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, + 0x2c, 0x20, 0x7a, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x61, + 0x5d, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x62, 0x5d, 0x2c, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x63, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6d, 0x70, 0x28, 0x78, 0x2c, + 0x20, 0x79, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x61, 0x2c, 0x20, + 0x62, 0x20, 0x3d, 0x20, 0x79, 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x62, 0x2c, + 0x20, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6d, 0x70, 0x28, + 0x79, 0x2c, 0x20, 0x7a, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x79, 0x2c, 0x20, 0x62, 0x20, 0x3d, 0x20, + 0x7a, 0x2c, 0x20, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6d, + 0x70, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x79, 0x2c, 0x20, 0x62, 0x20, + 0x3d, 0x20, 0x78, 0x2c, 0x20, 0x61, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x62, 0x2c, 0x20, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x2c, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x5b, 0x62, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6c, 0x74, 0x5f, 0x63, 0x6d, 0x70, 0x28, 0x61, 0x2c, 0x20, 0x62, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x3c, + 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x71, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x70, 0x2c, 0x20, 0x62, 0x2c, + 0x20, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x20, 0x3c, 0x20, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, 0x20, 0x6b, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x62, 0x2c, 0x20, 0x65, 0x2c, 0x20, + 0x70, 0x69, 0x76, 0x6f, 0x74, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, + 0x63, 0x6d, 0x70, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x20, 0x3c, 0x20, + 0x6a, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6a, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x63, 0x6d, 0x70, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x5b, + 0x69, 0x5d, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6a, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6d, 0x70, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x5b, 0x6a, 0x5d, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x6a, 0x20, 0x2d, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6a, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x5b, 0x6a, 0x5d, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x69, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6b, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x6a, 0x20, 0x65, 0x6e, 0x64, 0x20, + 0x2d, 0x2d, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x70, 0x69, + 0x76, 0x6f, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x2c, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x2b, 0x31, 0x2c, 0x20, 0x6a, 0x2d, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x20, 0x7e, 0x3d, 0x20, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6d, 0x70, 0x28, 0x6c, 0x69, 0x73, 0x74, + 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x5b, 0x69, 0x5d, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x6b, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, + 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x70, 0x69, 0x76, 0x6f, 0x74, 0x20, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x71, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x70, 0x2c, 0x20, 0x62, 0x2c, 0x20, + 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6b, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, + 0x2d, 0x31, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x73, 0x6f, 0x72, 0x74, + 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x70, 0x2c, 0x20, + 0x69, 0x2b, 0x31, 0x2c, 0x20, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x6d, 0x74, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, + 0x61, 0x73, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6d, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, + 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x73, 0x5f, + 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6d, 0x70, 0x20, 0x3d, + 0x20, 0x63, 0x6d, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x74, 0x5f, 0x63, + 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6c, + 0x65, 0x6e, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x71, 0x73, 0x6f, 0x72, 0x74, + 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x70, 0x2c, 0x20, + 0x31, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6d, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x28, + 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6a, 0x20, 0x3c, 0x20, 0x69, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2e, + 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x65, + 0x72, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6a, + 0x2d, 0x31, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x6a, 0x5d, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x6d, 0x74, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x5f, + 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x6c, + 0x65, 0x6e, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6d, 0x74, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x28, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x65, + 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x2c, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2c, + 0x20, 0x6a, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x68, 0x61, 0x73, 0x5f, 0x6c, + 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, + 0x6c, 0x65, 0x6e, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x29, 0x20, 0x6f, + 0x72, 0x20, 0x23, 0x6c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x68, 0x65, + 0x6c, 0x70, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x69, + 0x2c, 0x20, 0x6a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6c, 0x69, 0x73, + 0x74, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x62, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x31, + 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, + 0x29, 0x20, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x65, + 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, + 0x2e, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x75, 0x61, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x35, 0x2e, 0x31, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x20, 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x28, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x4c, 0x55, 0x41, + 0x4a, 0x49, 0x54, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x4c, + 0x55, 0x41, 0x35, 0x32, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, + 0x6c, 0x61, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, + 0x69, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x22, 0x22, 0x29, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, + 0x33, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5c, 0x30, 0x32, 0x37, 0x4c, + 0x4a, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, + 0x35, 0x32, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, + 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x23, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x5f, + 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x7d, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, + 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, + 0x6e, 0x76, 0x2c, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x66, + 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, + 0x2c, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6f, 0x73, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x75, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, + 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x5f, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, 0x65, + 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6f, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, + 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x61, 0x74, 0x68, 0x5f, 0x6c, 0x6f, 0x67, 0x20, 0x3d, 0x20, 0x6d, 0x61, + 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x73, 0x5f, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x73, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x73, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, + 0x70, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, + 0x65, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, + 0x73, 0x75, 0x62, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, + 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x6f, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x6f, 0x73, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x7b, + 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x7d, 0x29, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x65, 0x62, 0x75, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x73, 0x65, 0x74, + 0x66, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x5f, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, + 0x76, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4d, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, + 0x7d, 0x2c, 0x20, 0x7b, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x7d, 0x29, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, + 0x69, 0x74, 0x35, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x2e, 0x73, 0x65, 0x74, 0x75, 0x73, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x6f, 0x62, 0x6a, 0x2c, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6f, 0x62, 0x6a, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x62, 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x23, 0x31, 0x20, 0x74, 0x6f, 0x20, 0x27, + 0x73, 0x65, 0x74, 0x75, 0x73, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x27, 0x20, 0x28, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x20, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x22, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, + 0x62, 0x6a, 0x29, 0x2e, 0x2e, 0x22, 0x29, 0x22, 0x2c, 0x20, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x62, 0x61, + 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x23, + 0x32, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x73, 0x65, 0x74, 0x75, 0x73, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x27, 0x20, 0x28, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2c, + 0x20, 0x67, 0x6f, 0x74, 0x20, 0x22, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2e, 0x2e, 0x22, 0x29, + 0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x65, 0x62, 0x75, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, + 0x28, 0x6f, 0x62, 0x6a, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, + 0x65, 0x74, 0x75, 0x73, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x6f, 0x62, 0x6a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x6f, 0x62, 0x6a, 0x29, 0x20, 0x7e, 0x3d, 0x20, + 0x22, 0x75, 0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x5f, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, 0x6f, + 0x62, 0x6a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x47, 0x20, 0x6f, 0x72, 0x20, + 0x76, 0x20, 0x3d, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4d, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x20, 0x74, 0x61, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, + 0x75, 0x61, 0x6a, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x32, 0x20, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, + 0x6a, 0x69, 0x74, 0x35, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, + 0x20, 0x3d, 0x20, 0x67, 0x6d, 0x74, 0x28, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x74, 0x2e, 0x5f, 0x5f, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, + 0x74, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, + 0x61, 0x6a, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x6d, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x23, 0x6d, 0x6f, 0x64, 0x65, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x73, 0x75, 0x62, + 0x28, 0x69, 0x2c, 0x20, 0x69, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x2e, 0x62, + 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x5c, 0x32, 0x37, 0x22, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x22, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x22, 0x20, 0x6f, 0x72, + 0x20, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x68, 0x61, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x61, 0x20, 0x22, 0x2e, 0x2e, 0x74, + 0x2e, 0x2e, 0x22, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x28, 0x6d, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x27, 0x22, 0x2e, 0x2e, 0x6d, + 0x6f, 0x64, 0x65, 0x2e, 0x2e, 0x22, 0x27, 0x29, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, + 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x6c, 0x64, 0x2c, 0x20, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x65, + 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x62, 0x74, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x6d, 0x73, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x20, 0x6c, 0x64, 0x20, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x62, 0x74, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x6c, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6d, + 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, + 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x64, 0x2c, 0x20, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x64, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6c, + 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x64, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x62, 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x23, 0x31, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x6c, 0x6f, 0x61, + 0x64, 0x27, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x67, + 0x6f, 0x74, 0x20, 0x22, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x64, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x2e, 0x22, 0x29, 0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x62, 0x74, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x65, 0x64, 0x5f, 0x6c, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, + 0x6c, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x6d, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x76, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x28, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x6c, 0x64, + 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6d, + 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x6c, 0x64, + 0x2c, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x7e, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x4d, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x4d, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x62, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x6f, + 0x64, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x62, 0x74, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x72, 0x62, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x66, + 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x65, 0x72, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x72, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6d, 0x73, + 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x6e, 0x76, + 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, + 0x75, 0x61, 0x6a, 0x69, 0x74, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, + 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x35, 0x32, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x72, 0x61, + 0x77, 0x6c, 0x65, 0x6e, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, + 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x62, 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x23, 0x31, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x72, + 0x61, 0x77, 0x6c, 0x65, 0x6e, 0x27, 0x20, 0x28, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x22, 0x2c, 0x20, + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x23, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, + 0x61, 0x6a, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x66, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x68, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, + 0x73, 0x2c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x2e, 0x2e, 0x2e, + 0x20, 0x7d, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, + 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6e, + 0x29, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x68, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, + 0x74, 0x35, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x28, 0x63, 0x6d, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x73, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x28, 0x63, 0x6d, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x31, + 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x62, 0x79, + 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x2e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x69, 0x74, + 0x22, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x73, 0x75, + 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x27, + 0x2f, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x2f, 0x32, 0x35, 0x36, 0x20, 0x2d, 0x2d, 0x20, 0x6f, 0x6e, 0x6c, + 0x79, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x6e, + 0x20, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x21, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x69, 0x74, 0x22, + 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x6b, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, + 0x6a, 0x69, 0x74, 0x35, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x6e, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x27, 0x23, 0x27, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, + 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x62, 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x23, 0x31, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, + 0x22, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x35, 0x32, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4d, 0x2e, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x63, 0x6f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, 0x65, 0x6c, 0x64, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x2c, + 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x22, 0x2c, 0x20, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, + 0x2e, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x72, + 0x65, 0x73, 0x75, 0x6d, 0x65, 0x28, 0x63, 0x6f, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x20, 0x3d, 0x3d, 0x20, + 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, + 0x20, 0x22, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, + 0x75, 0x6d, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, 0x75, 0x73, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x72, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, + 0x28, 0x63, 0x6f, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x28, 0x63, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x6f, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x63, + 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x6f, 0x74, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x22, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x28, 0x63, 0x6f, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x75, 0x61, 0x6a, + 0x69, 0x74, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, + 0x6a, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4d, 0x2e, 0x6d, 0x61, 0x74, 0x68, + 0x2e, 0x6c, 0x6f, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x78, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x7e, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x5f, + 0x6c, 0x6f, 0x67, 0x28, 0x78, 0x29, 0x2f, 0x6d, 0x61, 0x74, 0x68, 0x5f, + 0x6c, 0x6f, 0x67, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x6c, 0x6f, 0x67, 0x28, 0x78, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, + 0x61, 0x6a, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x70, 0x61, 0x74, 0x68, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2c, + 0x20, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x65, 0x70, 0x20, 0x6f, 0x72, + 0x20, 0x22, 0x2e, 0x22, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, + 0x28, 0x25, 0x70, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x25, 0x25, 0x31, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x72, 0x65, + 0x70, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x73, 0x75, 0x62, 0x28, + 0x31, 0x2c, 0x20, 0x31, 0x29, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x22, 0x28, 0x25, 0x25, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x25, 0x25, + 0x31, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, + 0x73, 0x75, 0x62, 0x28, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x72, 0x65, 0x70, + 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x28, 0x25, 0x25, 0x29, + 0x22, 0x2c, 0x20, 0x22, 0x25, 0x25, 0x25, 0x31, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x75, 0x62, 0x70, 0x61, 0x74, + 0x68, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5e, 0x3b, 0x5d, 0x2b, 0x22, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x73, 0x75, + 0x62, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, + 0x25, 0x3f, 0x22, 0x2c, 0x20, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, + 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x70, 0x61, + 0x74, 0x68, 0x2c, 0x20, 0x22, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x70, 0x61, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5b, 0x23, + 0x6d, 0x73, 0x67, 0x2b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x6e, + 0x5c, 0x74, 0x6e, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x27, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x27, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, 0x73, + 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x66, 0x69, 0x78, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x28, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, + 0x22, 0x25, 0x7a, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x25, 0x7a, 0x22, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, + 0x6e, 0x64, 0x28, 0x73, 0x2c, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x29, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x73, 0x2c, 0x20, + 0x66, 0x69, 0x78, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x28, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4d, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x73, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x73, 0x75, 0x62, 0x28, 0x73, + 0x2c, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x73, 0x2c, + 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x73, 0x2c, 0x20, 0x66, + 0x69, 0x78, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x28, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x72, 0x65, 0x70, 0x28, + 0x73, 0x2c, 0x20, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x73, 0x65, 0x70, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x70, 0x20, 0x7e, 0x3d, 0x20, + 0x22, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x20, 0x3e, 0x3d, 0x20, + 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x70, 0x28, 0x73, 0x65, 0x70, + 0x2e, 0x2e, 0x73, 0x2c, 0x20, 0x6e, 0x2d, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x70, 0x28, + 0x73, 0x2c, 0x20, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, + 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x71, + 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x5c, + 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x6e, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x5c, 0x5c, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5b, 0x22, 0x5c, 0x22, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x5c, + 0x5c, 0x5c, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x64, 0x64, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x28, 0x63, 0x2c, 0x20, + 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x61, 0x64, 0x64, 0x71, 0x74, 0x5b, 0x63, 0x5d, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x28, 0x64, 0x7e, 0x3d, 0x22, 0x22, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x22, 0x5c, 0x5c, 0x25, 0x30, 0x33, 0x64, 0x22, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x5c, 0x5c, 0x25, 0x64, 0x22, 0x2c, 0x20, 0x63, 0x3a, + 0x62, 0x79, 0x74, 0x65, 0x28, 0x29, 0x29, 0x29, 0x2e, 0x2e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4d, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x66, 0x6d, 0x74, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, + 0x6a, 0x75, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x74, 0x28, 0x6c, 0x65, 0x61, + 0x64, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x73, 0x2c, 0x20, 0x6b, 0x69, 0x6e, + 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x23, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x25, 0x20, 0x32, 0x20, 0x3d, 0x3d, + 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6b, 0x69, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, + 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x2e, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6b, 0x69, 0x6e, 0x64, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x27, 0x22, + 0x27, 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x73, + 0x75, 0x62, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x2c, 0x20, + 0x22, 0x28, 0x5b, 0x25, 0x7a, 0x25, 0x63, 0x5c, 0x5c, 0x5c, 0x22, 0x5c, + 0x6e, 0x5d, 0x29, 0x28, 0x25, 0x64, 0x3f, 0x29, 0x22, 0x2c, 0x20, 0x61, + 0x64, 0x64, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x29, 0x2e, 0x2e, 0x27, + 0x22, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x65, + 0x61, 0x64, 0x2e, 0x2e, 0x22, 0x25, 0x22, 0x2e, 0x2e, 0x6d, 0x6f, 0x64, + 0x73, 0x2e, 0x2e, 0x22, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x67, 0x73, 0x75, 0x62, 0x28, 0x66, 0x6d, + 0x74, 0x2c, 0x20, 0x22, 0x28, 0x25, 0x25, 0x2a, 0x29, 0x25, 0x25, 0x28, + 0x5b, 0x25, 0x64, 0x25, 0x2e, 0x25, 0x2d, 0x25, 0x2b, 0x25, 0x23, 0x20, + 0x5d, 0x2a, 0x29, 0x28, 0x25, 0x61, 0x29, 0x22, 0x2c, 0x20, 0x61, 0x64, + 0x6a, 0x75, 0x73, 0x74, 0x5f, 0x66, 0x6d, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x66, 0x6d, + 0x74, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, + 0x67, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x6e, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x65, + 0x72, 0x28, 0x73, 0x74, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x72, + 0x5f, 0x31, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x2e, + 0x64, 0x6f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x73, 0x74, 0x2e, 0x66, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x2c, + 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, + 0x72, 0x5f, 0x31, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x28, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x28, 0x73, 0x74, 0x2c, 0x20, + 0x73, 0x74, 0x2e, 0x66, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x73, 0x74, 0x2c, 0x20, 0x31, 0x2c, 0x20, + 0x73, 0x74, 0x2e, 0x6e, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x6d, 0x73, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x6f, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x72, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x32, 0x29, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, + 0x69, 0x6f, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x66, 0x3d, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x64, 0x6f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x3d, 0x64, 0x6f, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x6e, 0x3d, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x27, 0x23, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x74, 0x2e, 0x6e, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, 0x5b, 0x69, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, + 0x5b, 0x69, 0x5d, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, + 0x25, 0x2a, 0x3f, 0x28, 0x5b, 0x61, 0x6c, 0x6e, 0x5d, 0x29, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x66, 0x6d, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x62, 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x23, 0x22, 0x2e, 0x2e, 0x28, 0x69, 0x2b, 0x31, + 0x29, 0x2e, 0x2e, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x28, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x29, 0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x2a, 0x22, + 0x2e, 0x2e, 0x66, 0x6d, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x74, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x62, 0x61, 0x64, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x20, 0x23, 0x22, 0x2e, 0x2e, 0x28, 0x69, 0x2b, 0x31, 0x29, 0x2e, 0x2e, + 0x22, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x28, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x29, + 0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x2c, 0x20, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x6c, 0x75, 0x61, 0x6a, 0x69, 0x74, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, + 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, + 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x35, 0x33, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x5b, 0x22, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, 0x2e, 0x69, 0x6e, 0x69, + 0x74, 0x22, 0x5d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x60, 0x63, + 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, 0x2e, 0x69, 0x6e, 0x69, 0x74, + 0x60, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x77, 0x65, + 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x49, + 0x4c, 0x45, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, + 0x20, 0x60, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, 0x2e, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x60, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x74, + 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x2c, 0x20, 0x68, 0x6f, 0x77, 0x65, 0x76, + 0x65, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, + 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, + 0x65, 0x6e, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x2d, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, + 0x4c, 0x75, 0x61, 0x4a, 0x49, 0x54, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x43, 0x20, 0x41, 0x50, 0x49, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x20, 0x23, 0x37, 0x30, 0x29, 0x2e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x57, 0x65, 0x20, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, + 0x20, 0x4c, 0x75, 0x61, 0x20, 0x35, 0x2e, 0x33, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x2c, + 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, + 0x20, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x62, 0x79, + 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x60, 0x4c, 0x55, 0x41, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, + 0x54, 0x35, 0x33, 0x5f, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, + 0x4d, 0x45, 0x54, 0x41, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, + 0x45, 0x60, 0x20, 0x74, 0x6f, 0x20, 0x60, 0x74, 0x72, 0x75, 0x65, 0x60, + 0x2c, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x60, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x74, 0x35, 0x33, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x60, 0x2e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x75, 0x73, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x61, 0x72, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x6c, + 0x75, 0x61, 0x6a, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, + 0x73, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x47, 0x2e, 0x4c, 0x55, + 0x41, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x35, 0x33, 0x5f, 0x4e, + 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x5f, + 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x75, 0x73, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x61, 0x72, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x6c, 0x6c, + 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, + 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5b, 0x6b, 0x5d, 0x20, + 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x74, 0x5f, 0x6f, 0x6b, + 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x74, 0x20, 0x3d, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x35, 0x33, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x74, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x74, 0x5f, 0x6f, 0x6b, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6d, 0x74, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x75, 0x61, 0x6a, 0x69, + 0x74, 0x35, 0x32, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x32, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x5f, 0x66, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x64, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x64, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, + 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x20, 0x3d, 0x20, 0x67, 0x6d, 0x74, 0x28, 0x66, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, + 0x66, 0x64, 0x28, 0x69, 0x6f, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x2e, + 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x66, 0x64, 0x28, 0x69, 0x6f, + 0x5f, 0x70, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x2e, 0x69, + 0x6f, 0x2e, 0x74, 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x66, 0x64, 0x28, 0x69, 0x6f, 0x5f, 0x74, + 0x6d, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x6c, + 0x75, 0x61, 0x20, 0x35, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x2d, + 0x2d, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, + 0x65, 0x20, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x20, + 0x74, 0x6f, 0x20, 0x5f, 0x47, 0x0a, 0x20, 0x20, 0x20, 0x4d, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x2e, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x0a, 0x0a, 0x65, 0x6e, 0x64, + 0x20, 0x2d, 0x2d, 0x20, 0x6c, 0x75, 0x61, 0x20, 0x3c, 0x20, 0x35, 0x2e, + 0x33, 0x0a, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x0a, + 0x0a, 0x2d, 0x2d, 0x20, 0x76, 0x69, 0x3a, 0x20, 0x73, 0x65, 0x74, 0x20, + 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x74, 0x61, 0x62, 0x20, 0x73, 0x6f, + 0x66, 0x74, 0x74, 0x61, 0x62, 0x73, 0x74, 0x6f, 0x70, 0x3d, 0x33, 0x20, + 0x73, 0x68, 0x69, 0x66, 0x74, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x33, + 0x20, 0x3a, 0x0a +}; +unsigned int lua_compat_5_3_compat53_module_lua_len = 28071; diff --git a/luas/luajit.c b/luas/luajit.c index 0376bf8..3918f92 100644 --- a/luas/luajit.c +++ b/luas/luajit.c @@ -4,28 +4,30 @@ #include "luajit/src/lauxlib.h" #include "luajit/src/lualib.h" +#define LUAMOD_API + // Include 5.3 C-API compatibility layer #include "lua-compat-5.3/c-api/compat-5.3.h" // Include 5.3 lua compatibility layer -#include "lua-compat-5.3/compat53/compat53_init.h" -#include "lua-compat-5.3/compat53/compat53_module.h" -#include "lua-compat-5.3/compat53/compat53_file_mt.h" +#include "lua-compat-headers/compat53_init.h" +#include "lua-compat-headers/compat53_module.h" +#include "lua-compat-headers/compat53_file_mt.h" static void preload_compat53(lua_State *L) { lua_getglobal(L, "package"); lua_getfield(L, -1, "preload"); - luaL_loadbuffer(L, (const char*)luas_lua_compat_5_3_compat53_init_lua, - luas_lua_compat_5_3_compat53_init_lua_len, "compat53"); + luaL_loadbuffer(L, (const char*)lua_compat_5_3_compat53_init_lua, + lua_compat_5_3_compat53_init_lua_len, "compat53"); lua_setfield(L, -2, "compat53"); - luaL_loadbuffer(L, (const char*)luas_lua_compat_5_3_compat53_module_lua, - luas_lua_compat_5_3_compat53_module_lua_len, "compat53.module"); + luaL_loadbuffer(L, (const char*)lua_compat_5_3_compat53_module_lua, + lua_compat_5_3_compat53_module_lua_len, "compat53.module"); lua_setfield(L, -2, "compat53.module"); - luaL_loadbuffer(L, (const char*)luas_lua_compat_5_3_compat53_file_mt_lua, - luas_lua_compat_5_3_compat53_file_mt_lua_len, "compat53.file_mt"); + luaL_loadbuffer(L, (const char*)lua_compat_5_3_compat53_file_mt_lua, + lua_compat_5_3_compat53_file_mt_lua_len, "compat53.file_mt"); lua_setfield(L, -2, "compat53.file_mt"); lua_pop(L, 2); From 1b7bf5b1b42a81eeea95bc520fbcea36c65bef64 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 19 Mar 2026 00:01:17 +0100 Subject: [PATCH 069/109] Fix multi-instance support: add backup system when lua file was loaded under a different instance --- pdlua.c | 92 +++++++++++++++++++++++++++ pdlua/tutorial/examples/properties.pd | 2 - 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/pdlua.c b/pdlua.c index 3d7c813..6057c30 100644 --- a/pdlua.c +++ b/pdlua.c @@ -46,6 +46,11 @@ #include // for open #include #endif + +#ifdef PDINSTANCE +#include +#endif + #include "pdlua.h" #include "s_stuff.h" // for sys_register_loader() @@ -126,6 +131,47 @@ static t_signal_setmultiout g_signal_setmultiout; #ifdef PDINSTANCE +static int pdlua_loader_wrappath(int fd, const char *name, const char *dirbuf); + +typedef struct pdlua_script { + char dirbuf[MAXPDSTRING]; + char name[MAXPDSTRING]; // full name as passed to wrappath (may have path prefix) + struct pdlua_script *next; +} pdlua_script_t; + +static pdlua_script_t *pdlua_loaded_scripts = NULL; + +static pthread_mutex_t pdlua_scripts_mutex = PTHREAD_MUTEX_INITIALIZER; + +static void pdlua_record_script(const char *name, const char *dirbuf) { + pdlua_script_t *s = getbytes(sizeof(*s)); + strncpy(s->dirbuf, dirbuf, MAXPDSTRING-1); + strncpy(s->name, name, MAXPDSTRING-1); + pthread_mutex_lock(&pdlua_scripts_mutex); + s->next = pdlua_loaded_scripts; + pdlua_loaded_scripts = s; + pthread_mutex_unlock(&pdlua_scripts_mutex); +} + +static pdlua_script_t* pdlua_find_script(t_symbol *s) +{ + pdlua_script_t *found = NULL; + pthread_mutex_lock(&pdlua_scripts_mutex); + for (pdlua_script_t *s2 = pdlua_loaded_scripts; s2; s2 = s2->next) + { + const char *basenamep = strrchr(s2->name, '/'); + basenamep = basenamep ? basenamep + 1 : s2->name; + if (strcmp(basenamep, s->s_name) == 0) + { + found = s2; + break; + } + } + pthread_mutex_unlock(&pdlua_scripts_mutex); + return found; +} + + typedef struct _lua_Instance { void* pd_instance; lua_State* state; @@ -850,6 +896,45 @@ static t_pdlua *pdlua_new } else { +#ifdef PDINSTANCE + // Search recorded scripts for a matching basename + pdlua_script_t *found = pdlua_find_script(s); + if (found) + { + const char *basenamep = strrchr(found->name, '/'); + basenamep = basenamep ? basenamep + 1 : found->name; + char filepath[MAXPDSTRING]; + snprintf(filepath, MAXPDSTRING-1, "%s/%s%s", found->dirbuf, basenamep, LUA_FILE_EXTENSION); + + int fd = sys_open(filepath, O_RDONLY); + if (fd >= 0) + { + pdlua_loader_wrappath(fd, found->name, found->dirbuf); + // Retry constructor + lua_getglobal(__L(), "pd"); + lua_getfield(__L(), -1, "_constructor"); + lua_pushstring(__L(), s->s_name); + pdlua_pushatomtable(argc, argv); + if (lua_pcall(__L(), 2, 1, 0)) + { + mylua_error(__L(), NULL, "constructor"); + lua_pop(__L(), 1); + return NULL; + } + if (lua_islightuserdata(__L(), -1)) + { + object = lua_touserdata(__L(), -1); + lua_pop(__L(), 2); + return object; + } + lua_pop(__L(), 2); + } + else + { + pd_error(NULL, "pdlua: can't reopen %s for new instance", filepath); + } + } +#endif lua_pop(__L(), 2);/* pop the userdata and the global "pd" */ PDLUA_DEBUG("pdlua_new: done FALSE lua_islightuserdata(L, -1)", 0); return NULL; @@ -3074,6 +3159,9 @@ static int pdlua_loader_wrappath } lua_pop(__L(), 1); sys_close(fd); + + if (result) + pdlua_record_script(name, dirbuf); } return result; } @@ -3236,6 +3324,10 @@ void pdlua_instance_setup() PDLUA_DEBUG("pdlua lua_open done L = %p", L); init_pdlua_environment(L, pdlua_datadir); #endif +#ifndef LUA_USE_JIT + void pdluajit_instance_setup(); + pdluajit_instance_setup(); +#endif } diff --git a/pdlua/tutorial/examples/properties.pd b/pdlua/tutorial/examples/properties.pd index 5fb7aa5..275678a 100644 --- a/pdlua/tutorial/examples/properties.pd +++ b/pdlua/tutorial/examples/properties.pd @@ -1,6 +1,5 @@ #N canvas 849 44 951 1016 10; #X declare -lib pdlua; -#X declare -lib pdluajit; #X obj 784 43 declare -lib pdlua; #X obj 33 87 props; #X text 25 18 pdlua's properties allow you to add properties panels to both text and gui pdlua objects.; @@ -19,4 +18,3 @@ #X text 366 665 -- Add a section with a title. This is required before adding properties. Properties get added to the last defined frame. The column argument is ignored for plugdata \; -- Add a checkbox property \; -- Add a text input property \; -- Add a color picker property \; -- Add a floating-point number property \; -- Add an integer number property \; -- Add a combo box property \, options should be a list of items in curly brackets, f 104; #X text 33 397 p:add_text("Text 1" \, "updatetext1" \, self.textinput1), f 61; #X text 30 629 -- Functions you can call \; pd:Class:properties(p) \; \; p:new_frame(name \, column) \; \; p:add_check(label \, callback \, init) \; p:add_text(label \, callback \, init) \; p:add_color(label \, callback \, init) \; p:add_float(label \, callback \, init \, min=-inf \, max=inf) \; p:add_int(label \, callback \, init \, min=-inf \, max=inf) \; p:add_combo(label \, callback \, init \, options) \;; -#X obj 766 85 declare -lib pdluajit; From f81df222939f837186463ed875806ac5e0804737 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 19 Mar 2026 01:46:25 +0100 Subject: [PATCH 070/109] plugdata fix --- luas/luajit.c | 4 ++++ pdlua.c | 2 ++ 2 files changed, 6 insertions(+) diff --git a/luas/luajit.c b/luas/luajit.c index 3918f92..0e4b335 100644 --- a/luas/luajit.c +++ b/luas/luajit.c @@ -58,4 +58,8 @@ static void preload_compat53(lua_State *L) { #define pdlua_setup pdluajit_setup #define pdlua_datadir pdluajit_datadir +#ifdef PLUGDATA +#define plugdata_register_class plugdata_register_class_jit +#endif + #include "../pdlua.c" diff --git a/pdlua.c b/pdlua.c index 6057c30..9aee8c6 100644 --- a/pdlua.c +++ b/pdlua.c @@ -3160,8 +3160,10 @@ static int pdlua_loader_wrappath lua_pop(__L(), 1); sys_close(fd); +#ifdef PDINSTANCE if (result) pdlua_record_script(name, dirbuf); +#endif } return result; } From e9e649e12e4af0710ef8632a2bb00349b50a7977 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 19 Mar 2026 02:07:32 +0100 Subject: [PATCH 071/109] Fix for Windows --- pdlua.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pdlua.c b/pdlua.c index 9aee8c6..f3e285a 100644 --- a/pdlua.c +++ b/pdlua.c @@ -3239,11 +3239,6 @@ static int pdlua_loader_pathwise #define xstr(s) str(s) #define str(s) #s -/** Start the Lua runtime and register our loader hook. */ -#ifdef _WIN32 -__declspec(dllexport) -#endif - static int init_pdlua_environment(lua_State* L, const char* datadir) { char pd_lua_path[MAXPDSTRING]; @@ -3332,7 +3327,9 @@ void pdlua_instance_setup() #endif } - +#ifdef _WIN32 +__declspec(dllexport) +#endif #ifdef PLUGDATA void pdlua_setup(const char *datadir, char *versbuf, int versbuf_length, void(*register_class_callback)(const char*)) #else From 9757c5beab195259a5d10a5b7d9573d6804edb43 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 19 Mar 2026 11:42:49 +0100 Subject: [PATCH 072/109] Cleaner backup mechanism for multi-instance loading --- pdlua.c | 126 +++++++++++++------------------------------------------- 1 file changed, 29 insertions(+), 97 deletions(-) diff --git a/pdlua.c b/pdlua.c index f3e285a..5d845c2 100644 --- a/pdlua.c +++ b/pdlua.c @@ -47,10 +47,6 @@ #include #endif -#ifdef PDINSTANCE -#include -#endif - #include "pdlua.h" #include "s_stuff.h" // for sys_register_loader() @@ -131,46 +127,7 @@ static t_signal_setmultiout g_signal_setmultiout; #ifdef PDINSTANCE -static int pdlua_loader_wrappath(int fd, const char *name, const char *dirbuf); - -typedef struct pdlua_script { - char dirbuf[MAXPDSTRING]; - char name[MAXPDSTRING]; // full name as passed to wrappath (may have path prefix) - struct pdlua_script *next; -} pdlua_script_t; - -static pdlua_script_t *pdlua_loaded_scripts = NULL; - -static pthread_mutex_t pdlua_scripts_mutex = PTHREAD_MUTEX_INITIALIZER; - -static void pdlua_record_script(const char *name, const char *dirbuf) { - pdlua_script_t *s = getbytes(sizeof(*s)); - strncpy(s->dirbuf, dirbuf, MAXPDSTRING-1); - strncpy(s->name, name, MAXPDSTRING-1); - pthread_mutex_lock(&pdlua_scripts_mutex); - s->next = pdlua_loaded_scripts; - pdlua_loaded_scripts = s; - pthread_mutex_unlock(&pdlua_scripts_mutex); -} - -static pdlua_script_t* pdlua_find_script(t_symbol *s) -{ - pdlua_script_t *found = NULL; - pthread_mutex_lock(&pdlua_scripts_mutex); - for (pdlua_script_t *s2 = pdlua_loaded_scripts; s2; s2 = s2->next) - { - const char *basenamep = strrchr(s2->name, '/'); - basenamep = basenamep ? basenamep + 1 : s2->name; - if (strcmp(basenamep, s->s_name) == 0) - { - found = s2; - break; - } - } - pthread_mutex_unlock(&pdlua_scripts_mutex); - return found; -} - +static int pdlua_loader_pathwise(t_canvas *canvas, const char *objectname, const char *path); typedef struct _lua_Instance { void* pd_instance; @@ -188,12 +145,11 @@ static lua_State* __L(void) return iter->state; iter = iter->next; } - return NULL; /* should never happen */ + return NULL; } static lua_State* create_lua_state(void) { - /* Always a fresh, fully independent state – never lua_newthread. */ lua_State* L = luaL_newstate(); if (!L) return NULL; @@ -214,7 +170,6 @@ static lua_State* create_lua_state(void) static void destroy_lua_state(void) { - /* Walk the list and remove the node for the current pd instance. */ lua_Instance** pp = &lua_instances; while (*pp) { if ((*pp)->pd_instance == pd_this) { @@ -228,7 +183,7 @@ static void destroy_lua_state(void) } } -#else /* !PDINSTANCE – single global state */ +#else static lua_State* __lua_state = NULL; @@ -241,7 +196,7 @@ static lua_State* create_lua_state(void) return __lua_state; } -#endif /* PDINSTANCE */ +#endif // class_new class names need to use gensym of the global pure-data instance static t_symbol* global_gensym(const char* s) @@ -896,47 +851,31 @@ static t_pdlua *pdlua_new } else { + lua_pop(__L(), 2);/* pop the userdata and the global "pd" */ + PDLUA_DEBUG("pdlua_new: done FALSE lua_islightuserdata(L, -1)", 0); #ifdef PDINSTANCE - // Search recorded scripts for a matching basename - pdlua_script_t *found = pdlua_find_script(s); - if (found) + // In multi-instance mode, it's possible that this particular instance has not loaded the lua file yet, so if we fail to construct, + // we try to look for the lua file again + pdlua_loader_pathwise(canvas_getcurrent(), s->s_name, canvas_getcurrentdir()->s_name); + + lua_getglobal(__L(), "pd"); + lua_getfield(__L(), -1, "_constructor"); + lua_pushstring(__L(), s->s_name); + pdlua_pushatomtable(argc, argv); + if (lua_pcall(__L(), 2, 1, 0)) { - const char *basenamep = strrchr(found->name, '/'); - basenamep = basenamep ? basenamep + 1 : found->name; - char filepath[MAXPDSTRING]; - snprintf(filepath, MAXPDSTRING-1, "%s/%s%s", found->dirbuf, basenamep, LUA_FILE_EXTENSION); - - int fd = sys_open(filepath, O_RDONLY); - if (fd >= 0) - { - pdlua_loader_wrappath(fd, found->name, found->dirbuf); - // Retry constructor - lua_getglobal(__L(), "pd"); - lua_getfield(__L(), -1, "_constructor"); - lua_pushstring(__L(), s->s_name); - pdlua_pushatomtable(argc, argv); - if (lua_pcall(__L(), 2, 1, 0)) - { - mylua_error(__L(), NULL, "constructor"); - lua_pop(__L(), 1); - return NULL; - } - if (lua_islightuserdata(__L(), -1)) - { - object = lua_touserdata(__L(), -1); - lua_pop(__L(), 2); - return object; - } - lua_pop(__L(), 2); - } - else - { - pd_error(NULL, "pdlua: can't reopen %s for new instance", filepath); - } + mylua_error(__L(), NULL, "constructor"); + lua_pop(__L(), 1); + return NULL; + } + if (lua_islightuserdata(__L(), -1)) + { + object = lua_touserdata(__L(), -1); + lua_pop(__L(), 2); + return object; } + lua_pop(__L(), 2); #endif - lua_pop(__L(), 2);/* pop the userdata and the global "pd" */ - PDLUA_DEBUG("pdlua_new: done FALSE lua_islightuserdata(L, -1)", 0); return NULL; } } @@ -3159,11 +3098,6 @@ static int pdlua_loader_wrappath } lua_pop(__L(), 1); sys_close(fd); - -#ifdef PDINSTANCE - if (result) - pdlua_record_script(name, dirbuf); -#endif } return result; } @@ -3377,13 +3311,11 @@ void pdlua_setup(void) #if PLUGDATA plugdata_register_class = register_class_callback; - snprintf(versbuf, versbuf_length-1, -#ifdef ELSE - "pdlua %s ELSE (lua %d.%d)", +#if LUA_USE_JIT + snprintf(versbuf, versbuf_length-1, " (luajit %d.%d)", lvm, lvl); #else - "pdlua %s (lua %d.%d)", + snprintf(versbuf, versbuf_length-1, "pdlua %s (lua %d.%d)", pdlua_version, lvm, lvl); #endif - pdlua_version, lvm, lvl); #endif // post version and other information post(pdluaver); @@ -3487,7 +3419,7 @@ void pdlua_setup(void) #ifndef LUA_USE_JIT #ifdef PLUGDATA void pdluajit_setup(const char *datadir, char *versbuf, int versbuf_length, void(*register_class_callback)(const char*)); - pdluajit_setup(datadir, versbuf, versbuf_length, register_class_callback); + pdluajit_setup(datadir, versbuf + strlen(versbuf), versbuf_length - strlen(versbuf), register_class_callback); #else void pdluajit_setup(); pdluajit_setup(); From 987068cf0cad1b226633bfdf8fffcca33f1009c8 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Thu, 19 Mar 2026 13:50:57 +0100 Subject: [PATCH 073/109] Windows build fix --- Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 9c3f04d..66172e6 100644 --- a/Makefile +++ b/Makefile @@ -39,8 +39,8 @@ luaflags += -DLUA_USE_WINDOWS endef endif -luajit_dir = ./luas/luajit -luajit_lib = $(luajit_dir)/src/libluajit.a +luajit_dir = ./luas/luajit/src +luajit_lib = $(luajit_dir)/libluajit.a cflags = $(luaflags) -DPDLUA_VERSION="$(pdlua_version)" ifdef PD_MULTICHANNEL @@ -69,8 +69,7 @@ compat53_headers = \ $(luajit_lib): ifeq ($(system), Windows) - $(MAKE) -C $(luajit_dir) SHELL=cmd - mv $(luajit_dir)/src/libluajit-5.1.dll.a $(luajit_lib) + $(MAKE) -C $(luajit_dir) SHELL=cmd BUILDMODE=static else $(MAKE) -C $(luajit_dir) CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.11 endif From d40b3378950acf1adbeb1ed2a2f5989a22dfcfc7 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 11:29:28 +0100 Subject: [PATCH 074/109] Add luajit support to pdx.lua, update helpfiles --- pdlua-help.pd | 4 ++-- pdlua/tutorial/examples/luajit.pd | 4 ++-- pdlua/tutorial/examples/pdx.lua | 10 +++++----- pdluajit-help.pd | 27 +++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 pdluajit-help.pd diff --git a/pdlua-help.pd b/pdlua-help.pd index 8a69dbe..2364ca8 100644 --- a/pdlua-help.pd +++ b/pdlua-help.pd @@ -1,4 +1,4 @@ -#N canvas 466 44 561 610 10; +#N canvas 1 45 580 590 10; #X declare -lib pdlua -path pdlua; #X declare -path pdlua/examples; #X text 16 358 See also:; @@ -171,7 +171,7 @@ #X connect 117 0 112 0; #X connect 118 0 110 0; #X restore 446 359 pd quickstart; -#N canvas 264 71 1254 926 graphics 1; +#N canvas 1 45 1124 880 graphics 0; #X obj 8 77 hello-gui; #X text 8 376 function yourclass:initialize(sel \, atoms); #X text 24 409 return true; diff --git a/pdlua/tutorial/examples/luajit.pd b/pdlua/tutorial/examples/luajit.pd index 89e19ac..9784979 100644 --- a/pdlua/tutorial/examples/luajit.pd +++ b/pdlua/tutorial/examples/luajit.pd @@ -1,4 +1,4 @@ -#N canvas 33 78 1057 730 12; +#N canvas 1 45 580 590 12; #X declare -lib pdlua; #X obj 830 39 declare -lib pdlua; #X obj 66 245 bng 25 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; @@ -30,7 +30,7 @@ #X obj 611 394 pdluajit; #X msg 611 366 load luajit-ffi.lua; #X text 53 359 Additionally \, pdluajit has the ability to directly interface with C functions \, using its FFI (Foreign Function Interface) abilities. You can use this to load shared libraries and call functions from it \, or directly interface with pure-data's API functions., f 75; -#X text 769 362 <- Directly interface with Pd's API to print audio device into to the console, f 31; +#X text 769 362 <- Directly interface with Pd's API to print audio device info to the console, f 31; #X connect 1 0 20 0; #X connect 2 0 19 0; #X connect 28 0 27 0; diff --git a/pdlua/tutorial/examples/pdx.lua b/pdlua/tutorial/examples/pdx.lua index cb75f01..d40e593 100644 --- a/pdlua/tutorial/examples/pdx.lua +++ b/pdlua/tutorial/examples/pdx.lua @@ -169,8 +169,8 @@ function pdx.unreload(self) for obj, data in pairs(reloadables[self._name]) do if type(obj) == "table" and obj ~= self then -- install the receiver - data.recv = pd.Receive:new():register(obj, "pdluax", "_pdluax") - obj._pdluax = pdluax + data.recv = pd.Receive:new():register(obj, jit and "pdluaxjit" or "pdluax", jit and "_pdluaxjit" or "_pdluax") + obj[jit and "_pdluaxjit" or "_pdluax"] = pdluax -- record that we have a new receiver and bail out current = obj break @@ -179,7 +179,7 @@ function pdx.unreload(self) reloadables[self._name].current = current -- get rid of the old receiver reloadables[self._name][self].recv:destruct() - self._pdluax = nil + self[jit and "_pdluaxjit" or "_pdluax"] = nil; end -- restore the object's finalize method self.finalize = reloadables[self._name][self].finalize @@ -215,8 +215,8 @@ function pdx.reload(self) self.finalize = finalize -- add the receiver reloadables[self._name][self].recv = - pd.Receive:new():register(self, "pdluax", "_pdluax") - self._pdluax = pdluax + pd.Receive:new():register(self, jit and "pdluaxjit" or "pdluax", jit and "_pdluaxjit" or "_pdluax") + self[jit and "_pdluaxjit" or "_pdluax"] = pdluax end end diff --git a/pdluajit-help.pd b/pdluajit-help.pd new file mode 100644 index 0000000..3c81b33 --- /dev/null +++ b/pdluajit-help.pd @@ -0,0 +1,27 @@ +#N canvas 1 45 1124 880 10; +#X obj 2 309 cnv 3 550 3 empty empty inlets 8 12 0 13 #dcdcdc #000000 0; +#X obj 2 344 cnv 3 550 3 empty empty outlets 8 12 0 13 #dcdcdc #000000 0; +#X obj 2 379 cnv 3 550 3 empty empty arguments 8 12 0 13 #dcdcdc #000000 0; +#X obj 141 318 cnv 17 3 17 empty empty 0 5 9 0 16 #dcdcdc #9c9c9c 0; +#X obj 2 412 cnv 15 552 21 empty empty empty 20 12 0 14 #e0e0e0 #202020 0; +#X text 241 354 NONE; +#X text 241 389 NONE; +#X text 175 319 load ; +#X obj 306 4 cnv 15 250 40 empty empty empty 12 13 0 18 #7c7c7c #e0e4dc 0; +#N canvas 382 141 749 319 (subpatch) 0; +#X coords 0 -1 1 1 249 39 2 100 100; +#X restore 305 3 pd; +#X obj 315 18 cnv 10 10 10 empty empty Load\ externals\ written\ in\ Lua 0 6 2 20 #7c7c7c #e0e4dc 0; +#X obj 3 3 cnv 15 301 42 empty empty pdluajit 20 20 2 37 #e0e0e0 #000000 0; +#N canvas 0 22 450 278 (subpatch) 0; +#X coords 0 1 100 -1 299 39 1 0 0; +#X restore 3 3 graph; +#X text 259 319 - load and run a '*.lua' file; +#X obj 55 269 pdluajit; +#X obj 424 233 pdluaxjit; +#X text 191 235 <-- load and run a Lua file; +#X msg 55 236 load hello-gui.pd_lua; +#X msg 424 263 \; pdluaxjit reload; +#X text 20 149 [pdluajit] uses LuaJIT (v2.1) \, which is based on Lua 5.1. A compatibility layer (compat53) is included \, providing partial support for Lua 5.2/5.3 features \, though not all newer syntax is available. LuaJIT runs in a separate environment from the standard [pdlua] loader. Global variables and state are not shared between the two systems., f 87; +#X text 20 68 [pdluajit] offers an alternative Lua loader to [pdlua] \, based on LuaJIT instead of Lua. LuaJIT offers a few advantages over regular Lua \, such as significantly better performance and FFI (Foreign Function Interface) capabilities. Lua externals with the .pd_luajit will automatically get picked up by [pdluajit] instead of [pdlua]. Comparitively \, the regular [pdlua] object offers more modern Lua syntax than [pdluajit] and better standard compliance, f 87; +#X connect 17 0 14 0; From 121fe922593226a7423a5897b4519dce8648547d Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 14:39:34 +0100 Subject: [PATCH 075/109] Fix bug when object gets recreated at same address (glitch during LAC2025 live demo) --- pdlua.c | 16 +++++++++------- pdlua_gfx.h | 3 +-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pdlua.c b/pdlua.c index 5d845c2..13d537e 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1661,13 +1661,7 @@ static int pdlua_object_creategui(lua_State *L) t_text *x = (t_text*)o; int reinit = lua_tonumber(L, 2); if (!o->pdlua_class_gfx) return 0; // we're not supposed to be here... - // We may need to redraw the object in case it's been reloaded, to get the - // iolets and patch cords fixed. - int redraw = reinit && o->pd.te_binbuf && gobj_shouldvis(&o->pd.te_g, o->canvas) && glist_isvisible(o->canvas); - if (redraw) { - gobj_vis(&o->pd.te_g, o->canvas, 0); - } - o->has_gui = 1; + // We need to switch classes mid-flight here. This is a bit of a hack, but // we want to retain the standard text widgetbehavior for regular // (non-gui) objects. As soon as we create the gui here, we switch over to @@ -1675,6 +1669,14 @@ static int pdlua_object_creategui(lua_State *L) // that it has our custom widgetbehavior for gui objects. x->te_pd = o->pdlua_class_gfx; gfx_initialize(o); + + // We may need to redraw the object in case it's been reloaded, to get the + // iolets and patch cords fixed. + int redraw = reinit && o->pd.te_binbuf && gobj_shouldvis(&o->pd.te_g, o->canvas) && glist_isvisible(o->canvas); + if (redraw) { + gobj_vis(&o->pd.te_g, o->canvas, 0); + } + o->has_gui = 1; if (redraw) { // force object and its iolets to be redrawn gobj_vis(&o->pd.te_g, o->canvas, 1); diff --git a/pdlua_gfx.h b/pdlua_gfx.h index e332acc..c526fcc 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -333,7 +333,6 @@ static void pdlua_gfx_clear(t_pdlua *obj, int layer, int removed) { static int gfx_initialize(t_pdlua *obj) { obj->gfx.object = obj; - pdlua_gfx_repaint(obj, 0); // Initial repaint return 0; } @@ -791,10 +790,10 @@ static int gfx_initialize(t_pdlua *obj) gfx->transforms = NULL; gfx->num_transforms = 0; gfx->num_layers = 0; + gfx->first_draw = 0; gfx->layer_tags = NULL; gfx->mouse_inside = 0; - pdlua_gfx_repaint(obj, 0); return 0; } From b606f6a980b330ada922aa3db431254d1f7ebc53 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 14:48:24 +0100 Subject: [PATCH 076/109] Remove nonsensical comment --- pdlua/hello-gui.pd_lua | 1 - 1 file changed, 1 deletion(-) diff --git a/pdlua/hello-gui.pd_lua b/pdlua/hello-gui.pd_lua index a6dd973..38217c0 100644 --- a/pdlua/hello-gui.pd_lua +++ b/pdlua/hello-gui.pd_lua @@ -171,7 +171,6 @@ function hello:paint_layer_3(g) end function hello:paint_layer_4(g) - -- Draggable rectangle local svg_demo_1 = [[ ]] From c22ddb94b4d2bc00cd844d6b74c6578c8abf1a8f Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 14:49:17 +0100 Subject: [PATCH 077/109] Fix typo: -tag should be -tags --- pdlua_gfx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index c526fcc..b2668a6 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -1167,7 +1167,7 @@ static int fill_rounded_rect(lua_State* L) { pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "oval", x2 - radius_x * 2 , y1, x2, y1 + radius_y * 2, "-width", 0, "-fill", gfx->current_color, "-tags", 3, tags); pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "oval", x1, y2 - radius_y * 2, x1 + radius_x * 2, y2, "-width", 0, "-fill", gfx->current_color, "-tags", 3, tags); pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "oval", x2 - radius_x * 2, y2 - radius_y * 2, x2, y2, "-width", 0, "-fill", gfx->current_color, "-tags", 3, tags); - pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "rectangle", x1 + radius_x, y1, x2 - radius_x, y2, "-width", 0, "-fill", gfx->current_color, "-tag", 3, tags); + pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "rectangle", x1 + radius_x, y1, x2 - radius_x, y2, "-width", 0, "-fill", gfx->current_color, "-tags", 3, tags); pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "rectangle", x1, y1 + radius_y, x2, y2 - radius_y, "-width", 0, "-fill", gfx->current_color, "-tags", 3, tags); #else // PURR_DATA int x0 = text_xpix((t_object*)obj, obj->canvas); From af1bbc5e12920077dd9833e92cbf4d896c0278fc Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 14:50:04 +0100 Subject: [PATCH 078/109] Don't pop after mylua_error --- pdlua_properties.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index 9fca3c9..c39af73 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -283,7 +283,6 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol * IGNORE_UNUSED(s), i if (lua_pcall(__L(), 3, 0, 0)) { mylua_error(__L(), o, "_set_properties"); // Handle error - lua_pop(__L(), 1); // Pop error message return; } } @@ -1010,7 +1009,6 @@ static void pdlua_properties_apply(t_pdlua *o) if (lua_pcall(L, 3, 0, 0)) { mylua_error(L, o, "_set_properties"); - lua_pop(L, 1); } } From 28c6b07ca0e04be439e87104fd8296c8fdfb6b17 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 14:51:22 +0100 Subject: [PATCH 079/109] Allow checkbox to take either a bool or int value --- pdlua_properties.h | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index c39af73..e047ae1 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -85,6 +85,17 @@ static inline void plugdata_add_property(lua_State* L, const char* sym, const ch atom_idx++; break; } + case 'b': { + t_float val; + if (lua_isboolean(L, lua_idx)) { + val = (t_float)lua_toboolean(L, lua_idx); + } else { + val = (t_float)luaL_checknumber(L, lua_idx); + } + SETFLOAT (&atoms[atom_idx], val); + atom_idx++; + break; + } case 'F': { SETFLOAT (&atoms[atom_idx], (t_float)luaL_optnumber(L, lua_idx, va_arg(defaults, double))); atom_idx++; @@ -184,7 +195,7 @@ static int pdlua_properties_newframe(lua_State *L) static int pdlua_properties_addcheck(lua_State *L) { - plugdata_add_property(L, "add_check_property", "ssf"); + plugdata_add_property(L, "add_check_property", "ssb"); return 0; } @@ -547,7 +558,12 @@ static int pdlua_properties_addcheck(lua_State *L) t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); const char *text = luaL_checkstring(L, 2); const char *method = luaL_checkstring(L, 3); - int init_value = luaL_checknumber(L, 4); + int init_value; + if (lua_isboolean(L, 4)) { + init_value = lua_toboolean(L, 4); + } else { + init_value = (int)luaL_checknumber(L, 4); + } #ifndef PURR_DATA if(!pdlua->properties.current_frame) From a97318ed3590bba4170fad8453a969e77b7755d0 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 14:51:41 +0100 Subject: [PATCH 080/109] Fix plugdata text drawing argument defect --- pdlua_gfx.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index b2668a6..5d303bb 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -429,7 +429,7 @@ static int draw_line(lua_State* L) { } static int draw_text(lua_State* L) { - plugdata_draw_args(L, "lua_draw_text", "sffffFF", 12.f, 0.0f); + plugdata_draw_args(L, "lua_draw_text", "sfffFF", 12.f, 0.0f); return 0; } From 80ddebf3be1209c0d2c829b4ed83e0e5f8fa254b Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 15:01:35 +0100 Subject: [PATCH 081/109] Remove useless outer table when passing properties --- pdlua/tutorial/examples/properties.pd | 3 ++ pdlua/tutorial/examples/props.pd_lua | 41 +++++++++++---------------- pdlua_properties.h | 20 ++++--------- 3 files changed, 25 insertions(+), 39 deletions(-) diff --git a/pdlua/tutorial/examples/properties.pd b/pdlua/tutorial/examples/properties.pd index 275678a..a03717d 100644 --- a/pdlua/tutorial/examples/properties.pd +++ b/pdlua/tutorial/examples/properties.pd @@ -18,3 +18,6 @@ #X text 366 665 -- Add a section with a title. This is required before adding properties. Properties get added to the last defined frame. The column argument is ignored for plugdata \; -- Add a checkbox property \; -- Add a text input property \; -- Add a color picker property \; -- Add a floating-point number property \; -- Add an integer number property \; -- Add a combo box property \, options should be a list of items in curly brackets, f 104; #X text 33 397 p:add_text("Text 1" \, "updatetext1" \, self.textinput1), f 61; #X text 30 629 -- Functions you can call \; pd:Class:properties(p) \; \; p:new_frame(name \, column) \; \; p:add_check(label \, callback \, init) \; p:add_text(label \, callback \, init) \; p:add_color(label \, callback \, init) \; p:add_float(label \, callback \, init \, min=-inf \, max=inf) \; p:add_int(label \, callback \, init \, min=-inf \, max=inf) \; p:add_combo(label \, callback \, init \, options) \;; +#X obj 560 120 props2; +#X msg 570 325 \; pdluax reload; +#X msg 633 381 \; pdluaxjit reload; diff --git a/pdlua/tutorial/examples/props.pd_lua b/pdlua/tutorial/examples/props.pd_lua index c566b26..84ef098 100644 --- a/pdlua/tutorial/examples/props.pd_lua +++ b/pdlua/tutorial/examples/props.pd_lua @@ -46,54 +46,47 @@ function properties:properties(p) end function properties:updatecolorbg(args) - self.color[1] = args[1][1] - self.color[2] = args[1][2] - self.color[3] = args[1][3] + self.color[1] = args[1] + self.color[2] = args[2] + self.color[3] = args[3] self:repaint(1) end -function properties:updatetext1(args) - self.textinput1 = args[1] +function properties:updatetext1(textval) + self.textinput1 = textval pd.post("textinput1 is now " .. self.textinput1); end -function properties:updatetext2(args) - self.textinput2 = args[1] +function properties:updatetext2(textval) + self.textinput2 = textval pd.post("textinput2 is now " .. self.textinput2); end -function properties:updatecheckbox1(args) - self.checkbox1 = args[1] +function properties:updatecheckbox1(checkval) + self.checkbox1 = checkval pd.post("checkbox1 is now " .. self.checkbox1); end -function properties:updatecheckbox2(args) - self.checkbox2 = args[1] +function properties:updatecheckbox2(checkval) + self.checkbox2 = checkval pd.post("checkbox2 is now " .. self.checkbox2); end - -function properties:updatefloat(args) - self.float = args[1] +function properties:updatefloat(flonum) + self.float = flonum pd.post("float is now " .. self.float); end -function properties:updateint(args) - self.int = args[1] +function properties:updateint(intnum) + self.int = intnum pd.post("int is now " .. self.int); end -function properties:updatecombo(args) - self.combo = args[1] +function properties:updatecombo(combosel) + self.combo = combosel pd.post("combo is now " .. self.combo); end -function properties:updatecheckbox2(args) - self.checkbox2 = args[1] - pd.post("checkbox2 is now " .. self.checkbox2); -end - - function properties:paint(g) g:set_color(table.unpack(self.color)) g:fill_all() diff --git a/pdlua_properties.h b/pdlua_properties.h index e047ae1..8456a22 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -240,7 +240,6 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol * IGNORE_UNUSED(s), i lua_pushlightuserdata(__L(), o); lua_pushstring(__L(), atom_getsymbol(argv + 1)->s_name); - lua_newtable(__L()); const char *guitype = atom_getsymbol(argv)->s_name; if (strcmp(guitype, "colorpicker") == 0) @@ -270,7 +269,6 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol * IGNORE_UNUSED(s), i lua_rawseti(__L(), -2, 2); lua_pushinteger(__L(), b); lua_rawseti(__L(), -2, 3); - lua_rawseti(__L(), -2, 1); } else { pd_error(o, "Invalid color format in sscanf"); return; @@ -281,19 +279,17 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol * IGNORE_UNUSED(s), i if (argv[i].a_type == A_FLOAT) { lua_pushnumber(__L(), atom_getfloat(argv + i)); - lua_rawseti(__L(), -2, i - 1); // Store at index (1-based in Lua) } else if (argv[i].a_type == A_SYMBOL) { lua_pushstring(__L(), atom_getsymbol(argv + i)->s_name); - lua_rawseti(__L(), -2, i - 1); } } } if (lua_pcall(__L(), 3, 0, 0)) { - mylua_error(__L(), o, "_set_properties"); // Handle error + mylua_error(__L(), o, "_set_properties"); return; } } @@ -995,7 +991,6 @@ static void pdlua_properties_apply(t_pdlua *o) lua_pushlightuserdata(L, o); lua_pushstring(L, entry->method); - lua_newtable(L); if (strcmp(entry->guitype, "colorpicker") == 0) { @@ -1007,19 +1002,14 @@ static void pdlua_properties_apply(t_pdlua *o) lua_pushinteger(L, r); lua_rawseti(L, -2, 1); lua_pushinteger(L, g); lua_rawseti(L, -2, 2); lua_pushinteger(L, b); lua_rawseti(L, -2, 3); - lua_rawseti(L, -2, 1); } } else { - for (int j = 0; j < entry->argc; j++) - { - if (entry->argv[j].a_type == A_FLOAT) - lua_pushnumber(L, atom_getfloat(&entry->argv[j])); - else - lua_pushstring(L, atom_getsymbol(&entry->argv[j])->s_name); - lua_rawseti(L, -2, j + 1); - } + if (entry->argv[0].a_type == A_FLOAT) + lua_pushnumber(L, atom_getfloat(&entry->argv[0])); + else + lua_pushstring(L, atom_getsymbol(&entry->argv[0])->s_name); } if (lua_pcall(L, 3, 0, 0)) From 5d7b3a37f4747b810d302c902dae236b0a07f8b5 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 15:26:21 +0100 Subject: [PATCH 082/109] Windows: fix conflict between Unix and NT find --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 66172e6..36cd5f5 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,7 @@ datafiles = \ # the 'pdlua' directory contains subdirectories (with subdirs), # so we need to list all of them -datadirs = $(shell find pdlua -type d) +datadirs = $(shell /usr/bin/find pdlua -type d) PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder From 9a0faccf366c4858cf99d468b47c48d222c91492 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 16:07:03 +0100 Subject: [PATCH 083/109] Prevent random name clash between pdlua and pdluajit by using different random seeds --- pdlua_gfx.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 5d303bb..c2fed86 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -510,7 +510,11 @@ static int reset_transform(lua_State* L) { static unsigned long long custom_rand() { // We use a custom random function to ensure proper randomness across all OS +#ifdef LUA_USE_JIT // Make sure they use different random seeds, to prevent name clashes + static unsigned long long seed = 1; +#else static unsigned long long seed = 0; +#endif const unsigned long long a = 1664525; const unsigned long long c = 1013904223; const unsigned long long m = 4294967296; // 2^32 From 202b6880745957ebdb71b1d27791fefeb3fbdd59 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 16:10:49 +0100 Subject: [PATCH 084/109] Code style consistency: space before pointer --- pdlua_gfx.h | 232 ++++++++++++++++++++++++++-------------------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index c2fed86..4089814 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -71,36 +71,36 @@ static int gfx_initialize(t_pdlua *obj); static int set_size(lua_State *L); static int get_size(lua_State *L); static int start_paint(lua_State *L); -static int end_paint(lua_State* L); +static int end_paint(lua_State *L); -static int set_color(lua_State* L); +static int set_color(lua_State *L); -static int fill_ellipse(lua_State* L); -static int stroke_ellipse(lua_State* L); -static int fill_all(lua_State* L); -static int fill_rect(lua_State* L); -static int stroke_rect(lua_State* L); -static int fill_rounded_rect(lua_State* L); -static int stroke_rounded_rect(lua_State* L); +static int fill_ellipse(lua_State *L); +static int stroke_ellipse(lua_State *L); +static int fill_all(lua_State *L); +static int fill_rect(lua_State *L); +static int stroke_rect(lua_State *L); +static int fill_rounded_rect(lua_State *L); +static int stroke_rounded_rect(lua_State *L); -static int draw_line(lua_State* L); -static int draw_text(lua_State* L); -static int draw_svg(lua_State* L); -static int draw_image(lua_State* L); +static int draw_line(lua_State *L); +static int draw_text(lua_State *L); +static int draw_svg(lua_State *L); +static int draw_image(lua_State *L); -static int start_path(lua_State* L); -static int line_to(lua_State* L); -static int quad_to(lua_State* L); -static int cubic_to(lua_State* L); -static int close_path(lua_State* L); -static int stroke_path(lua_State* L); -static int fill_path(lua_State* L); +static int start_path(lua_State *L); +static int line_to(lua_State *L); +static int quad_to(lua_State *L); +static int cubic_to(lua_State *L); +static int close_path(lua_State *L); +static int stroke_path(lua_State *L); +static int fill_path(lua_State *L); -static int translate(lua_State* L); -static int scale(lua_State* L); -static int reset_transform(lua_State* L); +static int translate(lua_State *L); +static int scale(lua_State *L); +static int reset_transform(lua_State *L); -static int free_path(lua_State* L); +static int free_path(lua_State *L); // pdlua_gfx_clear, pdlua_gfx_repaint and pdlua_gfx_mouse_* correspond to the various callbacks the user can assign @@ -195,7 +195,7 @@ void pdlua_gfx_mouse_exit(t_pdlua *x, int xpos, int ypos) { typedef struct _path_state { // Variables for managing vector paths - float* path_segments; + float *path_segments; int num_path_segments; int num_path_segments_allocated; float path_start_x, path_start_y; @@ -203,7 +203,7 @@ typedef struct _path_state // Pops the graphics context off the argument list and returns it -static t_pdlua_gfx *pop_graphics_context(lua_State* L) +static t_pdlua_gfx *pop_graphics_context(lua_State *L) { t_pdlua_gfx **ud = (t_pdlua_gfx**)luaL_checkudata(L, 1, "GraphicsContext"); lua_remove(L, 1); @@ -250,7 +250,7 @@ static const luaL_Reg gfx_methods[] = { {NULL, NULL} // Sentinel to end the list }; -int pdlua_gfx_setup(lua_State* L) { +int pdlua_gfx_setup(lua_State *L) { // for Path(x, y) constructor lua_pushcfunction(L, start_path); lua_setglobal(L, "Path"); @@ -272,7 +272,7 @@ int pdlua_gfx_setup(lua_State* L) { return 1; // Number of values pushed onto the stack } -static int get_size(lua_State* L) +static int get_size(lua_State *L) { if (!lua_islightuserdata(L, 1)) { return 0; @@ -291,14 +291,14 @@ static int get_size(lua_State* L) static PERTHREAD void(*plugdata_draw_callback)(void*, int, t_symbol*, int, t_atom*) = NULL; // Wrapper around draw callback to plugdata -static inline void plugdata_draw(t_pdlua *obj, int layer, t_symbol* sym, int argc, t_atom* argv) +static inline void plugdata_draw(t_pdlua *obj, int layer, t_symbol *sym, int argc, t_atom *argv) { if(plugdata_draw_callback) { plugdata_draw_callback(obj, layer, sym, argc, argv); } } -static inline void plugdata_draw_args(lua_State* L, const char* sym, const char *fmt, ...) +static inline void plugdata_draw_args(lua_State *L, const char *sym, const char *fmt, ...) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_atom atoms[16]; @@ -336,7 +336,7 @@ static int gfx_initialize(t_pdlua *obj) return 0; } -static int set_size(lua_State* L) +static int set_size(lua_State *L) { if (!lua_islightuserdata(L, 1)) return 0; @@ -351,7 +351,7 @@ static int set_size(lua_State* L) return 0; } -static int start_paint(lua_State* L) { +static int start_paint(lua_State *L) { if (!lua_islightuserdata(L, 1)) { lua_pushboolean(L, 0); // Return false if the argument is not a pointer return 1; @@ -370,7 +370,7 @@ static int start_paint(lua_State* L) { return 1; } -static int end_paint(lua_State* L) { +static int end_paint(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; plugdata_draw(obj, gfx->current_layer, gensym("lua_end_paint"), 0, NULL); @@ -378,7 +378,7 @@ static int end_paint(lua_State* L) { return 0; } -static int set_color(lua_State* L) { +static int set_color(lua_State *L) { if (lua_gettop(L) == 2) { // Single argument: parse as color ID instead of RGB plugdata_draw_args(L, "lua_set_color", "f"); return 0; @@ -388,68 +388,68 @@ static int set_color(lua_State* L) { return 0; } -static int fill_ellipse(lua_State* L) { +static int fill_ellipse(lua_State *L) { plugdata_draw_args(L, "lua_fill_ellipse", "ffff"); return 0; } -static int stroke_ellipse(lua_State* L) { +static int stroke_ellipse(lua_State *L) { plugdata_draw_args(L, "lua_stroke_ellipse", "ffffF", 1.0); return 0; } -static int fill_all(lua_State* L) { +static int fill_all(lua_State *L) { plugdata_draw_args(L, "lua_fill_all", ""); return 0; } -static int fill_rect(lua_State* L) { +static int fill_rect(lua_State *L) { plugdata_draw_args(L, "lua_fill_rect", "ffff"); return 0; } -static int stroke_rect(lua_State* L) { +static int stroke_rect(lua_State *L) { plugdata_draw_args(L, "lua_stroke_rect", "ffffF", 1.0f); return 0; } -static int fill_rounded_rect(lua_State* L) { +static int fill_rounded_rect(lua_State *L) { plugdata_draw_args(L, "lua_fill_rounded_rect", "fffff"); return 0; } -static int stroke_rounded_rect(lua_State* L) { +static int stroke_rounded_rect(lua_State *L) { plugdata_draw_args(L, "lua_stroke_rounded_rect", "fffffF", 1.0f); return 0; } -static int draw_line(lua_State* L) { +static int draw_line(lua_State *L) { plugdata_draw_args(L, "lua_draw_line", "ffffF", 1.0f); return 0; } -static int draw_text(lua_State* L) { +static int draw_text(lua_State *L) { plugdata_draw_args(L, "lua_draw_text", "sfffFF", 12.f, 0.0f); return 0; } -static int draw_svg(lua_State* L) { +static int draw_svg(lua_State *L) { plugdata_draw_args(L, "lua_draw_svg", "sff"); return 0; } -static int draw_image(lua_State* L) { +static int draw_image(lua_State *L) { plugdata_draw_args(L, "lua_draw_image", "sff"); return 0; } -static int stroke_path(lua_State* L) { +static int stroke_path(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; t_canvas *cnv = glist_getcanvas(obj->canvas); - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); int stroke_width = luaL_optnumber(L, 2, 1.0f) * glist_getzoom(cnv); // optional, default to 1.0 int coordinates_size = (2 * path->num_path_segments + 2) * sizeof(t_atom); @@ -468,13 +468,13 @@ static int stroke_path(lua_State* L) { return 0; } -static int fill_path(lua_State* L) { +static int fill_path(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; t_canvas *cnv = glist_getcanvas(obj->canvas); - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); int coordinates_size = (2 * path->num_path_segments + 2) * sizeof(t_atom); t_atom* coordinates = getbytes(coordinates_size); @@ -491,17 +491,17 @@ static int fill_path(lua_State* L) { return 0; } -static int translate(lua_State* L) { +static int translate(lua_State *L) { plugdata_draw_args(L, "lua_translate", "ff"); return 0; } -static int scale(lua_State* L) { +static int scale(lua_State *L) { plugdata_draw_args(L, "lua_scale", "ff"); return 0; } -static int reset_transform(lua_State* L) { +static int reset_transform(lua_State *L) { plugdata_draw_args(L, "lua_reset_transform", ""); return 0; } @@ -540,7 +540,7 @@ static void generate_random_id(char *str, size_t len) { str[len - 1] = '\0'; } -static void transform_size(t_pdlua_gfx *gfx, int* w, int* h) { +static void transform_size(t_pdlua_gfx *gfx, int *w, int *h) { for(int i = gfx->num_transforms - 1; i >= 0; i--) { if(gfx->transforms[i].type == SCALE) @@ -551,7 +551,7 @@ static void transform_size(t_pdlua_gfx *gfx, int* w, int* h) { } } -static void transform_point(t_pdlua_gfx *gfx, int* x, int* y) { +static void transform_point(t_pdlua_gfx *gfx, int *x, int *y) { for(int i = gfx->num_transforms - 1; i >= 0; i--) { if(gfx->transforms[i].type == SCALE) @@ -567,7 +567,7 @@ static void transform_point(t_pdlua_gfx *gfx, int* x, int* y) { } } -static void transform_size_float(t_pdlua_gfx *gfx, float* w, float* h) { +static void transform_size_float(t_pdlua_gfx *gfx, float *w, float *h) { for(int i = gfx->num_transforms - 1; i >= 0; i--) { if(gfx->transforms[i].type == SCALE) @@ -578,7 +578,7 @@ static void transform_size_float(t_pdlua_gfx *gfx, float* w, float* h) { } } -static void transform_point_float(t_pdlua_gfx *gfx, float* x, float* y) { +static void transform_point_float(t_pdlua_gfx *gfx, float *x, float *y) { for(int i = gfx->num_transforms - 1; i >= 0; i--) { if(gfx->transforms[i].type == SCALE) @@ -734,7 +734,7 @@ static void pdlua_gfx_clear(t_pdlua *obj, int layer, int removed) { glist_eraseiofor(obj->canvas, &obj->pd, gfx->object_tag); } -static void get_bounds_args(lua_State* L, t_pdlua *obj, int* x1, int* y1, int* x2, int* y2) { +static void get_bounds_args(lua_State *L, t_pdlua *obj, int *x1, int *y1, int *x2, int *y2) { t_canvas *cnv = glist_getcanvas(obj->canvas); int x = luaL_checknumber(L, 1); @@ -772,7 +772,7 @@ static void gfx_displace(t_pdlua *x, t_glist *glist, int dx, int dy) glist_drawiofor(x->canvas, (t_object*)x, 0, x->gfx.object_tag, xpos, ypos, xpos + (x->gfx.width * scale), ypos + (x->gfx.height * scale)); } -static const char* register_drawing(t_pdlua_gfx *gfx) +static const char *register_drawing(t_pdlua_gfx *gfx) { generate_random_id(gfx->current_item_tag, 64); return gfx->current_item_tag; @@ -801,7 +801,7 @@ static int gfx_initialize(t_pdlua *obj) return 0; } -static int set_size(lua_State* L) +static int set_size(lua_State *L) { if (!lua_islightuserdata(L, 1)) return 0; @@ -816,13 +816,13 @@ static int set_size(lua_State* L) return 0; } -static int start_paint(lua_State* L) { +static int start_paint(lua_State *L) { if (!lua_islightuserdata(L, 1)) { lua_pushnil(L); return 1; } - t_pdlua* obj = (t_pdlua*)lua_touserdata(L, 1); + t_pdlua *obj = (t_pdlua*)lua_touserdata(L, 1); t_pdlua_gfx *gfx = &obj->gfx; if(gfx->object_tag[0] == '\0') @@ -914,7 +914,7 @@ static int start_paint(lua_State* L) { t_canvas *cnv = glist_getcanvas(obj->canvas); generate_random_id(gfx->order_tag, 64); - const char* tags[] = { gfx->order_tag }; + const char *tags[] = { gfx->order_tag }; pdgui_vmess(0, "crr iiii ri rS", cnv, "create", "line", 0, 0, 0, 0, "-width", 1, "-tags", 1, tags); } @@ -950,7 +950,7 @@ static int start_paint(lua_State* L) { return 1; } -static int end_paint(lua_State* L) { +static int end_paint(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = (t_pdlua*)gfx->object; t_canvas *cnv = glist_getcanvas(obj->canvas); @@ -984,7 +984,7 @@ static int end_paint(lua_State* L) { return 0; } -static int set_color(lua_State* L) { +static int set_color(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); int r, g, b; @@ -1022,7 +1022,7 @@ static int set_color(lua_State* L) { return 0; } -static int fill_ellipse(lua_State* L) { +static int fill_ellipse(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1031,7 +1031,7 @@ static int fill_ellipse(lua_State* L) { int x1, y1, x2, y2; get_bounds_args(L, obj, &x1, &y1, &x2, &y2); - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii rs ri rS", cnv, "create", "oval", x1, y1, x2, y2, "-fill", gfx->current_color, "-width", 0, "-tags", 3, tags); @@ -1048,7 +1048,7 @@ static int fill_ellipse(lua_State* L) { return 0; } -static int stroke_ellipse(lua_State* L) { +static int stroke_ellipse(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1059,7 +1059,7 @@ static int stroke_ellipse(lua_State* L) { int line_width = luaL_optnumber(L, 5, 1.0f) * glist_getzoom(cnv); // stroke width (optional, default to 1.0) - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "oval", x1, y1, x2, y2, "-width", line_width, "-outline", gfx->current_color, "-tags", 3, tags); @@ -1074,7 +1074,7 @@ static int stroke_ellipse(lua_State* L) { return 0; } -static int fill_all(lua_State* L) { +static int fill_all(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1085,7 +1085,7 @@ static int fill_all(lua_State* L) { int x2 = x1 + gfx->width * glist_getzoom(cnv); int y2 = y1 + gfx->height * glist_getzoom(cnv); - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii rs rS", cnv, "create", "rectangle", x1, y1, x2, y2, "-fill", gfx->current_color, "-tags", 3, tags); @@ -1098,7 +1098,7 @@ static int fill_all(lua_State* L) { return 0; } -static int fill_rect(lua_State* L) { +static int fill_rect(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1107,7 +1107,7 @@ static int fill_rect(lua_State* L) { int x1, y1, x2, y2; get_bounds_args(L, obj, &x1, &y1, &x2, &y2); - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii rs ri rS", cnv, "create", "rectangle", x1, y1, x2, y2, "-fill", gfx->current_color, "-width", 0, "-tags", 3, tags); @@ -1122,7 +1122,7 @@ static int fill_rect(lua_State* L) { return 0; } -static int stroke_rect(lua_State* L) { +static int stroke_rect(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1133,7 +1133,7 @@ static int stroke_rect(lua_State* L) { int line_width = luaL_optnumber(L, 5, 1.0f) * glist_getzoom(cnv); // stroke width (optional, default to 1.0) - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "rectangle", x1, y1, x2, y2, "-width", line_width, "-outline", gfx->current_color, "-tags", 3, tags); @@ -1148,7 +1148,7 @@ static int stroke_rect(lua_State* L) { return 0; } -static int fill_rounded_rect(lua_State* L) { +static int fill_rounded_rect(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1163,7 +1163,7 @@ static int fill_rounded_rect(lua_State* L) { transform_size(gfx, &radius_x, &radius_y); - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA // Tcl/tk can't fill rounded rectangles, so we draw 2 smaller rectangles with 4 ovals over the corners @@ -1185,7 +1185,7 @@ static int fill_rounded_rect(lua_State* L) { return 0; } -static int stroke_rounded_rect(lua_State* L) { +static int stroke_rounded_rect(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1200,7 +1200,7 @@ static int stroke_rounded_rect(lua_State* L) { transform_size(gfx, &radius_x, &radius_y); int line_width = luaL_optnumber(L, 6, 1.0f) * glist_getzoom(cnv); // stroke width (optional, default to 1.0) - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA // Tcl/tk can't stroke rounded rectangles either, so we draw 2 lines connecting with 4 arcs at the corners @@ -1234,7 +1234,7 @@ static int stroke_rounded_rect(lua_State* L) { return 0; } -static int draw_line(lua_State* L) { +static int draw_line(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1262,7 +1262,7 @@ static int draw_line(lua_State* L) { y2 *= canvas_zoom; line_width *= canvas_zoom; - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "line", x1, y1, x2, y2, @@ -1278,13 +1278,13 @@ static int draw_line(lua_State* L) { return 0; } -static int draw_text(lua_State* L) { +static int draw_text(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; t_canvas *cnv = glist_getcanvas(obj->canvas); - const char* text = luaL_checkstring(L, 1); // Assuming text is a string + const char *text = luaL_checkstring(L, 1); // Assuming text is a string int x = luaL_checknumber(L, 2); int y = luaL_checknumber(L, 3); int w = luaL_checknumber(L, 4); @@ -1303,11 +1303,11 @@ static int draw_text(lua_State* L) { y *= canvas_zoom; w *= canvas_zoom; - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA // Convert alignment value to tcl/tk anchor point - const char* anchor; + const char *anchor; switch (alignment) { case 1: anchor = "n"; break; // TOP_CENTER case 2: anchor = "ne"; break; // TOP_RIGHT @@ -1398,7 +1398,7 @@ static char *pdlua_base64_encode(const unsigned char *data, return encoded_data; } -static int draw_svg(lua_State* L) { +static int draw_svg(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1410,7 +1410,7 @@ static int draw_svg(lua_State* L) { transform_size_float(gfx, &scale_x, &scale_y); float scale = (scale_x + scale_y) * 0.5f; - char* svg_text = strdup(luaL_checkstring(L, 1)); + char *svg_text = strdup(luaL_checkstring(L, 1)); uint64_t svg_hash = pdlua_image_hash((unsigned char*)svg_text, scale); int x = luaL_checknumber(L, 2); @@ -1425,7 +1425,7 @@ static int draw_svg(lua_State* L) { x *= canvas_zoom; y *= canvas_zoom; - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA // See if we already rendered the same svg text at the same size, if so, reuse that image @@ -1441,14 +1441,14 @@ static int draw_svg(lua_State* L) { } // First parse svg text with nanosvg - struct NSVGimage* image = nsvgParse(svg_text, "px", 96); + struct NSVGimage *image = nsvgParse(svg_text, "px", 96); if (!image) { pd_error(0, "[pdlua] draw_svg: Failed to parse SVG data."); return 0; } // Then rasterize to a bitmap image - struct NSVGrasterizer* rast = nsvgCreateRasterizer(); + struct NSVGrasterizer *rast = nsvgCreateRasterizer(); if (!rast) { pd_error(0, "[pdlua] draw_svg: Failed to create rasterizer."); return 0; @@ -1461,7 +1461,7 @@ static int draw_svg(lua_State* L) { int h = (int)fmax(image->height* scale, gfx->height * canvas_zoom); int image_size = w * h * channels; - unsigned char* bitmap_data = getbytes(image_size); + unsigned char *bitmap_data = getbytes(image_size); if (!bitmap_data) { pd_error(0, "[pdlua] draw_svg: Failed to allocate memory for bitmap."); return 0; @@ -1471,14 +1471,14 @@ static int draw_svg(lua_State* L) { // Convert bitmap data to png int png_size; - unsigned char* png_buf = stbi_write_png_to_mem(bitmap_data, w * channels, w, h, channels, &png_size); + unsigned char *png_buf = stbi_write_png_to_mem(bitmap_data, w * channels, w, h, channels, &png_size); if (!png_buf || png_size <= 0) { pd_error(0, "[pdlua] draw_svg: Failed to encode PNG image."); return 0; } // Encode PNG data to Base64 - char* encoded_png = pdlua_base64_encode((unsigned char*)png_buf, png_size); + char *encoded_png = pdlua_base64_encode((unsigned char*)png_buf, png_size); free(png_buf); if (!encoded_png) { @@ -1513,7 +1513,7 @@ static int draw_svg(lua_State* L) { return 0; } -static int draw_image(lua_State* L) { +static int draw_image(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; @@ -1673,13 +1673,13 @@ static int draw_image(lua_State* L) { } -static int stroke_path(lua_State* L) { +static int stroke_path(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; t_canvas *cnv = glist_getcanvas(obj->canvas); - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); if(path->num_path_segments < 3) return 0; @@ -1688,12 +1688,12 @@ static int stroke_path(lua_State* L) { int obj_y = text_ypix((t_object*)obj, obj->canvas); int canvas_zoom = glist_getzoom(cnv); - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "line", 0, 0, 0, 0, "-width", stroke_width, "-fill", gfx->current_color, "-tags", 3, tags); - t_float* transformed_coordinates = getbytes(path->num_path_segments * 2 * sizeof(t_float)); + t_float *transformed_coordinates = getbytes(path->num_path_segments * 2 * sizeof(t_float)); for (int i = 0; i < path->num_path_segments; i++) { float x = path->path_segments[i * 2], y = path->path_segments[i * 2 + 1]; transform_point_float(gfx, &x, &y); @@ -1720,13 +1720,13 @@ static int stroke_path(lua_State* L) { return 0; } -static int fill_path(lua_State* L) { +static int fill_path(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; t_canvas *cnv = glist_getcanvas(obj->canvas); - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); if(path->num_path_segments < 3) return 0; @@ -1735,12 +1735,12 @@ static int fill_path(lua_State* L) { int obj_y = text_ypix((t_object*)obj, obj->canvas); int canvas_zoom = glist_getzoom(cnv); - const char* tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; + const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA pdgui_vmess(0, "crr iiii ri rs rS", cnv, "create", "polygon", 0, 0, 0, 0, "-width", 0, "-fill", gfx->current_color, "-tags", 3, tags); - t_float* transformed_coordinates = getbytes(path->num_path_segments * 2 * sizeof(t_float)); + t_float *transformed_coordinates = getbytes(path->num_path_segments * 2 * sizeof(t_float)); for (int i = 0; i < path->num_path_segments; i++) { float x = path->path_segments[i * 2], y = path->path_segments[i * 2 + 1]; transform_point_float(gfx, &x, &y); @@ -1767,7 +1767,7 @@ static int fill_path(lua_State* L) { } -static int translate(lua_State* L) { +static int translate(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); if(gfx->num_transforms == 0) @@ -1783,7 +1783,7 @@ static int translate(lua_State* L) { return 0; } -static int scale(lua_State* L) { +static int scale(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); gfx->transforms = resizebytes(gfx->transforms, gfx->num_transforms * sizeof(gfx_transform), (gfx->num_transforms + 1) * sizeof(gfx_transform)); @@ -1796,7 +1796,7 @@ static int scale(lua_State* L) { return 0; } -static int reset_transform(lua_State* L) { +static int reset_transform(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); freebytes(gfx->transforms, gfx->num_transforms * sizeof(gfx_transform)); gfx->transforms = NULL; @@ -1805,7 +1805,7 @@ static int reset_transform(lua_State* L) { } #endif -static void add_path_segment(t_path_state* path, float x, float y) +static void add_path_segment(t_path_state *path, float x, float y) { int path_segment_space = (path->num_path_segments + 1) * 2; int old_size = path->num_path_segments_allocated; @@ -1823,7 +1823,7 @@ static void add_path_segment(t_path_state* path, float x, float y) path->num_path_segments++; } -static int start_path(lua_State* L) { +static int start_path(lua_State *L) { t_path_state *path = (t_path_state *)lua_newuserdata(L, sizeof(t_path_state)); luaL_setmetatable(L, "Path"); @@ -1837,16 +1837,16 @@ static int start_path(lua_State* L) { } // Function to add a line to the current path -static int line_to(lua_State* L) { - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); +static int line_to(lua_State *L) { + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); float x = luaL_checknumber(L, 2); float y = luaL_checknumber(L, 3); add_path_segment(path, x, y); return 0; } -static int quad_to(lua_State* L) { - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); +static int quad_to(lua_State *L) { + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); float x2 = luaL_checknumber(L, 2); float y2 = luaL_checknumber(L, 3); float x3 = luaL_checknumber(L, 4); @@ -1875,8 +1875,8 @@ static int quad_to(lua_State* L) { return 0; } -static int cubic_to(lua_State* L) { - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); +static int cubic_to(lua_State *L) { + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); float x2 = luaL_checknumber(L, 2); float y2 = luaL_checknumber(L, 3); float x3 = luaL_checknumber(L, 4); @@ -1909,15 +1909,15 @@ static int cubic_to(lua_State* L) { } // Function to close the current path -static int close_path(lua_State* L) { - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); +static int close_path(lua_State *L) { + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); add_path_segment(path, path->path_start_x, path->path_start_y); return 0; } -static int free_path(lua_State* L) +static int free_path(lua_State *L) { - t_path_state* path = (t_path_state*)luaL_checkudata(L, 1, "Path"); + t_path_state *path = (t_path_state*)luaL_checkudata(L, 1, "Path"); freebytes(path->path_segments, path->num_path_segments_allocated * sizeof(int)); return 0; } From f4bdc2367953cb27d7f9aa16198d1222009c5b3a Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 16:24:08 +0100 Subject: [PATCH 085/109] Fix garbage print on startup --- pdlua.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pdlua.c b/pdlua.c index 13d537e..a2add6a 100644 --- a/pdlua.c +++ b/pdlua.c @@ -3272,8 +3272,6 @@ void pdlua_setup(const char *datadir, char *versbuf, int versbuf_length, void(*r void pdlua_setup(void) #endif { - char pdluaver[MAXPDSTRING]; - char compiled[MAXPDSTRING]; char luaversionStr[MAXPDSTRING]; #if LUA_VERSION_NUM < 504 const lua_Number *luaversion = lua_version (NULL); @@ -3296,10 +3294,20 @@ void pdlua_setup(void) pdlua_version = "0.12.23"; } -#ifndef LUA_USE_JIT +#ifndef LUA_USE_JIT // Only print for regular Lua, so it doens't print twice + char pdluaver[MAXPDSTRING]; + char compiled[MAXPDSTRING]; + snprintf(pdluaver, MAXPDSTRING-1, "pdlua %s (GPL) 2008 Claude Heiland-Allen, 2014 Martin Peach et al.", pdlua_version); snprintf(compiled, MAXPDSTRING-1, "pdlua: compiled for pd-%d.%d on %s", PD_MAJOR_VERSION, PD_MINOR_VERSION, BUILD_DATE); + // post version and other information + post(pdluaver); +#ifdef ELSE + post("Distributed as part of ELSE"); +#else + post(compiled); +#endif #endif lvm = (*luaversion)/100; @@ -3319,13 +3327,7 @@ void pdlua_setup(void) snprintf(versbuf, versbuf_length-1, "pdlua %s (lua %d.%d)", pdlua_version, lvm, lvl); #endif #endif -// post version and other information - post(pdluaver); -#ifdef ELSE - post("Distributed as part of ELSE"); -#else - post(compiled); -#endif + post(luaversionStr); // multichannel handling copied from https://github.com/Spacechild1/vstplugin/blob/3f0ed8a800ea238bf204a2ead940b2d1324ac909/pd/src/vstplugin~.cpp#L4122-L4136 From 2e70c4d4c3698df64fd9cc1fa91a5c1ee484391b Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 16:31:39 +0100 Subject: [PATCH 086/109] macOS: make OK button lose focus when clicking a text field --- pdlua_properties.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pdlua_properties.h b/pdlua_properties.h index 8456a22..e5e5a08 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -478,6 +478,16 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { "bind %s {%s}", buttonOkId, okCommand); pdgui_vmess(0, "r", okReturnBind); + +#if __APPLE__ + char focusbind[MAXPDSTRING * 2]; + snprintf(focusbind, MAXPDSTRING * 2, + "bind %s {if {[focus] ne \"%s\"} {catch {%s configure -default normal}}}", + p->properties_receiver->s_name, + buttonOkId, + buttonOkId); + pdgui_vmess(0, "r", focusbind); +#endif #else t_symbol *gfx_tag = gfxstub_new2(&pdlua->pd.te_g.g_pd, x); From aa93e1071946d67b67a9b0fece5cb8b326575e85 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 18:51:18 +0100 Subject: [PATCH 087/109] Implement properties for purr-data, fix compilation for purr-data --- luas/lua.c | 4 ++ pdlua.c | 10 ++++- pdlua.h | 16 ++----- pdlua_gfx.h | 10 ++--- pdlua_properties.h | 108 +++++++++++++++++++++++---------------------- 5 files changed, 76 insertions(+), 72 deletions(-) diff --git a/luas/lua.c b/luas/lua.c index 50d7a4f..2214564 100644 --- a/luas/lua.c +++ b/luas/lua.c @@ -162,4 +162,8 @@ #define LUA_FILE_EXTENSION ".pd_lua" #include "../pdlua.c" + +#ifdef PURR_DATA +#define error lua54_error +#endif #include "lua/onelua.c" diff --git a/pdlua.c b/pdlua.c index a2add6a..4e54ebc 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1223,10 +1223,12 @@ static void pdlua_menu_open(t_pdlua *o) SETSYMBOL(&arg, gensym(pathname)); plugdata_forward_message(0, o, gensym("open_textfile"), 1, &arg); #else +#ifdef PURR_DATA if (nw_gui_vmess) nw_gui_vmess("open_textfile", "s", pathname); - else - pdgui_vmess("::pd_menucommands::menu_openfile", "s", pathname); +#else + pdgui_vmess("::pd_menucommands::menu_openfile", "s", pathname); +#endif #endif } else { lua_pop(__L(), 2); /* pop name, global "pd"*/ @@ -1490,7 +1492,11 @@ static int pdlua_set_arguments(lua_State *L) if (redraw) { // update the text in the object box; this makes sure that // the arguments in the display are what we just set +#ifdef PURR_DATA + t_rtext *y = glist_findrtext(o->canvas, x); +#else t_rtext *y = glist_getrtext(o->canvas, x, 0); +#endif rtext_retext(y); // redraw the object and its iolets (including incident // cord lines), in case the object box size has changed diff --git a/pdlua.h b/pdlua.h index 2d13fc9..cac116e 100644 --- a/pdlua.h +++ b/pdlua.h @@ -38,23 +38,15 @@ typedef struct { typedef struct _pdlua_properties { #ifndef PLUGDATA -#ifndef PURR_DATA + t_pending_property pending[MAX_PENDING_PROPERTIES]; + int pending_count; t_symbol *current_frame; t_symbol *properties_receiver; - int frame_count; int property_count; +#ifndef PURR_DATA + int frame_count; int max_col, max_row; int current_col, current_row; - - t_pending_property pending[MAX_PENDING_PROPERTIES]; - int pending_count; -#else - int property_count; - int max_properties; - char **names; - char **types; - char **values; - char **callbacks; #endif #else void(*plugdata_properties_callback)(void*, t_symbol*, int, t_atom*); // Callback to add properties in plugdata diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 4089814..cda1d25 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -39,8 +39,8 @@ #define STB_IMAGE_RESIZE_STATIC #define STB_IMAGE_RESIZE_IMPLEMENTATION #include "svg/stb_image_resize2.h" -#endif #pragma GCC diagnostic pop +#endif #ifdef PURR_DATA @@ -52,7 +52,7 @@ #define glist_getzoom(x) 1 // this has an extra argument in vanilla (which we ignore) -int xxsys_hostfontsize(int fontsize, int zoom) +static int xxsys_hostfontsize(int fontsize, int zoom) { return sys_hostfontsize(fontsize); } @@ -607,7 +607,7 @@ static void transform_point_float(t_pdlua_gfx *gfx, float *x, float *y) { #define glist_eraseiofor xxglist_eraseiofor /* draw inlets and outlets for a text object or for a graph. */ -void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, +static void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, char *tag, int x1, int y1, int x2, int y2) { t_canvas *canvas = glist_getcanvas(glist); @@ -684,7 +684,7 @@ void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, } } -void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag) +static void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag) { char tagbuf[MAXPDSTRING]; t_canvas *canvas = glist_getcanvas(glist); @@ -1014,7 +1014,7 @@ static int set_color(lua_State *L) { gfx->current_color[7] = '\0'; #else // ... but it is in Purr Data (nw.js gui) - a = luaL_optnumber(L, 4, 1.0f) * 255; + int a = luaL_optnumber(L, 4, 1.0f) * 255; snprintf(gfx->current_color, 10, "#%02X%02X%02X%02X", r, g, b, a); gfx->current_color[9] = '\0'; #endif diff --git a/pdlua_properties.h b/pdlua_properties.h index e5e5a08..cf9ffb7 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -295,26 +295,7 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol * IGNORE_UNUSED(s), i } #else -#ifdef PURR_DATA -void purrdata_add_property(t_pdlua_properties *p, const char *name, const char *type, const char *value, const char* callback) { - if(p->property_count >= p->max_properties) { - // Reallocate arrays - int new_size = p->max_properties + 8; - p->names = realloc(p->names, sizeof(char*) * new_size); - p->types = realloc(p->types, sizeof(char*) * new_size); - p->values = realloc(p->values, sizeof(char*) * new_size); - p->callbacks = realloc(p->callbacks, sizeof(char*) * new_size); - p->max_properties = new_size; - } - - p->names[p->property_count] = strdup(name); - p->types[p->property_count] = strdup(type); - p->values[p->property_count] = strdup(value); - p->callbacks[p->property_count] = strdup(callback); - p->property_count++; -} -#endif - +#ifndef PURR_DATA static void pdlua_properties_updaterow(t_pdlua_properties *p) { p->current_col++; @@ -323,15 +304,41 @@ static void pdlua_properties_updaterow(t_pdlua_properties *p) p->current_col = 0; // not used for now } } +#endif static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { t_pdlua *pdlua = (t_pdlua *)z; t_pdlua_properties *p = &pdlua->properties; - -#ifndef PURR_DATA lua_State *L = __L(); +#ifdef PURR_DATA + const char *gfx_tag = gfxstub_new2(&pdlua->pd.te_g.g_pd, (void*)pdlua); + gui_start_vmess("gui_external_dialog", "ss", gfx_tag, pdlua->pd.te_g.g_pd->c_name->s_name); + gui_start_array(); + + lua_getglobal(L, "pd"); + lua_getfield(L, -1, "_properties"); + + lua_pushlightuserdata(L, pdlua); + t_pdlua **ctx = lua_newuserdata(L, sizeof(t_pdlua*)); + *ctx = pdlua; + + luaL_getmetatable(L, "PropertiesContext"); + lua_setmetatable(L, -2); + + if (lua_pcall(L, 2, 0, 0)) + { + gui_end_array(); + gui_end_vmess(); + + mylua_error(L, pdlua, "properties"); + return; + } + + gui_end_array(); + gui_end_vmess(); +#else char receiver[MAXPDSTRING]; snprintf(receiver, MAXPDSTRING, ".%p", p); pdlua->properties.properties_receiver = gensym(receiver); @@ -488,17 +495,6 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { buttonOkId); pdgui_vmess(0, "r", focusbind); #endif -#else - - t_symbol *gfx_tag = gfxstub_new2(&pdlua->pd.te_g.g_pd, x); - gui_start_vmess("gui_external_dialog", "ss", gfx_tag, pdlua->pd.te_g.g_pd->c_name->s_name); - - gui_start_array(); - for(int i = 0; i < p->property_count; i++) { - gui_s(p->names[i]); // name - gui_s(p->values[i]); // value - } - gui_end_array(); #endif } @@ -600,7 +596,10 @@ static int pdlua_properties_addcheck(lua_State *L) "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); #else - purrdata_add_property(text, "toggle", init_value ? "1" : "0", method); + char name[MAXPDSTRING]; + snprintf(name, MAXPDSTRING, "%s_%s", text, "_toggle"); + gui_s(name); + gui_i(init_value); #endif return 0; } @@ -657,7 +656,10 @@ static int pdlua_properties_addtext(lua_State *L) pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); #else - purrdata_add_property(text, "symbol", init_value, method); + char name[MAXPDSTRING]; + snprintf(name, MAXPDSTRING, "%s_%s", text, "_symbol"); + gui_s(name); + gui_s(init_value); #endif return 0; } @@ -752,7 +754,10 @@ static int pdlua_properties_addcolor(lua_State *L) { pdlua_properties_updaterow(&pdlua->properties); #else - purrdata_add_property(text, "symbol", initcolor, method); + char name[MAXPDSTRING]; + snprintf(name, MAXPDSTRING, "%s_%s", text, "_symbol"); + gui_s(name); + gui_s(initcolor); #endif return 0; @@ -764,7 +769,7 @@ static int pdlua_properties_addint(lua_State *L) const char *text = luaL_checkstring(L, 2); const char *method = luaL_checkstring(L, 3); - int init = (int)luaL_checknumber(L, 4); + int init_value = (int)luaL_checknumber(L, 4); double min = luaL_optnumber(L, 5, -1e36); double max = luaL_optnumber(L, 6, 1e36); @@ -783,7 +788,7 @@ static int pdlua_properties_addint(lua_State *L) pdlua_properties_buildvar(pdlua, numvariable); - pdgui_vmess(0, "ssi", "set", numvariable, init); + pdgui_vmess(0, "ssi", "set", numvariable, init_value); snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, numvariable); @@ -817,9 +822,8 @@ static int pdlua_properties_addint(lua_State *L) pdlua_properties_updaterow(&pdlua->properties); #else - char init_value[MAXPDSTRING]; - snprintf(init_value, MAXPDSTRING, "%d", init); - purrdata_add_property(text, "number", init_value, method); + gui_s(text); + gui_i(init_value); #endif return 0; @@ -831,7 +835,7 @@ static int pdlua_properties_addfloat(lua_State *L) const char *text = luaL_checkstring(L, 2); const char *method = luaL_checkstring(L, 3); - double init = luaL_checknumber(L, 4); + double init_value = luaL_checknumber(L, 4); double min = luaL_optnumber(L, 5, -1e36); double max = luaL_optnumber(L, 6, 1e36); @@ -850,7 +854,7 @@ static int pdlua_properties_addfloat(lua_State *L) pdlua_properties_buildvar(pdlua, numvariable); - pdgui_vmess(0, "ssf", "set", numvariable, init); + pdgui_vmess(0, "ssf", "set", numvariable, init_value); snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties floatbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, numvariable); @@ -908,9 +912,8 @@ static int pdlua_properties_addfloat(lua_State *L) pdlua_properties_updaterow(&pdlua->properties); #else - char init_value[MAXPDSTRING]; - snprintf(init_value, MAXPDSTRING, "%f", init); - purrdata_add_property(text, "number", init_value, method); + gui_s(text); + gui_f(init_value); #endif return 0; @@ -921,9 +924,9 @@ static int pdlua_properties_addcombo(lua_State *L) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L,1); - const char *label = luaL_checkstring(L,2); + const char *text = luaL_checkstring(L,2); const char *method = luaL_checkstring(L,3); - int init = luaL_checknumber(L,4) - 1; + int init_value = luaL_checknumber(L,4) - 1; int options_count = lua_rawlen(L,5); const char **opts = calloc(options_count, sizeof(char*)); @@ -948,8 +951,8 @@ static int pdlua_properties_addcombo(lua_State *L) return 0; } - if(init < options_count) { - pdgui_vmess(0,"sss","set", combovar, opts[init]); + if(init_value < options_count) { + pdgui_vmess(0,"sss","set", combovar, opts[init_value]); } snprintf(pdsend, MAXPDSTRING, @@ -977,9 +980,8 @@ static int pdlua_properties_addcombo(lua_State *L) pdlua_properties_updaterow(&pdlua->properties); #else - char init_value[MAXPDSTRING]; - snprintf(init_value, MAXPDSTRING, "%d", init); - purrdata_add_property(text, "number", init_value, method); + gui_s(text); + gui_i(init_value); #endif free(opts); From 536d342b820ec91214e775d33b2a0610dbbf44fc Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 20:13:51 +0100 Subject: [PATCH 088/109] Implement properties dialog callback for purr-data --- pdlua.c | 6 ++- pdlua.h | 3 ++ pdlua_properties.h | 103 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 95 insertions(+), 17 deletions(-) diff --git a/pdlua.c b/pdlua.c index 4e54ebc..d90d4ee 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1638,6 +1638,7 @@ static int pdlua_object_new(lua_State *L) o->gfx.mouse_x = 0; o->gfx.mouse_y = 0; o->gfx.mouse_down = 0; + o->properties.property_count = 0; #else // NULL until plugdata overrides them with something useful o->gfx.plugdata_draw_callback = NULL; @@ -2108,6 +2109,7 @@ static int pdlua_object_free(lua_State *L) if (o) { pdlua_gfx_free(&o->gfx); + pdlua_properties_free(&o->properties); if(o->in) { @@ -2851,11 +2853,11 @@ static int pdlua_setpropertiesfn(lua_State *L) t_pdlua *x = (t_pdlua *)lua_touserdata(L, 1); if(x->pdlua_class) { class_setpropertiesfn(x->pdlua_class, pdlua_properties); - class_addmethod(x->pdlua_class, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); + class_addmethod(x->pdlua_class, (t_method)pdlua_properties_receiver, gensym("dialog"), A_GIMME, 0); } if(x->pdlua_class_gfx) { class_setpropertiesfn(x->pdlua_class_gfx, pdlua_properties); - class_addmethod(x->pdlua_class_gfx, (t_method)pdlua_properties_receiver, gensym("_properties"), A_GIMME, 0); + class_addmethod(x->pdlua_class_gfx, (t_method)pdlua_properties_receiver, gensym("dialog"), A_GIMME, 0); } return 0; } diff --git a/pdlua.h b/pdlua.h index cac116e..573df8c 100644 --- a/pdlua.h +++ b/pdlua.h @@ -47,6 +47,9 @@ typedef struct _pdlua_properties int frame_count; int max_col, max_row; int current_col, current_row; +#else + t_symbol **property_method_callbacks; + t_symbol **property_types; #endif #else void(*plugdata_properties_callback)(void*, t_symbol*, int, t_atom*); // Callback to add properties in plugdata diff --git a/pdlua_properties.h b/pdlua_properties.h index cf9ffb7..d9015e9 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -48,6 +48,17 @@ static void pdlua_properties_setup(lua_State* L) luaL_setfuncs(L, properties_methods, 0); } +static void pdlua_properties_free(t_pdlua_properties *p) +{ +#ifdef PURR_DATA + if(p->property_count) + { + free(p->property_method_callbacks); + free(p->property_types); + } +#endif +} + #ifdef PLUGDATA #ifdef _MSC_VER #define alloca _alloca @@ -304,6 +315,17 @@ static void pdlua_properties_updaterow(t_pdlua_properties *p) p->current_col = 0; // not used for now } } +#else +static inline void purrdata_add_callback(t_pdlua_properties *p, const char *type, const char *method) +{ + p->property_method_callbacks = realloc(p->property_method_callbacks, sizeof(t_symbol*) * (p->property_count + 1)); + p->property_types = realloc(p->property_types, sizeof(t_symbol*) * (p->property_count + 1)); + + p->property_method_callbacks[p->property_count] = gensym(method); + p->property_types[p->property_count] = gensym(type); + p->property_count++; +} + #endif static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { @@ -314,6 +336,11 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { #ifdef PURR_DATA const char *gfx_tag = gfxstub_new2(&pdlua->pd.te_g.g_pd, (void*)pdlua); + + free(p->property_method_callbacks); + free(p->property_types); + p->property_count = 0; + gui_start_vmess("gui_external_dialog", "ss", gfx_tag, pdlua->pd.te_g.g_pd->c_name->s_name); gui_start_array(); @@ -428,7 +455,7 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { char okCommand[MAXPDSTRING * 2]; snprintf(okCommand, MAXPDSTRING * 2, - "pdsend \"%s _properties apply\"; destroy .%p", + "pdsend \"%s dialog apply\"; destroy .%p", p->properties_receiver->s_name, (void *)p); pdgui_vmess(0, "ssssssss", "button", buttonOkId, "-text", "OK", "-command", okCommand, "-default", okButtonState); @@ -445,7 +472,7 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { " catch {" " if {[focus] eq \"%s\"} {%s} " " else {" - " pdsend \"%s _properties apply\";" + " pdsend \"%s dialog apply\";" " %s configure -default active;" " focus %s" " }" @@ -461,7 +488,7 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { #else char returnbind[MAXPDSTRING * 2]; snprintf(returnbind, MAXPDSTRING * 2, - "bind %s {catch {pdsend \"%s _properties apply\"; destroy .%p}; break}", + "bind %s {catch {pdsend \"%s dialog apply\"; destroy .%p}; break}", p->properties_receiver->s_name, p->properties_receiver->s_name, (void *)p); @@ -469,7 +496,7 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { char applyCommand[MAXPDSTRING]; snprintf(applyCommand, MAXPDSTRING, - "pdsend \"%s _properties apply\"", + "pdsend \"%s dialog apply\"", p->properties_receiver->s_name); pdgui_vmess(0, "ssssss", "button", buttonApplyId, "-text", "Apply", "-command", applyCommand); @@ -584,7 +611,7 @@ static int pdlua_properties_addcheck(lua_State *L) pdgui_vmess(0, "ssi", "set", checkvariable, init_value); // Build the pdsend command - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties checkbox %s $%s]", + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog checkbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, checkvariable); // Create the checkbox @@ -600,6 +627,7 @@ static int pdlua_properties_addcheck(lua_State *L) snprintf(name, MAXPDSTRING, "%s_%s", text, "_toggle"); gui_s(name); gui_i(init_value); + purrdata_add_callback(&pdlua->properties, "check", method); #endif return 0; } @@ -630,7 +658,7 @@ static int pdlua_properties_addtext(lua_State *L) pdgui_vmess(0, "sss", "set", textvariable, init_value); // Command to send it to pd - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties textbox %s $%s]", + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog textbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, textvariable); // container for button to set and text input @@ -660,6 +688,7 @@ static int pdlua_properties_addtext(lua_State *L) snprintf(name, MAXPDSTRING, "%s_%s", text, "_symbol"); gui_s(name); gui_s(init_value); + purrdata_add_callback(&pdlua->properties, "text", method); #endif return 0; } @@ -735,9 +764,9 @@ static int pdlua_properties_addcolor(lua_State *L) { " if {$c ne \"\"} {\n" " $widget configure -background $c\n" "\n" - " pdsend [concat $receiver _properties colorpicker $method $c]\n" + " pdsend [concat $receiver dialog colorpicker $method $c]\n" #if __APPLE__ - " pdsend [concat $receiver _properties apply]\n" + " pdsend [concat $receiver dialog apply]\n" #endif " }\n" "}\n"); @@ -758,6 +787,7 @@ static int pdlua_properties_addcolor(lua_State *L) { snprintf(name, MAXPDSTRING, "%s_%s", text, "_symbol"); gui_s(name); gui_s(initcolor); + purrdata_add_callback(&pdlua->properties, "colorpicker", method); #endif return 0; @@ -790,7 +820,7 @@ static int pdlua_properties_addint(lua_State *L) pdgui_vmess(0, "ssi", "set", numvariable, init_value); - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties numberbox %s $%s]", + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog numberbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, numvariable); snprintf(container, MAXPDSTRING, "%s.numberbox%d", @@ -824,6 +854,7 @@ static int pdlua_properties_addint(lua_State *L) #else gui_s(text); gui_i(init_value); + purrdata_add_callback(&pdlua->properties, "int", method); #endif return 0; @@ -856,7 +887,7 @@ static int pdlua_properties_addfloat(lua_State *L) pdgui_vmess(0, "ssf", "set", numvariable, init_value); - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s _properties floatbox %s $%s]", + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog floatbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, numvariable); snprintf(container, MAXPDSTRING, "%s.floatbox%d", @@ -882,7 +913,7 @@ static int pdlua_properties_addfloat(lua_State *L) "bind %s {" " set v $%s;" " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" - " pdsend \"%s _properties floatbox %s $%s\"" + " pdsend \"%s dialog floatbox %s $%s\"" "}\n", entryid, numvariable, @@ -896,7 +927,7 @@ static int pdlua_properties_addfloat(lua_State *L) "bind %s {" " set v $%s;" " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" - " pdsend \"%s _properties floatbox %s $%s\"" + " pdsend \"%s dialog floatbox %s $%s\"" "}\n", entryid, numvariable, @@ -914,6 +945,7 @@ static int pdlua_properties_addfloat(lua_State *L) #else gui_s(text); gui_f(init_value); + purrdata_add_callback(&pdlua->properties, "float", method); #endif return 0; @@ -956,7 +988,7 @@ static int pdlua_properties_addcombo(lua_State *L) } snprintf(pdsend, MAXPDSTRING, - "eval pdsend [concat %s _properties combobox %s [expr {[%%W current] + 1}]]", + "eval pdsend [concat %s dialog combobox %s [expr {[%%W current] + 1}]]", pdlua->properties.properties_receiver->s_name, method); char container[MAXPDSTRING]; @@ -965,7 +997,7 @@ static int pdlua_properties_addcombo(lua_State *L) pdgui_vmess(0,"ss", "frame", container); snprintf(textid, MAXPDSTRING, "%s.label", container); - pdgui_vmess(0,"ssss", "label", textid, "-text", label); + pdgui_vmess(0,"ssss", "label", textid, "-text", text); snprintf(comboid, MAXPDSTRING,"%s.widget",container); @@ -982,6 +1014,7 @@ static int pdlua_properties_addcombo(lua_State *L) #else gui_s(text); gui_i(init_value); + purrdata_add_callback(&pdlua->properties, "combo", method); #endif free(opts); @@ -1035,6 +1068,9 @@ static void pdlua_properties_apply(t_pdlua *o) static void pdlua_properties_receiver(t_pdlua *o, t_symbol *IGNORE_UNUSED(s), int argc, t_atom *argv) { + t_pdlua_properties *p = &o->properties; + +#ifndef PURR_DATA if (argc < 1) return; const char *guitype = atom_getsymbol(argv)->s_name; @@ -1048,7 +1084,6 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol *IGNORE_UNUSED(s), in if (argc < 2) return; - t_pdlua_properties *p = &o->properties; const char *method = atom_getsymbol(argv + 1)->s_name; // Overwrite existing entry for the same method so only the latest value is kept @@ -1080,6 +1115,44 @@ static void pdlua_properties_receiver(t_pdlua *o, t_symbol *IGNORE_UNUSED(s), in { entry->argv[entry->argc++] = argv[i]; } +#else + lua_State *L = __L(); + for (int i = 0; i < argc; i++) + { + lua_getglobal(L, "pd"); + lua_getfield(L, -1, "_set_properties"); + lua_remove(L, -2); + + lua_pushlightuserdata(L, o); + lua_pushstring(L, p->property_method_callbacks[i]->s_name); + + t_atom* value = argv + i; + if (strcmp(p->property_types[i]->s_name, "colorpicker") == 0) + { + const char *hexcolor = atom_getsymbol(value)->s_name; + int r, g, b; + if (sscanf(hexcolor + 1, "%2x%2x%2x", &r, &g, &b) == 3) + { + lua_newtable(L); + lua_pushinteger(L, r); lua_rawseti(L, -2, 1); + lua_pushinteger(L, g); lua_rawseti(L, -2, 2); + lua_pushinteger(L, b); lua_rawseti(L, -2, 3); + } + } + else + { + if (value->a_type == A_FLOAT) + lua_pushnumber(L, atom_getfloat(value)); + else + lua_pushstring(L, atom_getsymbol(value)->s_name); + } + + if (lua_pcall(L, 3, 0, 0)) + { + mylua_error(L, o, "_set_properties"); + } + } +#endif } #endif From b9427945f7e32eee63e43cfaff30f1e2a85ae6a6 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 20:53:38 +0100 Subject: [PATCH 089/109] Small cleanups --- pdlua_gfx.h | 8 ++++---- pdlua_properties.h | 16 +++------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index cda1d25..a9b7f7f 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -118,7 +118,7 @@ void pdlua_gfx_free(t_pdlua_gfx *gfx) { for(int i = 0; i < gfx->num_images; i++) { char image_name[64]; - snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, gfx->images[i]); + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)gfx->images[i]); pdgui_vmess(0, "rrs", "image", "delete", image_name); } if(gfx->num_images) freebytes(gfx->images, gfx->num_images * sizeof(uint64_t)); @@ -1434,7 +1434,7 @@ static int draw_svg(lua_State *L) { if(gfx->images[i] == svg_hash) { char image_name[64]; - snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, svg_hash); + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)svg_hash); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); return 0; } @@ -1499,7 +1499,7 @@ static int draw_svg(lua_State *L) { gfx->num_images++; char image_name[64]; - snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, svg_hash); + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)svg_hash); pdgui_vmess(0, "rrr s rs", "image", "create", "photo", image_name, "-data", encoded_png); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); @@ -1539,7 +1539,7 @@ static int draw_image(lua_State *L) { const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; char image_name[64]; - snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, image_hash); + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)image_hash); #ifndef PURR_DATA // Fast path: scaled image already uploaded to Tk diff --git a/pdlua_properties.h b/pdlua_properties.h index d9015e9..b5910ed 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -416,21 +416,12 @@ static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { luaL_getmetatable(L, "PropertiesContext"); lua_setmetatable(L, -2); - if (lua_pcall(L, 2, 1, 0)) + if (lua_pcall(L, 2, 0, 0)) { mylua_error(L, pdlua, "properties"); return; } - // Get the return value (Lua pushes it onto the stack) - int result = lua_toboolean(L, -1); // Converts Lua boolean to C int (1 = true, 0 = false) - lua_pop(L, 1); // Remove the result from the stack - if (!result) - { - pdgui_vmess(0, "ss", "destroy", p->properties_receiver->s_name); - return; - } - char buttonsId[MAXPDSTRING]; snprintf(buttonsId, MAXPDSTRING, ".%p.buttons", (void *)p); @@ -550,13 +541,12 @@ static int pdlua_properties_newframe(lua_State *L) snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); pdlua->properties.current_frame = gensym(current_frameid); - // raised, sunken, flat, ridge, solid, and groove. // Create main frame for set of configurations pdgui_vmess(0, "sssssi", "frame", current_frameid, "-relief", "groove", "-borderwidth", 1); pdgui_vmess(0, "sssssssisi", "pack", current_frameid, "-side", "top", "-fill", "x", "-padx", 10, "-pady", 10); - // Title of the Frame + // Title of the frame char labelid[MAXPDSTRING]; snprintf(labelid, MAXPDSTRING, "%s.title", current_frameid); pdgui_vmess(0, "ssss", "label", labelid, "-text", title); @@ -577,7 +567,7 @@ static int pdlua_properties_newframe(lua_State *L) pdlua->properties.current_col = 0; pdlua->properties.current_row = 0; #else - // TODO: purr-data implementation + // TODO: purr-data doesn't have frames yet #endif return 0; } From af3101446d363ccc74c9bb9bc08ef2e9350e7eef Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 21:22:54 +0100 Subject: [PATCH 090/109] Only run instance setup in multi-instance mode --- pdlua.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua.c b/pdlua.c index d90d4ee..27980a0 100644 --- a/pdlua.c +++ b/pdlua.c @@ -3264,11 +3264,11 @@ void pdlua_instance_setup() } PDLUA_DEBUG("pdlua lua_open done L = %p", L); init_pdlua_environment(L, pdlua_datadir); -#endif #ifndef LUA_USE_JIT void pdluajit_instance_setup(); pdluajit_instance_setup(); #endif +#endif } #ifdef _WIN32 From 7db72b109fa9d426a95e135d58b6cb4d735bcdb6 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 22:56:28 +0100 Subject: [PATCH 091/109] Fix Windows linking against the wrong runtime --- .github/workflows/makefile.yml | 8 ++++++++ Makefile | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 9efaef0..e955828 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -73,6 +73,13 @@ jobs: submodules: recursive fetch-depth: 0 + - name: setup MSYS2 MINGW64 + uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: mingw-w64-x86_64-gcc make + - name: install dependencies for 32-bit if: matrix.floatsize == 32 run: | @@ -87,6 +94,7 @@ jobs: ren Pd-0.56.2 pd-0.56-2 - name: make 32-bit + shell: msys2 {0} run: make install objectsdir=./build PDDIR=./pd-0.56-2 PDINCLUDEDIR=./pd-0.56-2/src PDBINDIR=./pd-0.56-2/bin floatsize=${{ matrix.floatsize }} extension=windows-amd64-${{ matrix.floatsize }}.dll - name: upload diff --git a/Makefile b/Makefile index 36cd5f5..78c0255 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ compat53_headers = \ $(luajit_lib): ifeq ($(system), Windows) - $(MAKE) -C $(luajit_dir) SHELL=cmd BUILDMODE=static + $(MAKE) -C $(luajit_dir) BUILDMODE=static else $(MAKE) -C $(luajit_dir) CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.11 endif From b9231634ff1ea4e48a302c16c37c8af449ab34c1 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 22:58:23 +0100 Subject: [PATCH 092/109] Move examples to correct location --- pdlua/{tutorial => }/examples/lua-benchmark.pd_lua | 0 pdlua/{tutorial => }/examples/luajit-benchmark.pd_luajit | 0 pdlua/{tutorial => }/examples/luajit-ffi.lua | 0 pdlua/{tutorial => }/examples/luajit.pd | 0 pdlua/{tutorial => }/examples/properties.pd | 0 pdlua/{tutorial => }/examples/props.pd_lua | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename pdlua/{tutorial => }/examples/lua-benchmark.pd_lua (100%) rename pdlua/{tutorial => }/examples/luajit-benchmark.pd_luajit (100%) rename pdlua/{tutorial => }/examples/luajit-ffi.lua (100%) rename pdlua/{tutorial => }/examples/luajit.pd (100%) rename pdlua/{tutorial => }/examples/properties.pd (100%) rename pdlua/{tutorial => }/examples/props.pd_lua (100%) diff --git a/pdlua/tutorial/examples/lua-benchmark.pd_lua b/pdlua/examples/lua-benchmark.pd_lua similarity index 100% rename from pdlua/tutorial/examples/lua-benchmark.pd_lua rename to pdlua/examples/lua-benchmark.pd_lua diff --git a/pdlua/tutorial/examples/luajit-benchmark.pd_luajit b/pdlua/examples/luajit-benchmark.pd_luajit similarity index 100% rename from pdlua/tutorial/examples/luajit-benchmark.pd_luajit rename to pdlua/examples/luajit-benchmark.pd_luajit diff --git a/pdlua/tutorial/examples/luajit-ffi.lua b/pdlua/examples/luajit-ffi.lua similarity index 100% rename from pdlua/tutorial/examples/luajit-ffi.lua rename to pdlua/examples/luajit-ffi.lua diff --git a/pdlua/tutorial/examples/luajit.pd b/pdlua/examples/luajit.pd similarity index 100% rename from pdlua/tutorial/examples/luajit.pd rename to pdlua/examples/luajit.pd diff --git a/pdlua/tutorial/examples/properties.pd b/pdlua/examples/properties.pd similarity index 100% rename from pdlua/tutorial/examples/properties.pd rename to pdlua/examples/properties.pd diff --git a/pdlua/tutorial/examples/props.pd_lua b/pdlua/examples/props.pd_lua similarity index 100% rename from pdlua/tutorial/examples/props.pd_lua rename to pdlua/examples/props.pd_lua From 7904d57cb165c085da3d66a3904d974b51d8b5c5 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 23:00:45 +0100 Subject: [PATCH 093/109] Fix for updated example --- pdlua/hello-gui.pd_lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua/hello-gui.pd_lua b/pdlua/hello-gui.pd_lua index 38217c0..524bba6 100644 --- a/pdlua/hello-gui.pd_lua +++ b/pdlua/hello-gui.pd_lua @@ -58,7 +58,7 @@ function hello:mouse_drag(x, y) if dragging_rect == true then self.draggable_rect_x = self.rect_down_pos[0] + (x - self.mouse_down_pos[0]) self.draggable_rect_y = self.rect_down_pos[1] + (y - self.mouse_down_pos[1]) - self.draggable_rect_x = math.clamp(self.draggable_rect_x, 0, 710 - self.draggable_rect_size) + self.draggable_rect_x = math.clamp(self.draggable_rect_x, 0, 850 - self.draggable_rect_size) self.draggable_rect_y = math.clamp(self.draggable_rect_y, 0, 230 - self.draggable_rect_size) self:repaint(3) end From 4f893aceef3ce543f98b34b5ca7ac1fb1ab1739e Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Fri, 20 Mar 2026 23:25:37 +0100 Subject: [PATCH 094/109] Update to Lua 5.5 --- luas/lua | 2 +- luas/lua.c | 314 ++++++++++++++++++++------------------- pdlua/examples/luajit.pd | 4 +- 3 files changed, 162 insertions(+), 158 deletions(-) diff --git a/luas/lua b/luas/lua index 934fdd4..a5522f0 160000 --- a/luas/lua +++ b/luas/lua @@ -1 +1 @@ -Subproject commit 934fdd481ced3a9d4a7aaace4479ce889ab23582 +Subproject commit a5522f06d2679b8f18534fd6a9968f7eb539dc31 diff --git a/luas/lua.c b/luas/lua.c index 2214564..9fdb17f 100644 --- a/luas/lua.c +++ b/luas/lua.c @@ -1,160 +1,160 @@ -#define luaL_addgsub lua54_luaL_addgsub -#define luaL_addlstring lua54_luaL_addlstring -#define luaL_addstring lua54_luaL_addstring -#define luaL_addvalue lua54_luaL_addvalue -#define luaL_argerror lua54_luaL_argerror -#define luaL_buffinit lua54_luaL_buffinit -#define luaL_buffinitsize lua54_luaL_buffinitsize -#define luaL_callmeta lua54_luaL_callmeta -#define luaL_checkany lua54_luaL_checkany -#define luaL_checkinteger lua54_luaL_checkinteger -#define luaL_checklstring lua54_luaL_checklstring -#define luaL_checknumber lua54_luaL_checknumber -#define luaL_checkoption lua54_luaL_checkoption -#define luaL_checkstack lua54_luaL_checkstack -#define luaL_checktype lua54_luaL_checktype -#define luaL_checkudata lua54_luaL_checkudata -#define luaL_checkversion_ lua54_luaL_checkversion_ -#define luaL_error lua54_luaL_error -#define luaL_execresult lua54_luaL_execresult -#define luaL_fileresult lua54_luaL_fileresult -#define luaL_getmetafield lua54_luaL_getmetafield -#define luaL_getsubtable lua54_luaL_getsubtable -#define luaL_gsub lua54_luaL_gsub -#define luaL_len lua54_luaL_len -#define luaL_loadbufferx lua54_luaL_loadbufferx -#define luaL_loadfilex lua54_luaL_loadfilex -#define luaL_loadstring lua54_luaL_loadstring -#define luaL_newmetatable lua54_luaL_newmetatable -#define luaL_newstate lua54_luaL_newstate -#define luaL_openselectedlibs lua54_openselectedlibs -#define luaL_optinteger lua54_luaL_optinteger -#define luaL_optlstring lua54_luaL_optlstring -#define luaL_optnumber lua54_luaL_optnumber -#define luaL_prepbuffsize lua54_luaL_prepbuffsize -#define luaL_pushresult lua54_luaL_pushresult -#define luaL_pushresultsize lua54_luaL_pushresultsize -#define luaL_ref lua54_luaL_ref -#define luaL_requiref lua54_luaL_requiref -#define luaL_setfuncs lua54_luaL_setfuncs -#define luaL_setmetatable lua54_luaL_setmetatable -#define luaL_testudata lua54_luaL_testudata -#define luaL_tolstring lua54_luaL_tolstring -#define luaL_traceback lua54_luaL_traceback -#define luaL_typeerror lua54_luaL_typeerror -#define luaL_unref lua54_luaL_unref -#define luaL_where lua54_luaL_where -#define luaL_openlibs lua54_luaL_openlibs -#define lua_absindex lua54_lua_absindex -#define lua_arith lua54_lua_arith -#define lua_atpanic lua54_lua_atpanic -#define lua_callk lua54_lua_callk -#define lua_checkstack lua54_lua_checkstack -#define lua_close lua54_lua_close -#define lua_closeslot lua54_lua_closeslot -#define lua_closethread lua54_lua_closethread -#define lua_compare lua54_lua_compare -#define lua_concat lua54_lua_concat -#define lua_copy lua54_lua_copy -#define lua_createtable lua54_lua_createtable -#define lua_dump lua54_lua_dump -#define lua_error lua54_lua_error -#define lua_gc lua54_lua_gc -#define lua_getallocf lua54_lua_getallocf -#define lua_getfield lua54_lua_getfield -#define lua_getglobal lua54_lua_getglobal -#define lua_gethook lua54_lua_gethook -#define lua_gethookcount lua54_lua_gethookcount -#define lua_gethookmask lua54_lua_gethookmask -#define lua_geti lua54_lua_geti -#define lua_getinfo lua54_lua_getinfo -#define lua_getiuservalue lua54_lua_getiuservalue -#define lua_getlocal lua54_lua_getlocal -#define lua_getmetatable lua54_lua_getmetatable -#define lua_getstack lua54_lua_getstack -#define lua_gettable lua54_lua_gettable -#define lua_gettop lua54_lua_gettop -#define lua_getupvalue lua54_lua_getupvalue -#define lua_iscfunction lua54_lua_iscfunction -#define lua_isinteger lua54_lua_isinteger -#define lua_isnumber lua54_lua_isnumber -#define lua_isstring lua54_lua_isstring -#define lua_isuserdata lua54_lua_isuserdata -#define lua_isyieldable lua54_lua_isyieldable -#define lua_len lua54_lua_len -#define lua_load lua54_lua_load -#define lua_newstate lua54_lua_newstate -#define lua_newthread lua54_lua_newthread -#define lua_newuserdatauv lua54_lua_newuserdatauv -#define lua_next lua54_lua_next -#define lua_pcallk lua54_lua_pcallk -#define lua_pushboolean lua54_lua_pushboolean -#define lua_pushcclosure lua54_lua_pushcclosure -#define lua_pushfstring lua54_lua_pushfstring -#define lua_pushinteger lua54_lua_pushinteger -#define lua_pushlightuserdata lua54_lua_pushlightuserdata -#define lua_pushlstring lua54_lua_pushlstring -#define lua_pushnil lua54_lua_pushnil -#define lua_pushnumber lua54_lua_pushnumber -#define lua_pushstring lua54_lua_pushstring -#define lua_pushthread lua54_lua_pushthread -#define lua_pushvalue lua54_lua_pushvalue -#define lua_pushvfstring lua54_lua_pushvfstring -#define lua_rawequal lua54_lua_rawequal -#define lua_rawget lua54_lua_rawget -#define lua_rawgeti lua54_lua_rawgeti -#define lua_rawgetp lua54_lua_rawgetp -#define lua_rawlen lua54_lua_rawlen -#define lua_rawset lua54_lua_rawset -#define lua_rawseti lua54_lua_rawseti -#define lua_rawsetp lua54_lua_rawsetp -#define lua_resume lua54_lua_resume -#define lua_rotate lua54_lua_rotate -#define lua_setallocf lua54_lua_setallocf -#define lua_setcstacklimit lua54_lua_setcstacklimit -#define lua_setfield lua54_lua_setfield -#define lua_setglobal lua54_lua_setglobal -#define lua_sethook lua54_lua_sethook -#define lua_seti lua54_lua_seti -#define lua_setiuservalue lua54_lua_setiuservalue -#define lua_setlocal lua54_lua_setlocal -#define lua_setmetatable lua54_lua_setmetatable -#define lua_settable lua54_lua_settable -#define lua_settop lua54_lua_settop -#define lua_setupvalue lua54_lua_setupvalue -#define lua_setwarnf lua54_lua_setwarnf -#define lua_status lua54_lua_status -#define lua_stringtonumber lua54_lua_stringtonumber -#define lua_toboolean lua54_lua_toboolean -#define lua_tocfunction lua54_lua_tocfunction -#define lua_toclose lua54_lua_toclose -#define lua_tointegerx lua54_lua_tointegerx -#define lua_tolstring lua54_lua_tolstring -#define lua_tonumberx lua54_lua_tonumberx -#define lua_topointer lua54_lua_topointer -#define lua_tothread lua54_lua_tothread -#define lua_touserdata lua54_lua_touserdata -#define lua_type lua54_lua_type -#define lua_typename lua54_lua_typename -#define lua_upvalueid lua54_lua_upvalueid -#define lua_upvaluejoin lua54_lua_upvaluejoin -#define lua_version lua54_lua_version -#define lua_warning lua54_lua_warning -#define lua_xmove lua54_lua_xmove -#define lua_yieldk lua54_lua_yieldk -#define luaopen_base lua54_luaopen_base -#define luaopen_coroutine lua54_luaopen_coroutine -#define luaopen_debug lua54_luaopen_debug -#define luaopen_io lua54_luaopen_io -#define luaopen_math lua54_luaopen_math -#define luaopen_os lua54_luaopen_os -#define luaopen_package lua54_luaopen_package -#define luaopen_string lua54_luaopen_string -#define luaopen_table lua54_luaopen_table -#define luaopen_utf8 lua54_luaopen_utf8 +#define luaL_addgsub lua55_luaL_addgsub +#define luaL_addlstring lua55_luaL_addlstring +#define luaL_addstring lua55_luaL_addstring +#define luaL_addvalue lua55_luaL_addvalue +#define luaL_argerror lua55_luaL_argerror +#define luaL_buffinit lua55_luaL_buffinit +#define luaL_buffinitsize lua55_luaL_buffinitsize +#define luaL_callmeta lua55_luaL_callmeta +#define luaL_checkany lua55_luaL_checkany +#define luaL_checkinteger lua55_luaL_checkinteger +#define luaL_checklstring lua55_luaL_checklstring +#define luaL_checknumber lua55_luaL_checknumber +#define luaL_checkoption lua55_luaL_checkoption +#define luaL_checkstack lua55_luaL_checkstack +#define luaL_checktype lua55_luaL_checktype +#define luaL_checkudata lua55_luaL_checkudata +#define luaL_checkversion_ lua55_luaL_checkversion_ +#define luaL_error lua55_luaL_error +#define luaL_execresult lua55_luaL_execresult +#define luaL_fileresult lua55_luaL_fileresult +#define luaL_getmetafield lua55_luaL_getmetafield +#define luaL_getsubtable lua55_luaL_getsubtable +#define luaL_gsub lua55_luaL_gsub +#define luaL_len lua55_luaL_len +#define luaL_loadbufferx lua55_luaL_loadbufferx +#define luaL_loadfilex lua55_luaL_loadfilex +#define luaL_loadstring lua55_luaL_loadstring +#define luaL_newmetatable lua55_luaL_newmetatable +#define luaL_newstate lua55_luaL_newstate +#define luaL_openselectedlibs lua55_openselectedlibs +#define luaL_optinteger lua55_luaL_optinteger +#define luaL_optlstring lua55_luaL_optlstring +#define luaL_optnumber lua55_luaL_optnumber +#define luaL_prepbuffsize lua55_luaL_prepbuffsize +#define luaL_pushresult lua55_luaL_pushresult +#define luaL_pushresultsize lua55_luaL_pushresultsize +#define luaL_ref lua55_luaL_ref +#define luaL_requiref lua55_luaL_requiref +#define luaL_setfuncs lua55_luaL_setfuncs +#define luaL_setmetatable lua55_luaL_setmetatable +#define luaL_testudata lua55_luaL_testudata +#define luaL_tolstring lua55_luaL_tolstring +#define luaL_traceback lua55_luaL_traceback +#define luaL_typeerror lua55_luaL_typeerror +#define luaL_unref lua55_luaL_unref +#define luaL_where lua55_luaL_where +#define lua_absindex lua55_lua_absindex +#define lua_arith lua55_lua_arith +#define lua_atpanic lua55_lua_atpanic +#define lua_callk lua55_lua_callk +#define lua_checkstack lua55_lua_checkstack +#define lua_close lua55_lua_close +#define lua_closeslot lua55_lua_closeslot +#define lua_closethread lua55_lua_closethread +#define lua_compare lua55_lua_compare +#define lua_concat lua55_lua_concat +#define lua_copy lua55_lua_copy +#define lua_createtable lua55_lua_createtable +#define lua_dump lua55_lua_dump +#define lua_error lua55_lua_error +#define lua_gc lua55_lua_gc +#define lua_getallocf lua55_lua_getallocf +#define lua_getfield lua55_lua_getfield +#define lua_getglobal lua55_lua_getglobal +#define lua_gethook lua55_lua_gethook +#define lua_gethookcount lua55_lua_gethookcount +#define lua_gethookmask lua55_lua_gethookmask +#define lua_geti lua55_lua_geti +#define lua_getinfo lua55_lua_getinfo +#define lua_getiuservalue lua55_lua_getiuservalue +#define lua_getlocal lua55_lua_getlocal +#define lua_getmetatable lua55_lua_getmetatable +#define lua_getstack lua55_lua_getstack +#define lua_gettable lua55_lua_gettable +#define lua_gettop lua55_lua_gettop +#define lua_getupvalue lua55_lua_getupvalue +#define lua_iscfunction lua55_lua_iscfunction +#define lua_isinteger lua55_lua_isinteger +#define lua_isnumber lua55_lua_isnumber +#define lua_isstring lua55_lua_isstring +#define lua_isuserdata lua55_lua_isuserdata +#define lua_isyieldable lua55_lua_isyieldable +#define lua_len lua55_lua_len +#define lua_load lua55_lua_load +#define lua_newstate lua55_lua_newstate +#define lua_newthread lua55_lua_newthread +#define lua_newuserdatauv lua55_lua_newuserdatauv +#define lua_next lua55_lua_next +#define lua_pcallk lua55_lua_pcallk +#define lua_pushboolean lua55_lua_pushboolean +#define lua_pushcclosure lua55_lua_pushcclosure +#define lua_pushfstring lua55_lua_pushfstring +#define lua_pushinteger lua55_lua_pushinteger +#define lua_pushlightuserdata lua55_lua_pushlightuserdata +#define lua_pushlstring lua55_lua_pushlstring +#define lua_pushnil lua55_lua_pushnil +#define lua_pushnumber lua55_lua_pushnumber +#define lua_pushstring lua55_lua_pushstring +#define lua_pushthread lua55_lua_pushthread +#define lua_pushvalue lua55_lua_pushvalue +#define lua_pushvfstring lua55_lua_pushvfstring +#define lua_rawequal lua55_lua_rawequal +#define lua_rawget lua55_lua_rawget +#define lua_rawgeti lua55_lua_rawgeti +#define lua_rawgetp lua55_lua_rawgetp +#define lua_rawlen lua55_lua_rawlen +#define lua_rawset lua55_lua_rawset +#define lua_rawseti lua55_lua_rawseti +#define lua_rawsetp lua55_lua_rawsetp +#define lua_resume lua55_lua_resume +#define lua_rotate lua55_lua_rotate +#define lua_setallocf lua55_lua_setallocf +#define lua_setcstacklimit lua55_lua_setcstacklimit +#define lua_setfield lua55_lua_setfield +#define lua_setglobal lua55_lua_setglobal +#define lua_sethook lua55_lua_sethook +#define lua_seti lua55_lua_seti +#define lua_setiuservalue lua55_lua_setiuservalue +#define lua_setlocal lua55_lua_setlocal +#define lua_setmetatable lua55_lua_setmetatable +#define lua_settable lua55_lua_settable +#define lua_settop lua55_lua_settop +#define lua_setupvalue lua55_lua_setupvalue +#define lua_setwarnf lua55_lua_setwarnf +#define lua_status lua55_lua_status +#define lua_stringtonumber lua55_lua_stringtonumber +#define lua_toboolean lua55_lua_toboolean +#define lua_tocfunction lua55_lua_tocfunction +#define lua_toclose lua55_lua_toclose +#define lua_tointegerx lua55_lua_tointegerx +#define lua_tolstring lua55_lua_tolstring +#define lua_tonumberx lua55_lua_tonumberx +#define lua_topointer lua55_lua_topointer +#define lua_tothread lua55_lua_tothread +#define lua_touserdata lua55_lua_touserdata +#define lua_type lua55_lua_type +#define lua_typename lua55_lua_typename +#define lua_upvalueid lua55_lua_upvalueid +#define lua_upvaluejoin lua55_lua_upvaluejoin +#define lua_version lua55_lua_version +#define lua_warning lua55_lua_warning +#define lua_xmove lua55_lua_xmove +#define lua_yieldk lua55_lua_yieldk +#define luaopen_base lua55_luaopen_base +#define luaopen_coroutine lua55_luaopen_coroutine +#define luaopen_debug lua55_luaopen_debug +#define luaopen_io lua55_luaopen_io +#define luaopen_math lua55_luaopen_math +#define luaopen_os lua55_luaopen_os +#define luaopen_package lua55_luaopen_package +#define luaopen_string lua55_luaopen_string +#define luaopen_table lua55_luaopen_table +#define luaopen_utf8 lua55_luaopen_utf8 #define l_likely(x) luai_likely(x) #define l_unlikely(x) luai_unlikely(x) + #include "lua/lua.h" #include "lua/lauxlib.h" #include "lua/lualib.h" @@ -164,6 +164,10 @@ #include "../pdlua.c" #ifdef PURR_DATA -#define error lua54_error +#define error lua55_error #endif + +// Fix unistd namespace clash +#define getmode lua55_getmode + #include "lua/onelua.c" diff --git a/pdlua/examples/luajit.pd b/pdlua/examples/luajit.pd index 9784979..6231bd0 100644 --- a/pdlua/examples/luajit.pd +++ b/pdlua/examples/luajit.pd @@ -11,12 +11,12 @@ #X text 299 506 .pd_lua; #X text 497 505 .pd_luajit; #X text 178 539 Lua version; -#X text 313 537 5.4; +#X text 313 537 5.5; #X text 487 537 5.1 + compat53; #X text 178 569 Performance; #X text 298 569 baseline; #X text 495 567 ~6x faster; -#X text 57 102 Currently \, the standard pdlua parser is based on Lua 5.4. The pdluajit parser is based on Lua 5.1 \, with a compatibility layer (compat53) that makes some (but not all) of the Lua 5.3 syntax available as well. The LuaJIT version used is v2.1, f 93; +#X text 57 102 Currently \, the standard pdlua parser is based on Lua 5.5. The pdluajit parser is based on Lua 5.1 \, with a compatibility layer (compat53) that makes some (but not all) of the Lua 5.3 syntax available as well. The LuaJIT version used is v2.1, f 93; #X text 50 157 Note that Lua and LuaJIT have their own separate environment \, so while global variables declared inside Lua can be seen from other files \, they will not cross the Lua/LuaJIT border, f 94; #X text 58 42 pdlua can either use Lua or LuaJIT as its parser. While the regular Lua parser offers more modern Lua syntax \, the LuaJIT parser offers much better performance. Files that end with .pd_lua will be picked up by Lua \, whereas files ending with .pd_luajit will run in LuaJIT, f 93; #X obj 322 310 luajit-benchmark; From 5e3e8bad9f790ab0519fd9c6d7d422e030e50761 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 21 Mar 2026 12:29:41 +0100 Subject: [PATCH 095/109] Remove broken ability to build against local Lua installation, fix macOS min version, add LUA52COMPAT flag for LuaJIT --- Makefile | 33 +++++++++------------------------ luas/lua.c | 26 ++++++++++++++++++++++++-- luas/luajit.c | 28 +++++++++++++++++++++++++--- pdlua.c | 16 ++++++++-------- pdlua_properties.h | 14 +++++++------- 5 files changed, 73 insertions(+), 44 deletions(-) diff --git a/Makefile b/Makefile index 78c0255..dc637b8 100644 --- a/Makefile +++ b/Makefile @@ -15,19 +15,13 @@ lib.name = pdlua pdlua_version := $(shell git describe --tags 2>/dev/null) -luasrc = $(wildcard luas/lua/onelua.c) +luajit_dir = ./luas/luajit/src +luajit_lib = $(luajit_dir)/libluajit.a -PKG_CONFIG ?= pkg-config +luajit_src = ./luas/luajit.c +lua_src = ./luas/lua.c -ifeq ($(luasrc),) -# compile with installed liblua -$(info ++++ NOTE: using installed lua) -luaflags = $(shell $(PKG_CONFIG) --cflags lua) -lualibs = $(shell $(PKG_CONFIG) --libs lua) -else -# compile with Lua submodule -$(info ++++ NOTE: using lua submodule) -luaflags = -DMAKE_LIB -Iluas/luajit/src +luaflags = -DMAKE_LIB define forDarwin luaflags += -DLUA_USE_MACOSX endef @@ -37,18 +31,14 @@ endef define forWindows luaflags += -DLUA_USE_WINDOWS endef -endif - -luajit_dir = ./luas/luajit/src -luajit_lib = $(luajit_dir)/libluajit.a cflags = $(luaflags) -DPDLUA_VERSION="$(pdlua_version)" ifdef PD_MULTICHANNEL cflags += -DPD_MULTICHANNEL=$(PD_MULTICHANNEL) endif -pdlua.class.sources := luas/lua.c luas/luajit.c -pdlua.class.ldlibs := $(lualibs) $(luajit_lib) +pdlua.class.sources := $(lua_src) $(luajit_src) +pdlua.class.ldlibs := $(luajit_lib) datafiles = \ pd.lua $(wildcard pdlua*-help.pd) \ @@ -62,16 +52,11 @@ datadirs = $(shell /usr/bin/find pdlua -type d) PDLIBBUILDER_DIR=. include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder -compat53_headers = \ - luas/lua-compat-5.3/compat53/compat53_init.h \ - luas/lua-compat-5.3/compat53/compat53_module.h \ - luas/lua-compat-5.3/compat53/compat53_file_mt.h - $(luajit_lib): ifeq ($(system), Windows) - $(MAKE) -C $(luajit_dir) BUILDMODE=static + $(MAKE) -C $(luajit_dir) BUILDMODE=static XCFLAGS="-DLUAJIT_ENABLE_LUA52COMPAT" else - $(MAKE) -C $(luajit_dir) CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.11 + $(MAKE) -C $(luajit_dir) BUILDMODE=static CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.6 XCFLAGS="-DLUAJIT_ENABLE_LUA52COMPAT" endif pdlua.$(extension): $(luajit_lib) diff --git a/luas/lua.c b/luas/lua.c index 9fdb17f..d9ab48d 100644 --- a/luas/lua.c +++ b/luas/lua.c @@ -1,3 +1,26 @@ +/** @file lua.c + * @brief lua.c -- A wrapper around pdlua.c to allow building against the shipped Lua 5.5 submodule + * @author Timothy Schoen + * @date 2026 + * + * Copyright (C) 2026 Timothy Schoen + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + #define luaL_addgsub lua55_luaL_addgsub #define luaL_addlstring lua55_luaL_addlstring #define luaL_addstring lua55_luaL_addstring @@ -152,8 +175,7 @@ #define luaopen_table lua55_luaopen_table #define luaopen_utf8 lua55_luaopen_utf8 #define l_likely(x) luai_likely(x) -#define l_unlikely(x) luai_unlikely(x) - +#define l_unlikely(x) luai_unlikely(x) #include "lua/lua.h" #include "lua/lauxlib.h" diff --git a/luas/luajit.c b/luas/luajit.c index 0e4b335..66e0b48 100644 --- a/luas/luajit.c +++ b/luas/luajit.c @@ -1,4 +1,25 @@ -#define LUA_USE_JIT 1 +/** @file lua_55.c + * @brief lua_55 -- A wrapper around pdlua.c to allow building against the shipped LuaJIT 2.1 + compat53 submodule + * @author Timothy Schoen + * @date 2026 + * + * Copyright (C) 2026 Timothy Schoen + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ #include "luajit/src/lua.h" #include "luajit/src/lauxlib.h" @@ -37,8 +58,6 @@ static void preload_compat53(lua_State *L) { lua_call(L, 1, 0); } -#define LUA_FILE_EXTENSION ".pd_luajit" -#define LUA_USE_JIT 1 #undef lua_load #undef lua_gc @@ -62,4 +81,7 @@ static void preload_compat53(lua_State *L) { #define plugdata_register_class plugdata_register_class_jit #endif +#define LUA_FILE_EXTENSION ".pd_luajit" +#define LUA_USE_JIT 1 + #include "../pdlua.c" diff --git a/pdlua.c b/pdlua.c index 27980a0..7eb1e31 100644 --- a/pdlua.c +++ b/pdlua.c @@ -92,13 +92,13 @@ # define CLASS_MULTICHANNEL 0 #endif -#ifdef IGNORE_UNUSED +#ifdef MAYBE_UNUSED #elif defined(__GNUC__) -# define IGNORE_UNUSED(x) UNUSED_ ## x __attribute__((unused)) +# define MAYBE_UNUSED(x) x __attribute__((unused)) #elif defined(__LCLINT__) -# define IGNORE_UNUSED(x) /*@unused@*/ x +# define MAYBE_UNUSED(x) /*@unused@*/ x #else -# define IGNORE_UNUSED(x) x +# define MAYBE_UNUSED(x) x #endif /* BAD: end of bad section */ @@ -391,7 +391,7 @@ static t_class *pdlua_proxycanvas_class; /** Lua file reader callback. */ static const char *pdlua_reader ( - lua_State *IGNORE_UNUSED(L), /**< Lua interpreter state. */ + lua_State *MAYBE_UNUSED(L), /**< Lua interpreter state. */ void *rr, /**< Lua file reader state. */ size_t *size /**< How much data we have read. */ ) @@ -492,7 +492,7 @@ static void pdlua_proxyinlet_anything static void pdlua_proxyinlet_fwd ( t_pdlua_proxyinlet *p, /**< The proxy inlet that received the message. */ - t_symbol *IGNORE_UNUSED(s), /**< The message selector, which is always "fwd" */ + t_symbol *MAYBE_UNUSED(s), /**< The message selector, which is always "fwd" */ int argc, /**< The message length. */ t_atom *argv /**< The atoms in the message. The first atom is the actual selector */ ) @@ -3116,7 +3116,7 @@ static int pdlua_loader_legacy ( t_canvas *canvas, /**< Pd canvas to use to find the script. */ char *name, /**< The name of the script (without .pd_lua extension). */ - char *IGNORE_UNUSED(path) /**< Path variable for new loader, unused here */ + char *MAYBE_UNUSED(path) /**< Path variable for new loader, unused here */ ) { char dirbuf[MAXPDSTRING]; @@ -3129,7 +3129,7 @@ static int pdlua_loader_legacy static int pdlua_loader_pathwise ( - t_canvas *IGNORE_UNUSED(canvas), /**< Pd canvas to use to find the script. */ + t_canvas *MAYBE_UNUSED(canvas), /**< Pd canvas to use to find the script. */ const char *objectname, /**< The name of the script (without .pd_lua extension). */ const char *path /**< The directory to search for the script */ ) diff --git a/pdlua_properties.h b/pdlua_properties.h index b5910ed..2a3a1cf 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -1,6 +1,6 @@ /** @file pdlua_properties.h - * @brief pdlpdlua_propertiesua_gfx -- an extension to pdlua that spawning properties windowds - * @author Charles K. Neimog + * @brief pdlpdlua_propertiesua_gfx -- an extension to pdlua to allow spawning properties windows + * @author Charles K. Neimog and Timothy Schoen * @date 2026 * * Copyright (C) 2026 Charles K. Neimog and Timothy Schoen @@ -48,7 +48,7 @@ static void pdlua_properties_setup(lua_State* L) luaL_setfuncs(L, properties_methods, 0); } -static void pdlua_properties_free(t_pdlua_properties *p) +static void pdlua_properties_free(t_pdlua_properties *MAYBE_UNUSED(p)) { #ifdef PURR_DATA if(p->property_count) @@ -176,7 +176,7 @@ static inline void plugdata_add_property(lua_State* L, const char* sym, const ch va_end(defaults); } -static void pdlua_properties(t_gobj *z, t_glist * IGNORE_UNUSED(owner)) +static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { t_pdlua *pdlua = (t_pdlua *)z; lua_State *L = __L(); @@ -240,7 +240,7 @@ static int pdlua_properties_addcombo(lua_State *L) return 0; } -static void pdlua_properties_receiver(t_pdlua *o, t_symbol * IGNORE_UNUSED(s), int argc, t_atom *argv) +static void pdlua_properties_receiver(t_pdlua *o, t_symbol *MAYBE_UNUSED(s), int argc, t_atom *argv) { if (argc < 2) return; @@ -328,7 +328,7 @@ static inline void purrdata_add_callback(t_pdlua_properties *p, const char *type #endif -static void pdlua_properties(t_gobj *z, t_glist *IGNORE_UNUSED(owner)) { +static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { t_pdlua *pdlua = (t_pdlua *)z; t_pdlua_properties *p = &pdlua->properties; @@ -1056,7 +1056,7 @@ static void pdlua_properties_apply(t_pdlua *o) p->pending_count = 0; } -static void pdlua_properties_receiver(t_pdlua *o, t_symbol *IGNORE_UNUSED(s), int argc, t_atom *argv) +static void pdlua_properties_receiver(t_pdlua *o, t_symbol *MAYBE_UNUSED(s), int argc, t_atom *argv) { t_pdlua_properties *p = &o->properties; From b4b14813f8fefd994938836e8475200c573075fc Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 21 Mar 2026 13:09:30 +0100 Subject: [PATCH 096/109] Fix all GCC/Clang warnings, consistent variable naming, more cleaning --- Makefile | 5 +- luas/lua.c | 4 + luas/luajit.c | 4 +- pdlua.c | 45 +++--- pdlua_gfx.h | 5 +- pdlua_properties.h | 331 +++++++++++++++++++++--------------------- svg/nanosvg.h | 2 +- svg/stb_image_write.h | 2 +- 8 files changed, 202 insertions(+), 196 deletions(-) diff --git a/Makefile b/Makefile index dc637b8..6126b79 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,10 @@ define forWindows luaflags += -DLUA_USE_WINDOWS endef -cflags = $(luaflags) -DPDLUA_VERSION="$(pdlua_version)" +# stbi and nanosvg have functions we don't use +suppress-wunused=1 + +cflags = $(luaflags) -DPDLUA_VERSION="$(pdlua_version)" -Iluas/luajit/src ifdef PD_MULTICHANNEL cflags += -DPD_MULTICHANNEL=$(PD_MULTICHANNEL) endif diff --git a/luas/lua.c b/luas/lua.c index d9ab48d..13e2152 100644 --- a/luas/lua.c +++ b/luas/lua.c @@ -192,4 +192,8 @@ // Fix unistd namespace clash #define getmode lua55_getmode +// Lua's source will trigger a gcc warning because it hits the maximum inlining limit +// This is normal and expected, so silence it +#pragma GCC diagnostic ignored "-Winline" + #include "lua/onelua.c" diff --git a/luas/luajit.c b/luas/luajit.c index 66e0b48..cf80671 100644 --- a/luas/luajit.c +++ b/luas/luajit.c @@ -1,5 +1,5 @@ -/** @file lua_55.c - * @brief lua_55 -- A wrapper around pdlua.c to allow building against the shipped LuaJIT 2.1 + compat53 submodule +/** @file luajit.c + * @brief luajit.c -- A wrapper around pdlua.c to allow building against the shipped LuaJIT 2.1 + compat53 submodule * @author Timothy Schoen * @date 2026 * diff --git a/pdlua.c b/pdlua.c index 7eb1e31..520537a 100644 --- a/pdlua.c +++ b/pdlua.c @@ -216,7 +216,7 @@ static t_symbol* global_gensym(const char* s) // So we pass a data directory to the setup function instead and store it here. // ag: Renamed to pdlua_datadir since we also need this in vanilla when // setting up Lua's package.path. -char pdlua_datadir[MAXPDSTRING]; +char pdlua_datadir[PATH_MAX+1]; #if PLUGDATA // Hook to inform plugdata which class names are lua objects void(*plugdata_register_class)(const char*); @@ -675,7 +675,7 @@ static char *src_info(lua_State *L, char *msg) // cf. "The Debug Interface" in the Lua reference manual if (*src == '@') src = basename(src+1); if (strcmp(ar.what, "Lua") == 0 && strcmp(src, "pd.lua") != 0) { - snprintf(msg, MAXPDSTRING-1, "%s: %d", src, ar.linedefined); + snprintf(msg, MAXPDSTRING, "%s: %d", src, ar.linedefined); return msg; } } @@ -835,7 +835,7 @@ static t_pdlua *pdlua_new if (object->has_gui) { t_canvas *parent_canvas = glist_getcanvas(object->canvas); char buf[MAXPDSTRING]; - snprintf(buf, MAXPDSTRING-1, ".x%lx", (unsigned long)parent_canvas); + snprintf(buf, MAXPDSTRING, ".x%lx", (unsigned long)parent_canvas); object->gfx.proxycanvas = pdlua_proxycanvas_new(object, gensym(buf)); if (!object->gfx.proxycanvas) { pd_error(NULL, "pdlua: failed to create canvas proxy"); @@ -1155,7 +1155,7 @@ static void pdlua_menu_open(t_pdlua *o) { const char *name; const char *path; - char pathname[FILENAME_MAX]; + char pathname[FILENAME_MAX+1]; t_class *class; /* 20240903 ag: This is surpringly complicated, because there are various @@ -1192,11 +1192,11 @@ static void pdlua_menu_open(t_pdlua *o) path = class->c_externdir->s_name; if (sys_isabsolutepath(name)) { // pdluax returns an absolute path for its script, just use that. - snprintf(pathname, FILENAME_MAX-1, "%s", name); + snprintf(pathname, FILENAME_MAX+1, "%s", name); } else if (sys_isabsolutepath(path)) { // If the externdir is an absolute path, just use it, no questions // asked. This should cover most cases. - snprintf(pathname, FILENAME_MAX-1, "%s/%s", path, name); + snprintf(pathname, FILENAME_MAX+1, "%s/%s", path, name); } else { // Normally, the externdir of an object should be absolute, but if // it isn't, it should be relative to the cwd we recorded at @@ -1208,7 +1208,7 @@ static void pdlua_menu_open(t_pdlua *o) snprintf(s, PATH_MAX, "%s/%s", pdlua_cwd, name); // canonicalize if (realpath(s, real_path)) s = real_path; - snprintf(pathname, FILENAME_MAX-1, "%s", s); + snprintf(pathname, FILENAME_MAX+1, "%s", s); } //post("path = %s, name = %s, pathname = %s", path, name, pathname); lua_pop(__L(), 2); /* pop name, global "pd"*/ @@ -1536,7 +1536,7 @@ static int pdlua_class_new(lua_State *L) return 0; } - snprintf(name_gfx, MAXPDSTRING-1, "%s:gfx", name); + snprintf(name_gfx, MAXPDSTRING, "%s:gfx", name); PDLUA_DEBUG3("pdlua_class_new: L is %p, name is %s stack top is %d", L, name, lua_gettop(L)); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-function-type" @@ -2616,15 +2616,16 @@ static void pdlua_packagepath(lua_State *L, const char *path) lua_pushstring(L, "path"); lua_gettable(L, -2); const char *packagepath = lua_tostring(L, -1); - char *buf = malloc(2*strlen(path)+20+strlen(packagepath)); + int bufsize = 2*strlen(path)+20+strlen(packagepath); + char *buf = malloc(bufsize); if (!buf) { lua_pop(L, 2); return; } #ifdef _WIN32 - sprintf(buf, "%s\\?.lua;%s\\?\\init.lua;%s", path, path, packagepath); + snprintf(buf, bufsize, "%s\\?.lua;%s\\?\\init.lua;%s", path, path, packagepath); #else - sprintf(buf, "%s/?.lua;%s/?/init.lua;%s", path, path, packagepath); + snprintf(buf, bufsize, "%s/?.lua;%s/?/init.lua;%s", path, path, packagepath); #endif lua_pop(L, 1); lua_pushstring(L, "path"); @@ -2639,9 +2640,9 @@ static void pdlua_packagepath(lua_State *L, const char *path) return; } #ifdef _WIN32 - sprintf(buf, "%s\\?.dll;%s", path, packagepath); + snprintf(buf, bufsize, "%s\\?.dll;%s", path, packagepath); #else - sprintf(buf, "%s/?.so;%s", path, packagepath); + snprintf(buf, bufsize, "%s/?.so;%s", path, packagepath); #endif lua_pop(L, 1); lua_pushstring(L, "cpath"); @@ -3051,7 +3052,7 @@ static int pdlua_loader_fromfd reader.fd = fd; // we want to have the filename with extension as the name of the chunk char filename[MAXPDSTRING]; - snprintf(filename, MAXPDSTRING-1, "%s.pd_lua", name); + snprintf(filename, MAXPDSTRING, "%s.pd_lua", name); #if LUA_VERSION_NUM < 502 if (lua_load(__L(), pdlua_reader, &reader, filename) || lua_pcall(__L(), 0, 0, 0)) #else // 5.2 style @@ -3185,7 +3186,7 @@ static int pdlua_loader_pathwise static int init_pdlua_environment(lua_State* L, const char* datadir) { - char pd_lua_path[MAXPDSTRING]; + char pd_lua_path[PATH_MAX+8]; t_pdlua_readerdata reader; int fd, result; @@ -3199,7 +3200,7 @@ static int init_pdlua_environment(lua_State* L, const char* datadir) preload_compat53(L); #endif - snprintf(pd_lua_path, MAXPDSTRING-1, "%s/pd.lua", datadir); + snprintf(pd_lua_path, PATH_MAX+8, "%s/pd.lua", datadir); PDLUA_DEBUG("pd_lua_path %s", pd_lua_path); fd = open(pd_lua_path, O_RDONLY); @@ -3306,8 +3307,8 @@ void pdlua_setup(void) char pdluaver[MAXPDSTRING]; char compiled[MAXPDSTRING]; - snprintf(pdluaver, MAXPDSTRING-1, "pdlua %s (GPL) 2008 Claude Heiland-Allen, 2014 Martin Peach et al.", pdlua_version); - snprintf(compiled, MAXPDSTRING-1, "pdlua: compiled for pd-%d.%d on %s", + snprintf(pdluaver, MAXPDSTRING, "pdlua %s (GPL) 2008 Claude Heiland-Allen, 2014 Martin Peach et al.", pdlua_version); + snprintf(compiled, MAXPDSTRING, "pdlua: compiled for pd-%d.%d on %s", PD_MAJOR_VERSION, PD_MINOR_VERSION, BUILD_DATE); // post version and other information post(pdluaver); @@ -3321,9 +3322,9 @@ void pdlua_setup(void) lvm = (*luaversion)/100; lvl = (*luaversion) - (100*lvm); #ifdef LUA_USE_JIT - snprintf(luaversionStr, MAXPDSTRING-1, "Using luajit with lua version %d.%d", lvm, lvl); + snprintf(luaversionStr, MAXPDSTRING, "Using luajit with lua version %d.%d", lvm, lvl); #else - snprintf(luaversionStr, MAXPDSTRING-1, "Using lua version %d.%d", lvm, lvl); + snprintf(luaversionStr, MAXPDSTRING, "Using lua version %d.%d", lvm, lvl); #endif #if PLUGDATA @@ -3382,7 +3383,7 @@ void pdlua_setup(void) // In plugdata we're linked statically and thus c_externdir is empty. // Instead, we get our data directory from plugdata and expect to find the // external dir in /pdlua. - snprintf(pdlua_datadir, MAXPDSTRING-1, "%s/pdlua", datadir); + snprintf(pdlua_datadir, PATH_MAX+1, "%s/pdlua", datadir); #else const char *s = pdlua_proxyinlet_class->c_externdir->s_name; if (!sys_isabsolutepath(s)) { @@ -3390,7 +3391,7 @@ void pdlua_setup(void) char real_path[PATH_MAX+1]; if (realpath(s, real_path)) s = real_path; } - snprintf(pdlua_datadir, MAXPDSTRING-1, "%s", s); + snprintf(pdlua_datadir, PATH_MAX+1, "%s", s); #endif if (!getcwd(pdlua_cwd, MAXPDSTRING)) // if we can't get the cwd, this is the best that we can do diff --git a/pdlua_gfx.h b/pdlua_gfx.h index a9b7f7f..26649bb 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -23,14 +23,12 @@ #if !defined(PLUGDATA) && !defined(PURR_DATA) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" #define NANOSVG_IMPLEMENTATION #include "svg/nanosvg.h" #define NANOSVGRAST_IMPLEMENTATION #include "svg/nanosvgrast.h" -#define STB_IMAGE_STATIC #define STBI_NO_THREAD_LOCALS +#define STB_IMAGE_STATIC #define STB_IMAGE_IMPLEMENTATION #include "svg/stb_image.h" #define STB_IMAGE_WRITE_STATIC @@ -39,7 +37,6 @@ #define STB_IMAGE_RESIZE_STATIC #define STB_IMAGE_RESIZE_IMPLEMENTATION #include "svg/stb_image_resize2.h" -#pragma GCC diagnostic pop #endif #ifdef PURR_DATA diff --git a/pdlua_properties.h b/pdlua_properties.h index 2a3a1cf..d845059 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -48,6 +48,8 @@ static void pdlua_properties_setup(lua_State* L) luaL_setfuncs(L, properties_methods, 0); } +#define IDLENGTH 256 + static void pdlua_properties_free(t_pdlua_properties *MAYBE_UNUSED(p)) { #ifdef PURR_DATA @@ -358,7 +360,7 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { { gui_end_array(); gui_end_vmess(); - + mylua_error(L, pdlua, "properties"); return; } @@ -398,12 +400,12 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { pdgui_vmess(0, "sssfsf", p->properties_receiver->s_name, "configure", "-padx", 0.0f, "-pady", 0.0f); // main window - char frameId[MAXPDSTRING]; - snprintf(frameId, MAXPDSTRING, ".%p.main", (void *)p); + char frame_id[IDLENGTH]; + snprintf(frame_id, IDLENGTH, ".%p.main", (void *)p); pdgui_vmess(0, "sss", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window - pdgui_vmess(0, "sssf", "frame", frameId, "-padx", 15.0f, "-pady", 15.0f); - pdgui_vmess(0, "sssssf", "pack", frameId, "-fill", "both", "-expand", 4.0f); - pdgui_vmess(0, "sssfsf", "pack", frameId, "-pady", 10.f, "-padx", 10.f); + pdgui_vmess(0, "sssf", "frame", frame_id, "-padx", 15.0f, "-pady", 15.0f); + pdgui_vmess(0, "sssssf", "pack", frame_id, "-fill", "both", "-expand", 4.0f); + pdgui_vmess(0, "sssfsf", "pack", frame_id, "-pady", 10.f, "-padx", 10.f); // call _properties lua_getglobal(L, "pd"); @@ -422,38 +424,38 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { return; } - char buttonsId[MAXPDSTRING]; - snprintf(buttonsId, MAXPDSTRING, ".%p.buttons", (void *)p); + char buttons_id[IDLENGTH]; + snprintf(buttons_id, IDLENGTH, ".%p.buttons", (void *)p); - char buttonCancelId[MAXPDSTRING]; - char buttonApplyId[MAXPDSTRING]; - char buttonOkId[MAXPDSTRING]; - snprintf(buttonCancelId, MAXPDSTRING, ".%p.buttons.cancel", (void *)p); - snprintf(buttonApplyId, MAXPDSTRING, ".%p.buttons.apply", (void *)p); - snprintf(buttonOkId, MAXPDSTRING, ".%p.buttons.ok", (void *)p); + char button_cancel_id[IDLENGTH]; + char button_apply_id[IDLENGTH]; + char button_ok_id[IDLENGTH]; + snprintf(button_cancel_id, IDLENGTH, ".%p.buttons.cancel", (void *)p); + snprintf(button_apply_id, IDLENGTH, ".%p.buttons.apply", (void *)p); + snprintf(button_ok_id, IDLENGTH, ".%p.buttons.ok", (void *)p); - char destroyCommand[MAXPDSTRING]; - snprintf(destroyCommand, MAXPDSTRING, "destroy .%p", (void *)p); + char destroy_command[MAXPDSTRING]; + snprintf(destroy_command, MAXPDSTRING, "destroy .%p", (void *)p); - pdgui_vmess(0, "sssf", "frame", buttonsId, "-pady", 5.0f); - pdgui_vmess(0, "ssss", "pack", buttonsId, "-fill", "x"); + pdgui_vmess(0, "sssf", "frame", buttons_id, "-pady", 5.0f); + pdgui_vmess(0, "ssss", "pack", buttons_id, "-fill", "x"); #if __APPLE__ - const char* okButtonState = "normal"; + const char* ok_state = "normal"; #else - const char* okButtonState = "active"; + const char* ok_state = "active"; #endif - char okCommand[MAXPDSTRING * 2]; - snprintf(okCommand, MAXPDSTRING * 2, + char ok_command[MAXPDSTRING]; + snprintf(ok_command, MAXPDSTRING, "pdsend \"%s dialog apply\"; destroy .%p", p->properties_receiver->s_name, (void *)p); - pdgui_vmess(0, "ssssssss", "button", buttonOkId, - "-text", "OK", "-command", okCommand, "-default", okButtonState); + pdgui_vmess(0, "ssssssss", "button", button_ok_id, + "-text", "OK", "-command", ok_command, "-default", ok_state); - pdgui_vmess(0, "ssssss", "button", buttonCancelId, - "-text", "Cancel", "-command", destroyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonCancelId, + pdgui_vmess(0, "ssssss", "button", button_cancel_id, + "-text", "Cancel", "-command", destroy_command); + pdgui_vmess(0, "sssssisisi", "pack", button_cancel_id, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); #if __APPLE__ @@ -471,10 +473,10 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { " break" "}", p->properties_receiver->s_name, - buttonOkId, okCommand, + button_ok_id, ok_command, p->properties_receiver->s_name, - buttonOkId, - buttonOkId); + button_ok_id, + button_ok_id); pdgui_vmess(0, "r", returnbind); #else char returnbind[MAXPDSTRING * 2]; @@ -485,48 +487,48 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { (void *)p); pdgui_vmess(0, "r", returnbind); - char applyCommand[MAXPDSTRING]; - snprintf(applyCommand, MAXPDSTRING, + char apply_command[MAXPDSTRING]; + snprintf(apply_command, MAXPDSTRING, "pdsend \"%s dialog apply\"", p->properties_receiver->s_name); - pdgui_vmess(0, "ssssss", "button", buttonApplyId, - "-text", "Apply", "-command", applyCommand); - pdgui_vmess(0, "sssssisisi", "pack", buttonApplyId, + pdgui_vmess(0, "ssssss", "button", button_apply_id, + "-text", "Apply", "-command", apply_command); + pdgui_vmess(0, "sssssisisi", "pack", button_apply_id, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); #endif - pdgui_vmess(0, "sssssisisi", "pack", buttonOkId, + pdgui_vmess(0, "sssssisisi", "pack", button_ok_id, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); - char okReturnBind[MAXPDSTRING * 2]; - snprintf(okReturnBind, MAXPDSTRING * 2, + char ok_return_bind[MAXPDSTRING * 2]; + snprintf(ok_return_bind, MAXPDSTRING * 2, "bind %s {%s}", - buttonOkId, okCommand); - pdgui_vmess(0, "r", okReturnBind); + button_ok_id, ok_command); + pdgui_vmess(0, "r", ok_return_bind); #if __APPLE__ - char focusbind[MAXPDSTRING * 2]; - snprintf(focusbind, MAXPDSTRING * 2, + char focus_bind[MAXPDSTRING * 2]; + snprintf(focus_bind, MAXPDSTRING * 2, "bind %s {if {[focus] ne \"%s\"} {catch {%s configure -default normal}}}", p->properties_receiver->s_name, - buttonOkId, - buttonOkId); - pdgui_vmess(0, "r", focusbind); + button_ok_id, + button_ok_id); + pdgui_vmess(0, "r", focus_bind); #endif #endif } static void pdlua_properties_buildvar(t_pdlua *pdlua, char *out) { - char sanitized_frame[MAXPDSTRING]; - snprintf(sanitized_frame, MAXPDSTRING, "%s", pdlua->properties.current_frame->s_name); + char sanitized_frame[100]; + snprintf(sanitized_frame, 100, "%s", pdlua->properties.current_frame->s_name); /* replace '.' because Tcl variable names don't like them */ for (char *p = sanitized_frame; *p; p++) if (*p == '.') *p = '_'; - snprintf(out, MAXPDSTRING, "::%s%d_%s_value", "pdlua_property", ++pdlua->properties.property_count, sanitized_frame); + snprintf(out, IDLENGTH, "::%s%d_%s_value", "pdlua_property", ++pdlua->properties.property_count, sanitized_frame); } static int pdlua_properties_newframe(lua_State *L) @@ -537,32 +539,32 @@ static int pdlua_properties_newframe(lua_State *L) #ifndef PURR_DATA pdlua->properties.frame_count++; - char current_frameid[MAXPDSTRING]; - snprintf(current_frameid, MAXPDSTRING, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); - pdlua->properties.current_frame = gensym(current_frameid); + char current_frame_id[100]; // limit frame name to 100 chars to ensure no buffer overflows are possible + snprintf(current_frame_id, 100, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); + pdlua->properties.current_frame = gensym(current_frame_id); // Create main frame for set of configurations - pdgui_vmess(0, "sssssi", "frame", current_frameid, "-relief", "groove", "-borderwidth", 1); - pdgui_vmess(0, "sssssssisi", "pack", current_frameid, "-side", "top", "-fill", "x", "-padx", 10, + pdgui_vmess(0, "sssssi", "frame", current_frame_id, "-relief", "groove", "-borderwidth", 1); + pdgui_vmess(0, "sssssssisi", "pack", current_frame_id, "-side", "top", "-fill", "x", "-padx", 10, "-pady", 10); // Title of the frame char labelid[MAXPDSTRING]; - snprintf(labelid, MAXPDSTRING, "%s.title", current_frameid); + snprintf(labelid, MAXPDSTRING, "%s.title", current_frame_id); pdgui_vmess(0, "ssss", "label", labelid, "-text", title); pdgui_vmess(0, "sssssf", "pack", labelid, "-side", "top", "-pady", 5.f); // Create content frame with grid layout - char content_frameid[MAXPDSTRING]; - snprintf(content_frameid, MAXPDSTRING, "%s.content", current_frameid); - pdgui_vmess(0, "ss", "frame", content_frameid); - pdgui_vmess(0, "ssss", "pack", content_frameid, "-side", "top", "-fill", "x"); + char content_frame_id[MAXPDSTRING]; + snprintf(content_frame_id, MAXPDSTRING, "%s.content", current_frame_id); + pdgui_vmess(0, "ss", "frame", content_frame_id); + pdgui_vmess(0, "ssss", "pack", content_frame_id, "-side", "top", "-fill", "x"); // Configure grid with 2 equal columns for (int i = 0; i < col; i++) { - pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frameid, i, "-weight", 1); + pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frame_id, i, "-weight", 1); } - pdlua->properties.current_frame = gensym(content_frameid); + pdlua->properties.current_frame = gensym(content_frame_id); pdlua->properties.max_col = col; pdlua->properties.current_col = 0; pdlua->properties.current_row = 0; @@ -592,24 +594,24 @@ static int pdlua_properties_addcheck(lua_State *L) } char pdsend[MAXPDSTRING]; - char checkid[MAXPDSTRING]; - char checkvariable[MAXPDSTRING]; + char check_id[IDLENGTH]; + char check_var[IDLENGTH]; - pdlua_properties_buildvar(pdlua, checkvariable); + pdlua_properties_buildvar(pdlua, check_var); // Initialize the Tcl variable to 0 (unchecked) - pdgui_vmess(0, "ssi", "set", checkvariable, init_value); + pdgui_vmess(0, "ssi", "set", check_var, init_value); // Build the pdsend command snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog checkbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, checkvariable); + pdlua->properties.properties_receiver->s_name, method, check_var); // Create the checkbox - snprintf(checkid, MAXPDSTRING, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "ssssssss", "checkbutton", checkid, "-text", text, "-variable", checkvariable, + snprintf(check_id, IDLENGTH, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); + pdgui_vmess(0, "ssssssss", "checkbutton", check_id, "-text", text, "-variable", check_var, "-command", pdsend); - pdgui_vmess(0, "sssisi", "grid", checkid, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, + pdgui_vmess(0, "sssisi", "grid", check_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); #else @@ -638,39 +640,38 @@ static int pdlua_properties_addtext(lua_State *L) } char pdsend[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char entryid[MAXPDSTRING]; - - char textvariable[MAXPDSTRING]; + char text_id[MAXPDSTRING]; + char entry_id[MAXPDSTRING]; + char text_var[IDLENGTH]; - pdlua_properties_buildvar(pdlua, textvariable); + pdlua_properties_buildvar(pdlua, text_var); - pdgui_vmess(0, "sss", "set", textvariable, init_value); + pdgui_vmess(0, "sss", "set", text_var, init_value); // Command to send it to pd snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog textbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, textvariable); + pdlua->properties.properties_receiver->s_name, method, text_var); - // container for button to set and text input - char text_button_frame[MAXPDSTRING]; - snprintf(text_button_frame, MAXPDSTRING, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, + // container_id for button to set and text input + char text_button_frame_id[IDLENGTH]; + snprintf(text_button_frame_id, IDLENGTH, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "sssssisisi", "frame", text_button_frame, "-relief", "solid", "-borderwidth", 0, + pdgui_vmess(0, "sssssisisi", "frame", text_button_frame_id, "-relief", "solid", "-borderwidth", 0, "-padx", 5, "-pady", 5); // create text for identification - snprintf(textid, MAXPDSTRING, "%s.text%d", text_button_frame, pdlua->properties.property_count); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); + snprintf(text_id, MAXPDSTRING, "%s.text%d", text_button_frame_id, pdlua->properties.property_count); + pdgui_vmess(0, "ssss", "label", text_id, "-text", text); - snprintf(entryid, MAXPDSTRING, "%s.textbox%d", text_button_frame, pdlua->properties.property_count); - pdgui_vmess(0, "sssssi", "entry", entryid, "-textvariable", textvariable, "-width", 8); - pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); - pdgui_vmess(0, "ssss", "bind", entryid, "", pdsend); + snprintf(entry_id, MAXPDSTRING, "%s.textbox%d", text_button_frame_id, pdlua->properties.property_count); + pdgui_vmess(0, "sssssi", "entry", entry_id, "-textvariable", text_var, "-width", 8); + pdgui_vmess(0, "ssss", "bind", entry_id, "", pdsend); + pdgui_vmess(0, "ssss", "bind", entry_id, "", pdsend); // Pack the entry - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", entryid, "-side", "left"); - pdgui_vmess(0, "sssisisssi", "grid", text_button_frame, "-row", pdlua->properties.current_row, "-column", + pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", entry_id, "-side", "left"); + pdgui_vmess(0, "sssisisssi", "grid", text_button_frame_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); pdlua_properties_updaterow(&pdlua->properties); #else @@ -727,23 +728,23 @@ static int pdlua_properties_addcolor(lua_State *L) { return 0; } - char container[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char colorboxid[MAXPDSTRING]; + char container_id[IDLENGTH/2]; + char colorbox_id[IDLENGTH]; + char text_id[MAXPDSTRING]; char pdsend[MAXPDSTRING]; pdlua->properties.property_count++; - snprintf(container, MAXPDSTRING, "%s.color%d", + snprintf(container_id, IDLENGTH/2, "%s.color%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - snprintf(textid, MAXPDSTRING, "%s.label", container); - snprintf(colorboxid, MAXPDSTRING, "%s.box", container); + snprintf(text_id, MAXPDSTRING, "%s.label", container_id); + snprintf(colorbox_id, IDLENGTH, "%s.box", container_id); - pdgui_vmess(0, "ss", "frame", container); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); - pdgui_vmess(0, "sssssisisssssi", "label", colorboxid, "-text", "", "-width", 4, "-height", 2, "-background", initcolor, "-relief", "sunken", "-borderwidth", 1); - pdgui_vmess(0, "ssss", colorboxid, "configure", "-cursor", "hand2"); + pdgui_vmess(0, "ss", "frame", container_id); + pdgui_vmess(0, "ssss", "label", text_id, "-text", text); + pdgui_vmess(0, "sssssisisssssi", "label", colorbox_id, "-text", "", "-width", 4, "-height", 2, "-background", initcolor, "-relief", "sunken", "-borderwidth", 1); + pdgui_vmess(0, "ssss", colorbox_id, "configure", "-cursor", "hand2"); pdgui_vmess(0, "r", "proc pdlua_choose_color {widget receiver method} {\n" @@ -761,14 +762,14 @@ static int pdlua_properties_addcolor(lua_State *L) { " }\n" "}\n"); - snprintf(pdsend, MAXPDSTRING, "pdlua_choose_color %s %s %s", colorboxid, pdlua->properties.properties_receiver->s_name, method); + snprintf(pdsend, MAXPDSTRING, "pdlua_choose_color %s %s %s", colorbox_id, pdlua->properties.properties_receiver->s_name, method); - pdgui_vmess(0, "ssss", "bind", colorboxid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", colorbox_id, "", pdsend); - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "sssssi", "pack", colorboxid, "-side", "top", "-pady", 2); + pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "sssssi", "pack", colorbox_id, "-side", "top", "-pady", 2); - pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w"); + pdgui_vmess(0,"sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w"); pdlua_properties_updaterow(&pdlua->properties); @@ -801,44 +802,44 @@ static int pdlua_properties_addint(lua_State *L) } char pdsend[MAXPDSTRING]; - char spinboxid[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char numvariable[MAXPDSTRING]; - char container[MAXPDSTRING]; + char text_id[MAXPDSTRING]; + char spinbox_id[IDLENGTH]; + char int_var[IDLENGTH]; + char container_id[IDLENGTH/2]; - pdlua_properties_buildvar(pdlua, numvariable); + pdlua_properties_buildvar(pdlua, int_var); - pdgui_vmess(0, "ssi", "set", numvariable, init_value); + pdgui_vmess(0, "ssi", "set", int_var, init_value); snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog numberbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, numvariable); + pdlua->properties.properties_receiver->s_name, method, int_var); - snprintf(container, MAXPDSTRING, "%s.numberbox%d", + snprintf(container_id, IDLENGTH/2, "%s.numberbox%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "ss", "frame", container); + pdgui_vmess(0, "ss", "frame", container_id); - snprintf(textid, MAXPDSTRING, "%s.label", container); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); + snprintf(text_id, MAXPDSTRING, "%s.label", container_id); + pdgui_vmess(0, "ssss", "label", text_id, "-text", text); - snprintf(spinboxid, MAXPDSTRING, "%s.spin", container); + snprintf(spinbox_id, IDLENGTH, "%s.spin", container_id); - pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinboxid, + pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinbox_id, "-from", min, "-to", max, "-increment", 1.0f, - "-textvariable", numvariable, + "-textvariable", int_var, "-width", 8, "-validate", "key", "-validatecommand", "string is integer %P", "-command", pdsend); - pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); - pdgui_vmess(0, "ssss", "bind", spinboxid, "", pdsend); + pdgui_vmess(0, "ssss", "bind", spinbox_id, "", pdsend); + pdgui_vmess(0, "ssss", "bind", spinbox_id, "", pdsend); - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", spinboxid, "-side", "top"); - pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", spinbox_id, "-side", "top"); + pdgui_vmess(0, "sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); #else @@ -868,31 +869,31 @@ static int pdlua_properties_addfloat(lua_State *L) } char pdsend[MAXPDSTRING]; - char entryid[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char numvariable[MAXPDSTRING]; - char container[MAXPDSTRING]; + char text_id[MAXPDSTRING]; + char entry_id[MAXPDSTRING]; + char float_variable[IDLENGTH]; + char container_id[IDLENGTH]; - pdlua_properties_buildvar(pdlua, numvariable); + pdlua_properties_buildvar(pdlua, float_variable); - pdgui_vmess(0, "ssf", "set", numvariable, init_value); + pdgui_vmess(0, "ssf", "set", float_variable, init_value); snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog floatbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, numvariable); + pdlua->properties.properties_receiver->s_name, method, float_variable); - snprintf(container, MAXPDSTRING, "%s.floatbox%d", + snprintf(container_id, IDLENGTH, "%s.floatbox%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "ss", "frame", container); + pdgui_vmess(0, "ss", "frame", container_id); - snprintf(textid, MAXPDSTRING, "%s.label", container); - pdgui_vmess(0, "ssss", "label", textid, "-text", text); + snprintf(text_id, MAXPDSTRING, "%s.label", container_id); + pdgui_vmess(0, "ssss", "label", text_id, "-text", text); - snprintf(entryid, MAXPDSTRING, "%s.entry", container); + snprintf(entry_id, MAXPDSTRING, "%s.entry", container_id); - pdgui_vmess(0, "sssssissss", "entry", entryid, - "-textvariable", numvariable, + pdgui_vmess(0, "sssssissss", "entry", entry_id, + "-textvariable", float_variable, "-width", 8, "-validate", "key", "-validatecommand", "regexp {^-?[0-9]*\\.?[0-9]*$} %P"); @@ -905,11 +906,11 @@ static int pdlua_properties_addfloat(lua_State *L) " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" " pdsend \"%s dialog floatbox %s $%s\"" "}\n", - entryid, - numvariable, - min, numvariable, min, - max, numvariable, max, - pdlua->properties.properties_receiver->s_name, method, numvariable); + entry_id, + float_variable, + min, float_variable, min, + max, float_variable, max, + pdlua->properties.properties_receiver->s_name, method, float_variable); pdgui_vmess(0, "r", keypresscmd); char focusoutcmd[MAXPDSTRING * 4]; @@ -919,17 +920,17 @@ static int pdlua_properties_addfloat(lua_State *L) " if {$v < %g} {set %s %g} elseif {$v > %g} {set %s %g};" " pdsend \"%s dialog floatbox %s $%s\"" "}\n", - entryid, - numvariable, - min, numvariable, min, - max, numvariable, max, - pdlua->properties.properties_receiver->s_name, method, numvariable); + entry_id, + float_variable, + min, float_variable, min, + max, float_variable, max, + pdlua->properties.properties_receiver->s_name, method, float_variable); pdgui_vmess(0, "r", focusoutcmd); - pdgui_vmess(0, "ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", entryid, "-side", "top"); - pdgui_vmess(0, "sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "ssss", "pack", entry_id, "-side", "top"); + pdgui_vmess(0, "sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); #else @@ -961,11 +962,11 @@ static int pdlua_properties_addcombo(lua_State *L) #ifndef PURR_DATA char pdsend[MAXPDSTRING]; - char comboid[MAXPDSTRING]; - char textid[MAXPDSTRING]; - char combovar[MAXPDSTRING]; + char combo_id[IDLENGTH]; + char text_id[IDLENGTH]; + char combo_var[IDLENGTH]; - pdlua_properties_buildvar(pdlua, combovar); + pdlua_properties_buildvar(pdlua, combo_var); if(!pdlua->properties.current_frame) { @@ -974,31 +975,31 @@ static int pdlua_properties_addcombo(lua_State *L) } if(init_value < options_count) { - pdgui_vmess(0,"sss","set", combovar, opts[init_value]); + pdgui_vmess(0,"sss","set", combo_var, opts[init_value]); } snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog combobox %s [expr {[%%W current] + 1}]]", pdlua->properties.properties_receiver->s_name, method); - char container[MAXPDSTRING]; - snprintf(container, MAXPDSTRING, "%s.combo%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); + char container_id[IDLENGTH/2]; + snprintf(container_id, IDLENGTH/2, "%s.combo%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); - pdgui_vmess(0,"ss", "frame", container); + pdgui_vmess(0,"ss", "frame", container_id); - snprintf(textid, MAXPDSTRING, "%s.label", container); - pdgui_vmess(0,"ssss", "label", textid, "-text", text); + snprintf(text_id, IDLENGTH, "%s.label", container_id); + pdgui_vmess(0,"ssss", "label", text_id, "-text", text); - snprintf(comboid, MAXPDSTRING,"%s.widget",container); + snprintf(combo_id, IDLENGTH,"%s.widget",container_id); - pdgui_vmess(0,"sssssSsssi", "ttk::combobox", comboid, "-textvariable",combovar, "-values", options_count, opts, "-state", "readonly", "-width", 8); + pdgui_vmess(0,"sssssSsssi", "ttk::combobox", combo_id, "-textvariable",combo_var, "-values", options_count, opts, "-state", "readonly", "-width", 8); - pdgui_vmess(0,"ssss", "bind", comboid, "<>", pdsend); + pdgui_vmess(0,"ssss", "bind", combo_id, "<>", pdsend); - pdgui_vmess(0,"ssss", "pack", textid, "-side", "top"); - pdgui_vmess(0,"ssss", "pack", comboid, "-side", "top"); + pdgui_vmess(0,"ssss", "pack", text_id, "-side", "top"); + pdgui_vmess(0,"ssss", "pack", combo_id, "-side", "top"); - pdgui_vmess(0,"sssisiss", "grid", container, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0,"sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); pdlua_properties_updaterow(&pdlua->properties); #else diff --git a/svg/nanosvg.h b/svg/nanosvg.h index 41dbeea..f40ade7 100644 --- a/svg/nanosvg.h +++ b/svg/nanosvg.h @@ -1650,7 +1650,7 @@ static int nsvg__parseRotate(float* xform, const char* str) static void nsvg__parseTransform(float* xform, const char* str) { - float t[6]; + float t[6] = {}; int len; nsvg__xformIdentity(xform); while (*str) diff --git a/svg/stb_image_write.h b/svg/stb_image_write.h index e4b32ed..de7ea9d 100644 --- a/svg/stb_image_write.h +++ b/svg/stb_image_write.h @@ -773,7 +773,7 @@ static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, f #ifdef __STDC_LIB_EXT1__ len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); #else - len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); + len = snprintf(buffer, 128, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); #endif s->func(s->context, buffer, len); From d5c7582f5ae444fac651f222b0d3aed150e6f1dd Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 21 Mar 2026 15:09:33 +0100 Subject: [PATCH 097/109] Fix luaJIT compilation on macOS --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6126b79..c407773 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,7 @@ $(luajit_lib): ifeq ($(system), Windows) $(MAKE) -C $(luajit_dir) BUILDMODE=static XCFLAGS="-DLUAJIT_ENABLE_LUA52COMPAT" else - $(MAKE) -C $(luajit_dir) BUILDMODE=static CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.6 XCFLAGS="-DLUAJIT_ENABLE_LUA52COMPAT" + $(MAKE) -C $(luajit_dir) BUILDMODE=static CFLAGS="-fPIC" MACOSX_DEPLOYMENT_TARGET=10.7 XCFLAGS="-DLUAJIT_ENABLE_LUA52COMPAT" endif pdlua.$(extension): $(luajit_lib) From 6bd5730e0b0e4e26815dfce3dedc09293ddae4df Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 21 Mar 2026 15:20:54 +0100 Subject: [PATCH 098/109] Add Linux arm build --- .github/workflows/makefile.yml | 38 +++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index e955828..193a3dc 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -9,7 +9,7 @@ on: workflow_dispatch: jobs: - ubuntu-build: + ubuntu-amd64-build: runs-on: ubuntu-latest strategy: matrix: @@ -30,10 +30,34 @@ jobs: - name: upload uses: actions/upload-artifact@v4 with: - name: pdlua-ubuntu-pd${{ matrix.floatsize }} + name: pdlua-ubuntu-amd64-pd${{ matrix.floatsize }} path: build - macos-build: + ubuntu-arm64-build: + runs-on: ubuntu-24.04-arm + strategy: + matrix: + floatsize: [32, 64] + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 + + - name: install dependencies + run: git clone --branch=0.56-2 --depth=1 https://github.com/pure-data/pure-data.git + + - name: make + run: make install PDDIR=./pure-data objectsdir=./build floatsize=${{ matrix.floatsize }} extension=linux-arm64-${{ matrix.floatsize }}.so + + - name: upload + uses: actions/upload-artifact@v4 + with: + name: pdlua-ubuntu-arm64-pd${{ matrix.floatsize }} + path: build + + macos-universal-build: runs-on: macos-latest strategy: matrix: @@ -56,10 +80,10 @@ jobs: - name: upload uses: actions/upload-artifact@v4 with: - name: pdlua-macos-pd${{ matrix.floatsize }} + name: pdlua-macos-universal-pd${{ matrix.floatsize }} path: build - windows-build: + windows-amd64-build: runs-on: windows-latest strategy: matrix: @@ -100,7 +124,7 @@ jobs: - name: upload uses: actions/upload-artifact@v4 with: - name: pdlua-windows-pd${{ matrix.floatsize }} + name: pdlua-windows-amd64-pd${{ matrix.floatsize }} path: build # Big thanks to @tomara-x and @timothyschoen for showing me how to do this! -ag @@ -108,7 +132,7 @@ jobs: github-release: if: github.ref_type == 'tag' runs-on: ubuntu-latest - needs: [ubuntu-build, macos-build, windows-build] + needs: [ubuntu-amd64-build, ubuntu-arm64-build, macos-universal-build, windows-amd64-build] steps: - uses: actions/download-artifact@v4 From cdd366c69d93fb549385a7a748db848e740a4cc1 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 21 Mar 2026 15:29:06 +0100 Subject: [PATCH 099/109] Fix typo --- pdlua_properties.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pdlua_properties.h b/pdlua_properties.h index d845059..edb3d8c 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -1,5 +1,5 @@ /** @file pdlua_properties.h - * @brief pdlpdlua_propertiesua_gfx -- an extension to pdlua to allow spawning properties windows + * @brief pdlua_properties.h -- an extension to pdlua to allow spawning properties windows * @author Charles K. Neimog and Timothy Schoen * @date 2026 * From e115d9a860b67d9636270b5e355e436ed9e6e529 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 21 Mar 2026 16:38:55 +0100 Subject: [PATCH 100/109] Make more functions static --- luas/luajit.c | 14 +------------- pdlua.c | 10 ++++++---- pdlua_gfx.h | 21 +++++++++++---------- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/luas/luajit.c b/luas/luajit.c index cf80671..42b44d4 100644 --- a/luas/luajit.c +++ b/luas/luajit.c @@ -63,22 +63,10 @@ static void preload_compat53(lua_State *L) { #undef lua_gc #define lua_gc(L, what) lua_gc(L, what, 0) -#define pdlua_gfx_free pdluajit_gfx_free -#define pdlua_gfx_mouse_down pdluajit_gfx_mouse_down -#define pdlua_gfx_mouse_drag pdluajit_gfx_mouse_drag -#define pdlua_gfx_mouse_enter pdluajit_gfx_mouse_enter -#define pdlua_gfx_mouse_event pdluajit_gfx_mouse_event -#define pdlua_gfx_mouse_exit pdluajit_gfx_mouse_exit -#define pdlua_gfx_mouse_move pdluajit_gfx_mouse_move -#define pdlua_gfx_mouse_up pdluajit_gfx_mouse_up -#define pdlua_gfx_repaint pdluajit_gfx_repaint -#define pdlua_gfx_setup pdluajit_gfx_setup -#define pdlua_instance_setup pdluajit_instance_setup #define pdlua_setup pdluajit_setup -#define pdlua_datadir pdluajit_datadir #ifdef PLUGDATA -#define plugdata_register_class plugdata_register_class_jit +#define pdlua_instance_setup pdluajit_instance_setup #endif #define LUA_FILE_EXTENSION ".pd_luajit" diff --git a/pdlua.c b/pdlua.c index 520537a..4b05ca5 100644 --- a/pdlua.c +++ b/pdlua.c @@ -216,10 +216,10 @@ static t_symbol* global_gensym(const char* s) // So we pass a data directory to the setup function instead and store it here. // ag: Renamed to pdlua_datadir since we also need this in vanilla when // setting up Lua's package.path. -char pdlua_datadir[PATH_MAX+1]; +static char pdlua_datadir[PATH_MAX+1]; #if PLUGDATA - // Hook to inform plugdata which class names are lua objects - void(*plugdata_register_class)(const char*); +// Hook to inform plugdata which class names are lua objects +static void(*plugdata_register_class)(const char*); #endif static char pdlua_cwd[MAXPDSTRING]; @@ -3255,9 +3255,10 @@ static int init_pdlua_environment(lua_State* L, const char* datadir) return 1; /* success */ } +#ifdef PLUGDATA void pdlua_instance_setup() { -#if PDINSTANCE +#ifdef PDINSTANCE lua_State* L = create_lua_state(); if (!L) { pd_error(NULL, "lua: luaL_newstate() failed"); @@ -3271,6 +3272,7 @@ void pdlua_instance_setup() #endif #endif } +#endif #ifdef _WIN32 __declspec(dllexport) diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 26649bb..36b4a10 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -103,7 +103,7 @@ static int free_path(lua_State *L); static void pdlua_gfx_clear(t_pdlua *obj, int layer, int removed); // only for pd-vanilla, to delete all tcl/tk items -void pdlua_gfx_free(t_pdlua_gfx *gfx) { +static void pdlua_gfx_free(t_pdlua_gfx *gfx) { #ifndef PLUGDATA for(int i = 0; i < gfx->num_layers; i++) { @@ -124,7 +124,7 @@ void pdlua_gfx_free(t_pdlua_gfx *gfx) { } // Trigger repaint callback in lua script -void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { +static void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { #ifndef PLUGDATA o->gfx.first_draw = firsttime; #endif @@ -145,7 +145,7 @@ void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { } // Pass mouse events to lua script -void pdlua_gfx_mouse_event(t_pdlua *o, int x, int y, int type) { +static void pdlua_gfx_mouse_event(t_pdlua *o, int x, int y, int type) { lua_getglobal(__L(), "pd"); lua_getfield (__L(), -1, "_mouseevent"); @@ -163,26 +163,27 @@ void pdlua_gfx_mouse_event(t_pdlua *o, int x, int y, int type) { } // Pass mouse events to lua script (but easier to understand) -void pdlua_gfx_mouse_down(t_pdlua *o, int x, int y) { +static void pdlua_gfx_mouse_down(t_pdlua *o, int x, int y) { pdlua_gfx_mouse_event(o, x, y, 0); } -void pdlua_gfx_mouse_up(t_pdlua *o, int x, int y) { + +static void pdlua_gfx_mouse_up(t_pdlua *o, int x, int y) { pdlua_gfx_mouse_event(o, x, y, 1); } -void pdlua_gfx_mouse_move(t_pdlua *o, int x, int y) { +static void pdlua_gfx_mouse_move(t_pdlua *o, int x, int y) { pdlua_gfx_mouse_event(o, x, y, 2); } -void pdlua_gfx_mouse_drag(t_pdlua *o, int x, int y) { +static void pdlua_gfx_mouse_drag(t_pdlua *o, int x, int y) { pdlua_gfx_mouse_event(o, x, y, 3); } -void pdlua_gfx_mouse_enter(t_pdlua *x, int xpos, int ypos) { +static void pdlua_gfx_mouse_enter(t_pdlua *x, int xpos, int ypos) { pdlua_gfx_mouse_event(x, xpos, ypos, 4); } -void pdlua_gfx_mouse_exit(t_pdlua *x, int xpos, int ypos) { +static void pdlua_gfx_mouse_exit(t_pdlua *x, int xpos, int ypos) { pdlua_gfx_mouse_event(x, xpos, ypos, 5); } @@ -247,7 +248,7 @@ static const luaL_Reg gfx_methods[] = { {NULL, NULL} // Sentinel to end the list }; -int pdlua_gfx_setup(lua_State *L) { +static int pdlua_gfx_setup(lua_State *L) { // for Path(x, y) constructor lua_pushcfunction(L, start_path); lua_setglobal(L, "Path"); From 1ecbfde0ccc374ba8ca4c6a5145395cc8d5ee819 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Sat, 21 Mar 2026 20:46:29 +0100 Subject: [PATCH 101/109] Fix buffer overflow --- pdlua.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pdlua.c b/pdlua.c index 4b05ca5..1e219f1 100644 --- a/pdlua.c +++ b/pdlua.c @@ -2634,7 +2634,8 @@ static void pdlua_packagepath(lua_State *L, const char *path) lua_pushstring(L, "cpath"); lua_gettable(L, -2); packagepath = lua_tostring(L, -1); - buf = realloc(buf, 2*strlen(path)+20+strlen(packagepath)); + bufsize = 2*strlen(path)+20+strlen(packagepath); + buf = realloc(buf, bufsize); if (!buf) { lua_pop(L, 2); return; From cb61bac09982d2dde82416a82505263093d6cf72 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 23 Mar 2026 12:55:58 +0100 Subject: [PATCH 102/109] Clean up --- pdlua.h | 3 ++- pdlua_properties.h | 59 ++++++++++++++++++++-------------------------- 2 files changed, 27 insertions(+), 35 deletions(-) diff --git a/pdlua.h b/pdlua.h index 573df8c..c4de028 100644 --- a/pdlua.h +++ b/pdlua.h @@ -40,7 +40,8 @@ typedef struct _pdlua_properties #ifndef PLUGDATA t_pending_property pending[MAX_PENDING_PROPERTIES]; int pending_count; - t_symbol *current_frame; + t_symbol *current_frame_id; + t_symbol *current_frame_name; t_symbol *properties_receiver; int property_count; #ifndef PURR_DATA diff --git a/pdlua_properties.h b/pdlua_properties.h index edb3d8c..4bcb71f 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -377,7 +377,8 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { if(pdlua->properties.frame_count != 0) pd_unbind(&pdlua->pd.ob_pd, p->properties_receiver); - p->current_frame = NULL; + p->current_frame_name = NULL; + p->current_frame_id = NULL; p->frame_count = 0; p->property_count = 0; p->current_row = 0; @@ -518,19 +519,6 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { #endif } -static void pdlua_properties_buildvar(t_pdlua *pdlua, char *out) -{ - char sanitized_frame[100]; - snprintf(sanitized_frame, 100, "%s", pdlua->properties.current_frame->s_name); - - /* replace '.' because Tcl variable names don't like them */ - for (char *p = sanitized_frame; *p; p++) - if (*p == '.') - *p = '_'; - - snprintf(out, IDLENGTH, "::%s%d_%s_value", "pdlua_property", ++pdlua->properties.property_count, sanitized_frame); -} - static int pdlua_properties_newframe(lua_State *L) { t_pdlua *pdlua = *(t_pdlua**)lua_touserdata(L, 1); @@ -540,8 +528,9 @@ static int pdlua_properties_newframe(lua_State *L) #ifndef PURR_DATA pdlua->properties.frame_count++; char current_frame_id[100]; // limit frame name to 100 chars to ensure no buffer overflows are possible + char current_frame_name[100]; snprintf(current_frame_id, 100, ".%p.main.frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); - pdlua->properties.current_frame = gensym(current_frame_id); + snprintf(current_frame_name, 100, "_%p_main_frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); // Create main frame for set of configurations pdgui_vmess(0, "sssssi", "frame", current_frame_id, "-relief", "groove", "-borderwidth", 1); @@ -564,7 +553,9 @@ static int pdlua_properties_newframe(lua_State *L) for (int i = 0; i < col; i++) { pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frame_id, i, "-weight", 1); } - pdlua->properties.current_frame = gensym(content_frame_id); + + pdlua->properties.current_frame_id = gensym(content_frame_id); + pdlua->properties.current_frame_name = gensym(current_frame_name); pdlua->properties.max_col = col; pdlua->properties.current_col = 0; pdlua->properties.current_row = 0; @@ -587,7 +578,7 @@ static int pdlua_properties_addcheck(lua_State *L) } #ifndef PURR_DATA - if(!pdlua->properties.current_frame) + if(!pdlua->properties.current_frame_id) { pd_error(NULL, "[pdlua] add_check: no active frame"); return 0; @@ -597,7 +588,7 @@ static int pdlua_properties_addcheck(lua_State *L) char check_id[IDLENGTH]; char check_var[IDLENGTH]; - pdlua_properties_buildvar(pdlua, check_var); + snprintf(check_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); // Initialize the Tcl variable to 0 (unchecked) pdgui_vmess(0, "ssi", "set", check_var, init_value); @@ -607,7 +598,7 @@ static int pdlua_properties_addcheck(lua_State *L) pdlua->properties.properties_receiver->s_name, method, check_var); // Create the checkbox - snprintf(check_id, IDLENGTH, "%s.check%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); + snprintf(check_id, IDLENGTH, "%s.check%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); pdgui_vmess(0, "ssssssss", "checkbutton", check_id, "-text", text, "-variable", check_var, "-command", pdsend); @@ -633,7 +624,7 @@ static int pdlua_properties_addtext(lua_State *L) const char *init_value = luaL_checkstring(L, 4); #ifndef PURR_DATA - if(!pdlua->properties.current_frame) + if(!pdlua->properties.current_frame_id) { pd_error(NULL, "[pdlua] add_text: no active frame"); return 0; @@ -644,7 +635,7 @@ static int pdlua_properties_addtext(lua_State *L) char entry_id[MAXPDSTRING]; char text_var[IDLENGTH]; - pdlua_properties_buildvar(pdlua, text_var); + snprintf(text_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); pdgui_vmess(0, "sss", "set", text_var, init_value); @@ -654,7 +645,7 @@ static int pdlua_properties_addtext(lua_State *L) // container_id for button to set and text input char text_button_frame_id[IDLENGTH]; - snprintf(text_button_frame_id, IDLENGTH, "%s.text_button_frame_%d", pdlua->properties.current_frame->s_name, + snprintf(text_button_frame_id, IDLENGTH, "%s.text_button_frame_%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); pdgui_vmess(0, "sssssisisi", "frame", text_button_frame_id, "-relief", "solid", "-borderwidth", 0, "-padx", 5, "-pady", 5); @@ -723,7 +714,7 @@ static int pdlua_properties_addcolor(lua_State *L) { } #ifndef PURR_DATA - if (!pdlua->properties.current_frame) { + if (!pdlua->properties.current_frame_id) { pd_error(NULL, "[pdlua] add_color: no active frame"); return 0; } @@ -736,7 +727,7 @@ static int pdlua_properties_addcolor(lua_State *L) { pdlua->properties.property_count++; snprintf(container_id, IDLENGTH/2, "%s.color%d", - pdlua->properties.current_frame->s_name, + pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); snprintf(text_id, MAXPDSTRING, "%s.label", container_id); snprintf(colorbox_id, IDLENGTH, "%s.box", container_id); @@ -795,7 +786,7 @@ static int pdlua_properties_addint(lua_State *L) double max = luaL_optnumber(L, 6, 1e36); #ifndef PURR_DATA - if(!pdlua->properties.current_frame) + if(!pdlua->properties.current_frame_id) { pd_error(NULL, "[pdlua] add_int: no active frame"); return 0; @@ -807,7 +798,7 @@ static int pdlua_properties_addint(lua_State *L) char int_var[IDLENGTH]; char container_id[IDLENGTH/2]; - pdlua_properties_buildvar(pdlua, int_var); + snprintf(int_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); pdgui_vmess(0, "ssi", "set", int_var, init_value); @@ -815,7 +806,7 @@ static int pdlua_properties_addint(lua_State *L) pdlua->properties.properties_receiver->s_name, method, int_var); snprintf(container_id, IDLENGTH/2, "%s.numberbox%d", - pdlua->properties.current_frame->s_name, + pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); pdgui_vmess(0, "ss", "frame", container_id); @@ -862,7 +853,7 @@ static int pdlua_properties_addfloat(lua_State *L) double max = luaL_optnumber(L, 6, 1e36); #ifndef PURR_DATA - if(!pdlua->properties.current_frame) + if(!pdlua->properties.current_frame_id) { pd_error(NULL, "[pdlua] add_float: no active frame"); return 0; @@ -874,7 +865,7 @@ static int pdlua_properties_addfloat(lua_State *L) char float_variable[IDLENGTH]; char container_id[IDLENGTH]; - pdlua_properties_buildvar(pdlua, float_variable); + snprintf(float_variable, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); pdgui_vmess(0, "ssf", "set", float_variable, init_value); @@ -882,7 +873,7 @@ static int pdlua_properties_addfloat(lua_State *L) pdlua->properties.properties_receiver->s_name, method, float_variable); snprintf(container_id, IDLENGTH, "%s.floatbox%d", - pdlua->properties.current_frame->s_name, + pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); pdgui_vmess(0, "ss", "frame", container_id); @@ -966,14 +957,14 @@ static int pdlua_properties_addcombo(lua_State *L) char text_id[IDLENGTH]; char combo_var[IDLENGTH]; - pdlua_properties_buildvar(pdlua, combo_var); - - if(!pdlua->properties.current_frame) + if(!pdlua->properties.current_frame_id) { pd_error(NULL, "[pdlua] add_combo: no active frame"); return 0; } + snprintf(combo_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); + if(init_value < options_count) { pdgui_vmess(0,"sss","set", combo_var, opts[init_value]); } @@ -983,7 +974,7 @@ static int pdlua_properties_addcombo(lua_State *L) pdlua->properties.properties_receiver->s_name, method); char container_id[IDLENGTH/2]; - snprintf(container_id, IDLENGTH/2, "%s.combo%d", pdlua->properties.current_frame->s_name, pdlua->properties.property_count); + snprintf(container_id, IDLENGTH/2, "%s.combo%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); pdgui_vmess(0,"ss", "frame", container_id); From a03454d9c16a96f83c41e7c5cf63c683569fc1f5 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Mon, 23 Mar 2026 14:08:52 +0100 Subject: [PATCH 103/109] Pd: clean up old images if we have a lot of them --- pdlua.h | 11 +++++----- pdlua_gfx.h | 58 ++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/pdlua.h b/pdlua.h index c4de028..6988120 100644 --- a/pdlua.h +++ b/pdlua.h @@ -62,23 +62,24 @@ typedef struct _pdlua_gfx // Size variables int width, height; void *object; - #ifndef PLUGDATA char object_tag[128]; // Tcl/tk tag that is attached to all drawings char order_tag[64]; // Tag for invisible line, used to preserve correct object ordering char current_item_tag[64]; // Tcl/tk tag that is only attached to the current drawing in progress - char** layer_tags; + char **layer_tags; int num_layers; - char* current_layer_tag; - gfx_transform* transforms; + char *current_layer_tag; + gfx_transform *transforms; int num_transforms; char current_color[10]; // Keep track of current color // Variables to keep track of mouse position, button state and whether the mouse is inside the object int mouse_x, mouse_y, mouse_down, mouse_inside; int first_draw; + uint32_t paint_generation; #ifndef PURR_DATA - uint64_t* images; + uint64_t *images; + uint32_t *images_last_used; int num_images; #endif struct pdlua_proxycanvas *proxycanvas; diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 36b4a10..39e3632 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -118,7 +118,10 @@ static void pdlua_gfx_free(t_pdlua_gfx *gfx) { snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)gfx->images[i]); pdgui_vmess(0, "rrs", "image", "delete", image_name); } - if(gfx->num_images) freebytes(gfx->images, gfx->num_images * sizeof(uint64_t)); + if(gfx->num_images) { + freebytes(gfx->images, gfx->num_images * sizeof(uint64_t)); + freebytes(gfx->images_last_used, gfx->num_images * sizeof(uint32_t)); + } #endif #endif } @@ -127,12 +130,12 @@ static void pdlua_gfx_free(t_pdlua_gfx *gfx) { static void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { #ifndef PLUGDATA o->gfx.first_draw = firsttime; + o->gfx.paint_generation++; #endif lua_getglobal(__L(), "pd"); lua_getfield (__L(), -1, "_repaint"); lua_pushlightuserdata(__L(), o); - if (lua_pcall(__L(), 1, 0, 0)) { mylua_error(__L(), o, "repaint"); @@ -538,6 +541,32 @@ static void generate_random_id(char *str, size_t len) { str[len - 1] = '\0'; } +#ifndef PURR_DATA +static void pdlua_sweep_image_cache(t_pdlua_gfx *gfx) +{ + int i = 0; + while (i < gfx->num_images) { + uint32_t age = gfx->paint_generation - gfx->images_last_used[i]; + if (gfx->num_images > 15 && age > 5) { // If we have too many images, delete all images that havn't been drawn in 5 frames + char image_name[64]; + snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)gfx->images[i]); + pdgui_vmess(0, "rrs", "image", "delete", image_name); + + // Swap with last entry and shrink (O(1) removal) + gfx->images[i] = gfx->images[gfx->num_images - 1]; + gfx->images_last_used[i] = gfx->images_last_used[gfx->num_images - 1]; + + gfx->images = resizebytes(gfx->images, gfx->num_images * sizeof(uint64_t), (gfx->num_images - 1) * sizeof(uint64_t)); + gfx->images_last_used = resizebytes(gfx->images_last_used, gfx->num_images * sizeof(uint32_t), (gfx->num_images - 1) * sizeof(uint32_t)); + gfx->num_images--; + } else { + i++; + } + } +} +#endif + + static void transform_size(t_pdlua_gfx *gfx, int *w, int *h) { for(int i = gfx->num_transforms - 1; i >= 0; i--) { @@ -977,6 +1006,7 @@ static int end_paint(lua_State *L) { pdgui_vmess(0, "crss", cnv, "raise", gfx->current_layer_tag, gfx->layer_tags[layer - 1]); } } + pdlua_sweep_image_cache(gfx); #endif return 0; @@ -1416,7 +1446,6 @@ static int draw_svg(lua_State *L) { transform_point(gfx, &x, &y); - x += text_xpix((t_object*)obj, obj->canvas) / canvas_zoom; y += text_ypix((t_object*)obj, obj->canvas) / canvas_zoom; @@ -1434,6 +1463,7 @@ static int draw_svg(lua_State *L) { char image_name[64]; snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)svg_hash); pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); + gfx->images_last_used[i] = gfx->paint_generation; return 0; } } @@ -1488,12 +1518,15 @@ static int draw_svg(lua_State *L) { if(gfx->num_images == 0) { gfx->images = getbytes(sizeof(uint64_t)); + gfx->images_last_used = getbytes(sizeof(uint32_t)); } else { gfx->images = resizebytes(gfx->images, gfx->num_images*sizeof(uint64_t), (gfx->num_images+1) * sizeof(uint64_t)); + gfx->images_last_used = resizebytes(gfx->images_last_used, gfx->num_images*sizeof(uint32_t), (gfx->num_images+1) * sizeof(uint32_t)); } gfx->images[gfx->num_images] = svg_hash; + gfx->images_last_used[gfx->num_images] = gfx->paint_generation; gfx->num_images++; char image_name[64]; @@ -1545,6 +1578,7 @@ static int draw_image(lua_State *L) { if (gfx->images[i] == image_hash) { pdgui_vmess(0, "crr ii rs rr rS", cnv, "create", "image", x, y, "-image", image_name, "-anchor", "nw", "-tags", 3, tags); + gfx->images_last_used[i] = gfx->paint_generation; return 0; } } @@ -1656,13 +1690,18 @@ static int draw_image(lua_State *L) { free(encoded); // Cache the scaled hash - if (gfx->num_images == 0) + if (gfx->num_images == 0) { gfx->images = getbytes(sizeof(uint64_t)); - else - gfx->images = resizebytes(gfx->images, - gfx->num_images * sizeof(uint64_t), - (gfx->num_images + 1) * sizeof(uint64_t)); - gfx->images[gfx->num_images++] = image_hash; + gfx->images_last_used = getbytes(sizeof(uint32_t)); + } + else { + gfx->images = resizebytes(gfx->images, gfx->num_images * sizeof(uint64_t), (gfx->num_images + 1) * sizeof(uint64_t)); + gfx->images_last_used = resizebytes(gfx->images_last_used, gfx->num_images * sizeof(uint32_t), (gfx->num_images + 1) * sizeof(uint32_t)); + } + + gfx->images_last_used[gfx->num_images] = gfx->paint_generation; + gfx->images[gfx->num_images] = image_hash; + gfx->num_images++; #else // TODO: purr-data @@ -1670,7 +1709,6 @@ static int draw_image(lua_State *L) { return 0; } - static int stroke_path(lua_State *L) { t_pdlua_gfx *gfx = pop_graphics_context(L); t_pdlua *obj = gfx->object; From 9794dfbce3dc5d7576c841c8283f43adb6a9aedb Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 24 Mar 2026 13:03:12 +0100 Subject: [PATCH 104/109] pure-data: implement new theming system, implement selected outline colour --- pdlua.c | 33 +++++++++++++++++++-------------- pdlua.h | 1 + pdlua_gfx.h | 24 ++++++++++++++++-------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/pdlua.c b/pdlua.c index 1e219f1..ae5187d 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1070,6 +1070,17 @@ static void pdlua_select(t_gobj *z, t_glist *glist, int state) text_widgetbehavior.w_selectfn(z, glist, state); } } +#else +static void pdlua_select(t_gobj *z, t_glist *glist, int state) +{ + t_pdlua *x = (t_pdlua *)z; + if(x->has_gui) { + x->gfx.is_selected = state; + pdlua_gfx_repaint(x, 0); + } else { + text_widgetbehavior.w_selectfn(z, glist, state); + } +} #endif static void pdlua_activate(t_gobj *z, t_glist *glist, int state) @@ -1571,17 +1582,16 @@ static int pdlua_class_new(lua_State *L) // Set custom widgetbehaviour for GUIs pdlua_widgetbehavior.w_getrectfn = pdlua_getrect; pdlua_widgetbehavior.w_displacefn = pdlua_displace; -#ifndef PURR_DATA - pdlua_widgetbehavior.w_selectfn = text_widgetbehavior.w_selectfn; -#else +#ifdef PURR_DATA // Purr Data only, this seems to be preferred over w_displacefn and is // actually needed to make text_widgetbehavior.w_selectfn happy. pdlua_widgetbehavior.w_displacefnwtag = pdlua_displace_wtag; - // We also do our own variant of text_widgetbehavior.w_selectfn, as the +#endif + // For purr-data, we also do our own variant of text_widgetbehavior.w_selectfn, as the // text_widgetbehavior won't give the right object tag with a freshly // created gop for some reason. + // For pure-data, we need to trigger a repaint when an object gets selected to update the border colour pdlua_widgetbehavior.w_selectfn = pdlua_select; -#endif pdlua_widgetbehavior.w_deletefn = pdlua_delete; pdlua_widgetbehavior.w_clickfn = pdlua_click; pdlua_widgetbehavior.w_visfn = pdlua_vis; @@ -1630,19 +1640,14 @@ static int pdlua_object_new(lua_State *L) o->pdlua_class_gfx = c_gfx; o->sp = NULL; + memset(&o->gfx, 0, sizeof(t_pdlua_gfx)); + memset(&o->properties, 0, sizeof(t_pdlua_properties)); + o->gfx.width = 80; o->gfx.height = 80; - -#ifndef PLUGDATA - // Init graphics state for pd - o->gfx.mouse_x = 0; - o->gfx.mouse_y = 0; - o->gfx.mouse_down = 0; - o->properties.property_count = 0; -#else +#ifdef PLUGDATA // NULL until plugdata overrides them with something useful o->gfx.plugdata_draw_callback = NULL; - o->gfx.pdlua_gfx_repaint = pdlua_gfx_repaint; o->gfx.pdlua_gfx_mouse_down = pdlua_gfx_mouse_down; o->gfx.pdlua_gfx_mouse_up = pdlua_gfx_mouse_up; diff --git a/pdlua.h b/pdlua.h index 6988120..cc87698 100644 --- a/pdlua.h +++ b/pdlua.h @@ -81,6 +81,7 @@ typedef struct _pdlua_gfx uint64_t *images; uint32_t *images_last_used; int num_images; + int is_selected; #endif struct pdlua_proxycanvas *proxycanvas; #else diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 39e3632..43e0dfe 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -1018,16 +1018,24 @@ static int set_color(lua_State *L) { int r, g, b; if (lua_gettop(L) == 1) { // Single argument: parse as color ID instead of RGB int color_id = luaL_checknumber(L, 1); - if(color_id != 1) +#ifndef PURR_DATA // unless purr-data supports this? + uint32_t foreground = (uint32_t)((THISGUI->i_foregroundcolor) << 8 | 0xFF); + uint32_t background = (uint32_t)((THISGUI->i_backgroundcolor) << 8 | 0xFF); +#else + uint32_t foreground = 0xFFFFFFFF; + uint32_t background = 0xFF000000; +#endif + + if(color_id == 0) { - r = 255; - g = 255; - b = 255; + r = (background >> 24) & 0xFF; + g = (background >> 16) & 0xFF; + b = (background >> 8) & 0xFF; } else { - r = 0; - g = 0; - b = 0; + r = (foreground >> 24) & 0xFF; + g = (foreground >> 16) & 0xFF; + b = (foreground >> 8) & 0xFF; } } else { @@ -1116,7 +1124,7 @@ static int fill_all(lua_State *L) { const char *tags[] = { gfx->object_tag, register_drawing(gfx), gfx->current_layer_tag }; #ifndef PURR_DATA - pdgui_vmess(0, "crr iiii rs rS", cnv, "create", "rectangle", x1, y1, x2, y2, "-fill", gfx->current_color, "-tags", 3, tags); + pdgui_vmess(0, "crr iiii rs rk rS", cnv, "create", "rectangle", x1, y1, x2, y2, "-fill", gfx->current_color, "-outline", gfx->is_selected ? THISGUI->i_selectcolor : THISGUI->i_foregroundcolor, "-tags", 3, tags); #else // PURR_DATA gui_vmess("gui_luagfx_fill_all", "xsssiiii", cnv, tags[2], tags[1], gfx->current_color, From 3968c17528da9e60fcc44a9013c02a8b21cceddf Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 24 Mar 2026 13:06:57 +0100 Subject: [PATCH 105/109] Clean up pdgui_vmess calls, slight fixes for pure-data properties layouting --- pdlua.c | 14 ++-- pdlua_properties.h | 190 ++++++++++++++++++++------------------------- 2 files changed, 90 insertions(+), 114 deletions(-) diff --git a/pdlua.c b/pdlua.c index ae5187d..98c02c2 100644 --- a/pdlua.c +++ b/pdlua.c @@ -217,7 +217,7 @@ static t_symbol* global_gensym(const char* s) // ag: Renamed to pdlua_datadir since we also need this in vanilla when // setting up Lua's package.path. static char pdlua_datadir[PATH_MAX+1]; -#if PLUGDATA +#ifdef PLUGDATA // Hook to inform plugdata which class names are lua objects static void(*plugdata_register_class)(const char*); #endif @@ -1157,7 +1157,7 @@ static void (*nw_gui_vmess)(const char *sel, char *fmt, ...) = NULL; /* plugdata support. Similarly, if we're running inside plugdata, we can send GUI messages with plugdata_forward_message This allows opening an in-gui text editor instead of opening another app */ -#if PLUGDATA +#ifdef PLUGDATA void plugdata_forward_message(int type, void* x, t_symbol *s, int argc, t_atom *argv); #endif /** a handler for the open item in the right-click menu (mrpeach 20111025) */ @@ -1195,7 +1195,7 @@ static void pdlua_menu_open(t_pdlua *o) lua_pop(__L(), 2); /* pop name, global "pd"*/ return; } -#if PLUGDATA +#ifdef PLUGDATA if (!*class->c_externdir->s_name) path = pdlua_datadir; else @@ -1229,7 +1229,7 @@ static void pdlua_menu_open(t_pdlua *o) #else logpost(NULL, 3, "Opening %s for editing", pathname); #endif -#if PLUGDATA +#ifdef PLUGDATA t_atom arg; SETSYMBOL(&arg, gensym(pathname)); plugdata_forward_message(0, o, gensym("open_textfile"), 1, &arg); @@ -1564,7 +1564,7 @@ static int pdlua_class_new(lua_State *L) } #pragma GCC diagnostic pop // Let plugdata know this class is a lua object -#if PLUGDATA +#ifdef PLUGDATA plugdata_register_class(name); plugdata_register_class(name_gfx); #endif @@ -3335,7 +3335,7 @@ void pdlua_setup(void) snprintf(luaversionStr, MAXPDSTRING, "Using lua version %d.%d", lvm, lvl); #endif -#if PLUGDATA +#ifdef PLUGDATA plugdata_register_class = register_class_callback; #if LUA_USE_JIT @@ -3348,7 +3348,7 @@ void pdlua_setup(void) post(luaversionStr); // multichannel handling copied from https://github.com/Spacechild1/vstplugin/blob/3f0ed8a800ea238bf204a2ead940b2d1324ac909/pd/src/vstplugin~.cpp#L4122-L4136 -#if PLUGDATA +#ifdef PLUGDATA g_signal_setmultiout = &signal_setmultiout; #else #ifdef _WIN32 diff --git a/pdlua_properties.h b/pdlua_properties.h index 4bcb71f..ed428e7 100644 --- a/pdlua_properties.h +++ b/pdlua_properties.h @@ -372,7 +372,7 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { snprintf(receiver, MAXPDSTRING, ".%p", p); pdlua->properties.properties_receiver = gensym(receiver); - pdgui_vmess(0, "ss", "destroy", pdlua->properties.properties_receiver->s_name); + pdgui_vmess(0, "rs", "destroy", pdlua->properties.properties_receiver->s_name); if(pdlua->properties.frame_count != 0) pd_unbind(&pdlua->pd.ob_pd, p->properties_receiver); @@ -387,26 +387,26 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { pd_bind(&pdlua->pd.ob_pd, p->properties_receiver); - pdgui_vmess(0, "ssss", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); + pdgui_vmess(0, "rs rs", "toplevel", p->properties_receiver->s_name, "-class", "DialogWindow"); char title[MAXPDSTRING]; snprintf(title, MAXPDSTRING, "%s Properties", pdlua->pdlua_class->c_name->s_name); - pdgui_vmess(0, "ssss", "wm", "title", p->properties_receiver->s_name, title); + pdgui_vmess(0, "rr rs", "wm", "title", p->properties_receiver->s_name, title); - pdgui_vmess(0, "sss", "wm", "group", p->properties_receiver->s_name, "."); - pdgui_vmess(0, "sssii", "wm", "resizable", p->properties_receiver->s_name, 0, 0); + pdgui_vmess(0, "rrsr", "wm", "group", p->properties_receiver->s_name, "."); + pdgui_vmess(0, "rrsii", "wm", "resizable", p->properties_receiver->s_name, 0, 0); - pdgui_vmess(0, "sss", "wm", "transient", p->properties_receiver->s_name, "$::focused_window"); - pdgui_vmess(0, "ssss", p->properties_receiver->s_name, "configure", "-menu", "$::dialog_menubar"); - pdgui_vmess(0, "sssfsf", p->properties_receiver->s_name, "configure", "-padx", 0.0f, "-pady", 0.0f); + pdgui_vmess(0, "rrsr", "wm", "transient", p->properties_receiver->s_name, "$::focused_window"); + pdgui_vmess(0, "sr rr", p->properties_receiver->s_name, "configure", "-menu", "$::dialog_menubar"); + pdgui_vmess(0, "sr ri ri", p->properties_receiver->s_name, "configure", "-padx", 0, "-pady", 0); // main window char frame_id[IDLENGTH]; snprintf(frame_id, IDLENGTH, ".%p.main", (void *)p); - pdgui_vmess(0, "sss", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window - pdgui_vmess(0, "sssf", "frame", frame_id, "-padx", 15.0f, "-pady", 15.0f); - pdgui_vmess(0, "sssssf", "pack", frame_id, "-fill", "both", "-expand", 4.0f); - pdgui_vmess(0, "sssfsf", "pack", frame_id, "-pady", 10.f, "-padx", 10.f); + pdgui_vmess(0, "rrs", "wm", "deiconify", p->properties_receiver->s_name); // <- on sucess show the window + pdgui_vmess(0, "rs ri ri", "frame", frame_id, "-padx", 15, "-pady", 15); + pdgui_vmess(0, "rs rr ri", "pack", frame_id, "-fill", "both", "-expand", 4); + pdgui_vmess(0, "rs ri ri", "pack", frame_id, "-pady", 10, "-padx", 10); // call _properties lua_getglobal(L, "pd"); @@ -438,8 +438,8 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { char destroy_command[MAXPDSTRING]; snprintf(destroy_command, MAXPDSTRING, "destroy .%p", (void *)p); - pdgui_vmess(0, "sssf", "frame", buttons_id, "-pady", 5.0f); - pdgui_vmess(0, "ssss", "pack", buttons_id, "-fill", "x"); + pdgui_vmess(0, "rs ri", "frame", buttons_id, "-pady", 5); + pdgui_vmess(0, "rs rs", "pack", buttons_id, "-fill", "x"); #if __APPLE__ const char* ok_state = "normal"; @@ -451,12 +451,12 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { snprintf(ok_command, MAXPDSTRING, "pdsend \"%s dialog apply\"; destroy .%p", p->properties_receiver->s_name, (void *)p); - pdgui_vmess(0, "ssssssss", "button", button_ok_id, + pdgui_vmess(0, "rs rs rs rs", "button", button_ok_id, "-text", "OK", "-command", ok_command, "-default", ok_state); - pdgui_vmess(0, "ssssss", "button", button_cancel_id, + pdgui_vmess(0, "rs rs rs", "button", button_cancel_id, "-text", "Cancel", "-command", destroy_command); - pdgui_vmess(0, "sssssisisi", "pack", button_cancel_id, + pdgui_vmess(0, "rs rs ri ri ri", "pack", button_cancel_id, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); #if __APPLE__ @@ -489,22 +489,15 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { pdgui_vmess(0, "r", returnbind); char apply_command[MAXPDSTRING]; - snprintf(apply_command, MAXPDSTRING, - "pdsend \"%s dialog apply\"", - p->properties_receiver->s_name); - pdgui_vmess(0, "ssssss", "button", button_apply_id, - "-text", "Apply", "-command", apply_command); - pdgui_vmess(0, "sssssisisi", "pack", button_apply_id, - "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); + snprintf(apply_command, MAXPDSTRING, "pdsend \"%s dialog apply\"", p->properties_receiver->s_name); + pdgui_vmess(0, "rs rs rs", "button", button_apply_id, "-text", "Apply", "-command", apply_command); + pdgui_vmess(0, "rs rs ri ri ri", "pack", button_apply_id, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); #endif - pdgui_vmess(0, "sssssisisi", "pack", button_ok_id, - "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); + pdgui_vmess(0, "rs rs ri ri ri", "pack", button_ok_id, "-side", "left", "-expand", 1, "-padx", 10, "-ipadx", 10); char ok_return_bind[MAXPDSTRING * 2]; - snprintf(ok_return_bind, MAXPDSTRING * 2, - "bind %s {%s}", - button_ok_id, ok_command); + snprintf(ok_return_bind, MAXPDSTRING * 2, "bind %s {%s}", button_ok_id, ok_command); pdgui_vmess(0, "r", ok_return_bind); #if __APPLE__ @@ -512,8 +505,7 @@ static void pdlua_properties(t_gobj *z, t_glist *MAYBE_UNUSED(owner)) { snprintf(focus_bind, MAXPDSTRING * 2, "bind %s {if {[focus] ne \"%s\"} {catch {%s configure -default normal}}}", p->properties_receiver->s_name, - button_ok_id, - button_ok_id); + button_ok_id, button_ok_id); pdgui_vmess(0, "r", focus_bind); #endif #endif @@ -533,25 +525,25 @@ static int pdlua_properties_newframe(lua_State *L) snprintf(current_frame_name, 100, "_%p_main_frame%d", (void *)&pdlua->properties, pdlua->properties.frame_count); // Create main frame for set of configurations - pdgui_vmess(0, "sssssi", "frame", current_frame_id, "-relief", "groove", "-borderwidth", 1); - pdgui_vmess(0, "sssssssisi", "pack", current_frame_id, "-side", "top", "-fill", "x", "-padx", 10, + pdgui_vmess(0, "rs rs ri", "frame", current_frame_id, "-relief", "groove", "-borderwidth", 1); + pdgui_vmess(0, "rs rs rs ri ri", "pack", current_frame_id, "-side", "top", "-fill", "x", "-padx", 10, "-pady", 10); // Title of the frame char labelid[MAXPDSTRING]; snprintf(labelid, MAXPDSTRING, "%s.title", current_frame_id); - pdgui_vmess(0, "ssss", "label", labelid, "-text", title); - pdgui_vmess(0, "sssssf", "pack", labelid, "-side", "top", "-pady", 5.f); + pdgui_vmess(0, "rs rs", "label", labelid, "-text", title); + pdgui_vmess(0, "rs rs ri", "pack", labelid, "-side", "top", "-pady", 5); // Create content frame with grid layout char content_frame_id[MAXPDSTRING]; snprintf(content_frame_id, MAXPDSTRING, "%s.content", current_frame_id); - pdgui_vmess(0, "ss", "frame", content_frame_id); - pdgui_vmess(0, "ssss", "pack", content_frame_id, "-side", "top", "-fill", "x"); + pdgui_vmess(0, "rs", "frame", content_frame_id); + pdgui_vmess(0, "rs rs rs", "pack", content_frame_id, "-side", "top", "-fill", "x"); // Configure grid with 2 equal columns for (int i = 0; i < col; i++) { - pdgui_vmess(0, "sssisi", "grid", "columnconfigure", content_frame_id, i, "-weight", 1); + pdgui_vmess(0, "rs ri ri", "grid", "columnconfigure", content_frame_id, i, "-weight", 1); } pdlua->properties.current_frame_id = gensym(content_frame_id); @@ -591,7 +583,7 @@ static int pdlua_properties_addcheck(lua_State *L) snprintf(check_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); // Initialize the Tcl variable to 0 (unchecked) - pdgui_vmess(0, "ssi", "set", check_var, init_value); + pdgui_vmess(0, "rsi", "set", check_var, init_value); // Build the pdsend command snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog checkbox %s $%s]", @@ -599,11 +591,9 @@ static int pdlua_properties_addcheck(lua_State *L) // Create the checkbox snprintf(check_id, IDLENGTH, "%s.check%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "ssssssss", "checkbutton", check_id, "-text", text, "-variable", check_var, - "-command", pdsend); + pdgui_vmess(0, "rs rs rs rs", "checkbutton", check_id, "-text", text, "-variable", check_var, "-command", pdsend); - pdgui_vmess(0, "sssisi", "grid", check_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, - "-sticky", "we"); + pdgui_vmess(0, "rs ri ri", "grid", check_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col); pdlua_properties_updaterow(&pdlua->properties); #else char name[MAXPDSTRING]; @@ -637,7 +627,7 @@ static int pdlua_properties_addtext(lua_State *L) snprintf(text_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); - pdgui_vmess(0, "sss", "set", text_var, init_value); + pdgui_vmess(0, "rss", "set", text_var, init_value); // Command to send it to pd snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog textbox %s $%s]", @@ -645,25 +635,22 @@ static int pdlua_properties_addtext(lua_State *L) // container_id for button to set and text input char text_button_frame_id[IDLENGTH]; - snprintf(text_button_frame_id, IDLENGTH, "%s.text_button_frame_%d", pdlua->properties.current_frame_id->s_name, - pdlua->properties.property_count); - pdgui_vmess(0, "sssssisisi", "frame", text_button_frame_id, "-relief", "solid", "-borderwidth", 0, - "-padx", 5, "-pady", 5); + snprintf(text_button_frame_id, IDLENGTH, "%s.text_button_frame_%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); + pdgui_vmess(0, "rs rs ri ri ri", "frame", text_button_frame_id, "-relief", "solid", "-borderwidth", 0, "-padx", 5, "-pady", 5); // create text for identification snprintf(text_id, MAXPDSTRING, "%s.text%d", text_button_frame_id, pdlua->properties.property_count); - pdgui_vmess(0, "ssss", "label", text_id, "-text", text); + pdgui_vmess(0, "rs rs", "label", text_id, "-text", text); snprintf(entry_id, MAXPDSTRING, "%s.textbox%d", text_button_frame_id, pdlua->properties.property_count); - pdgui_vmess(0, "sssssi", "entry", entry_id, "-textvariable", text_var, "-width", 8); - pdgui_vmess(0, "ssss", "bind", entry_id, "", pdsend); - pdgui_vmess(0, "ssss", "bind", entry_id, "", pdsend); + pdgui_vmess(0, "rs rs ri", "entry", entry_id, "-textvariable", text_var, "-width", 8); + pdgui_vmess(0, "rsss", "bind", entry_id, "", pdsend); + pdgui_vmess(0, "rsss", "bind", entry_id, "", pdsend); // Pack the entry - pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", entry_id, "-side", "left"); - pdgui_vmess(0, "sssisisssi", "grid", text_button_frame_id, "-row", pdlua->properties.current_row, "-column", - pdlua->properties.current_col, "-sticky", "we", "-padx", 20, "-pady", 20); + pdgui_vmess(0, "rs rs", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "rs rs", "pack", entry_id, "-side", "left"); + pdgui_vmess(0, "rs ri ri rs ri ri", "grid", text_button_frame_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we", "-padx", 8, "-pady", 8); pdlua_properties_updaterow(&pdlua->properties); #else char name[MAXPDSTRING]; @@ -732,10 +719,10 @@ static int pdlua_properties_addcolor(lua_State *L) { snprintf(text_id, MAXPDSTRING, "%s.label", container_id); snprintf(colorbox_id, IDLENGTH, "%s.box", container_id); - pdgui_vmess(0, "ss", "frame", container_id); - pdgui_vmess(0, "ssss", "label", text_id, "-text", text); - pdgui_vmess(0, "sssssisisssssi", "label", colorbox_id, "-text", "", "-width", 4, "-height", 2, "-background", initcolor, "-relief", "sunken", "-borderwidth", 1); - pdgui_vmess(0, "ssss", colorbox_id, "configure", "-cursor", "hand2"); + pdgui_vmess(0, "rs", "frame", container_id); + pdgui_vmess(0, "rs rs ri", "label", text_id, "-text", text, "-width", 8); + pdgui_vmess(0, "rs rs ri ri rs rs ri", "label", colorbox_id, "-text", "", "-width", 4, "-height", 2, "-background", initcolor, "-relief", "sunken", "-borderwidth", 1); + pdgui_vmess(0, "rs rs", colorbox_id, "configure", "-cursor", "hand2"); pdgui_vmess(0, "r", "proc pdlua_choose_color {widget receiver method} {\n" @@ -755,12 +742,12 @@ static int pdlua_properties_addcolor(lua_State *L) { snprintf(pdsend, MAXPDSTRING, "pdlua_choose_color %s %s %s", colorbox_id, pdlua->properties.properties_receiver->s_name, method); - pdgui_vmess(0, "ssss", "bind", colorbox_id, "", pdsend); + pdgui_vmess(0, "rsss", "bind", colorbox_id, "", pdsend); - pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); - pdgui_vmess(0, "sssssi", "pack", colorbox_id, "-side", "top", "-pady", 2); + pdgui_vmess(0, "rs rs", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "rs rs ri", "pack", colorbox_id, "-side", "top", "-pady", 2); - pdgui_vmess(0,"sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w"); + pdgui_vmess(0,"rs ri ri rs ri ri", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "w", "-padx", 8, "-pady", 8); pdlua_properties_updaterow(&pdlua->properties); @@ -800,37 +787,34 @@ static int pdlua_properties_addint(lua_State *L) snprintf(int_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); - pdgui_vmess(0, "ssi", "set", int_var, init_value); + pdgui_vmess(0, "rsi", "set", int_var, init_value); - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog numberbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, int_var); + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog numberbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, int_var); - snprintf(container_id, IDLENGTH/2, "%s.numberbox%d", - pdlua->properties.current_frame_id->s_name, - pdlua->properties.property_count); + snprintf(container_id, IDLENGTH/2, "%s.numberbox%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "ss", "frame", container_id); + pdgui_vmess(0, "rs", "frame", container_id); snprintf(text_id, MAXPDSTRING, "%s.label", container_id); - pdgui_vmess(0, "ssss", "label", text_id, "-text", text); + pdgui_vmess(0, "rs rs", "label", text_id, "-text", text); snprintf(spinbox_id, IDLENGTH, "%s.spin", container_id); - pdgui_vmess(0, "sssfsfsfsssissssss", "ttk::spinbox", spinbox_id, + pdgui_vmess(0, "rs rf rf rf rs ri rs rs rs", "ttk::spinbox", spinbox_id, "-from", min, "-to", max, "-increment", 1.0f, "-textvariable", int_var, - "-width", 8, + "-width", 6, "-validate", "key", "-validatecommand", "string is integer %P", "-command", pdsend); - pdgui_vmess(0, "ssss", "bind", spinbox_id, "", pdsend); - pdgui_vmess(0, "ssss", "bind", spinbox_id, "", pdsend); + pdgui_vmess(0, "rsss", "bind", spinbox_id, "", pdsend); + pdgui_vmess(0, "rsss", "bind", spinbox_id, "", pdsend); - pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", spinbox_id, "-side", "top"); - pdgui_vmess(0, "sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0, "rs rs", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "rs rs", "pack", spinbox_id, "-side", "top"); + pdgui_vmess(0, "rs ri ri rs ri ri", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we", "-padx", 8, "-pady", 8); pdlua_properties_updaterow(&pdlua->properties); #else @@ -867,28 +851,22 @@ static int pdlua_properties_addfloat(lua_State *L) snprintf(float_variable, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); - pdgui_vmess(0, "ssf", "set", float_variable, init_value); + pdgui_vmess(0, "rsf", "set", float_variable, init_value); - snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog floatbox %s $%s]", - pdlua->properties.properties_receiver->s_name, method, float_variable); + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog floatbox %s $%s]", pdlua->properties.properties_receiver->s_name, method, float_variable); - snprintf(container_id, IDLENGTH, "%s.floatbox%d", - pdlua->properties.current_frame_id->s_name, - pdlua->properties.property_count); + snprintf(container_id, IDLENGTH, "%s.floatbox%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); - pdgui_vmess(0, "ss", "frame", container_id); + pdgui_vmess(0, "rs", "frame", container_id); snprintf(text_id, MAXPDSTRING, "%s.label", container_id); - pdgui_vmess(0, "ssss", "label", text_id, "-text", text); + pdgui_vmess(0, "rs rs", "label", text_id, "-text", text); snprintf(entry_id, MAXPDSTRING, "%s.entry", container_id); - pdgui_vmess(0, "sssssissss", "entry", entry_id, - "-textvariable", float_variable, - "-width", 8, - "-validate", "key", - "-validatecommand", "regexp {^-?[0-9]*\\.?[0-9]*$} %P"); - + char entrycmd[MAXPDSTRING]; + snprintf(entrycmd, sizeof(entrycmd), "entry %s -textvariable %s -width 7 -validate key -validatecommand {regexp {^-?[0-9]*\\.?[0-9]*$} %%P}\n", entry_id, float_variable); + pdgui_vmess(0, "r", entrycmd); char keypresscmd[MAXPDSTRING * 4]; snprintf(keypresscmd, sizeof(keypresscmd), @@ -919,9 +897,9 @@ static int pdlua_properties_addfloat(lua_State *L) pdgui_vmess(0, "r", focusoutcmd); - pdgui_vmess(0, "ssss", "pack", text_id, "-side", "top"); - pdgui_vmess(0, "ssss", "pack", entry_id, "-side", "top"); - pdgui_vmess(0, "sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0, "rs rs", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "rs rs", "pack", entry_id, "-side", "top"); + pdgui_vmess(0, "rs ri ri rs ri ri", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we", "-padx", 8, "-pady", 8); pdlua_properties_updaterow(&pdlua->properties); #else @@ -966,31 +944,29 @@ static int pdlua_properties_addcombo(lua_State *L) snprintf(combo_var, IDLENGTH, "::%s_pdlua_property%d_value", pdlua->properties.current_frame_name->s_name, ++pdlua->properties.property_count); if(init_value < options_count) { - pdgui_vmess(0,"sss","set", combo_var, opts[init_value]); + pdgui_vmess(0, "rss", "set", combo_var, opts[init_value]); } - snprintf(pdsend, MAXPDSTRING, - "eval pdsend [concat %s dialog combobox %s [expr {[%%W current] + 1}]]", - pdlua->properties.properties_receiver->s_name, method); + snprintf(pdsend, MAXPDSTRING, "eval pdsend [concat %s dialog combobox %s [expr {[%%W current] + 1}]]", pdlua->properties.properties_receiver->s_name, method); char container_id[IDLENGTH/2]; snprintf(container_id, IDLENGTH/2, "%s.combo%d", pdlua->properties.current_frame_id->s_name, pdlua->properties.property_count); - pdgui_vmess(0,"ss", "frame", container_id); + pdgui_vmess(0," rs", "frame", container_id); snprintf(text_id, IDLENGTH, "%s.label", container_id); - pdgui_vmess(0,"ssss", "label", text_id, "-text", text); + pdgui_vmess(0, "rs rs", "label", text_id, "-text", text); snprintf(combo_id, IDLENGTH,"%s.widget",container_id); - pdgui_vmess(0,"sssssSsssi", "ttk::combobox", combo_id, "-textvariable",combo_var, "-values", options_count, opts, "-state", "readonly", "-width", 8); + pdgui_vmess(0, "rs rs rS rs ri", "ttk::combobox", combo_id, "-textvariable",combo_var, "-values", options_count, opts, "-state", "readonly", "-width", 8); - pdgui_vmess(0,"ssss", "bind", combo_id, "<>", pdsend); + pdgui_vmess(0, "rsss", "bind", combo_id, "<>", pdsend); - pdgui_vmess(0,"ssss", "pack", text_id, "-side", "top"); - pdgui_vmess(0,"ssss", "pack", combo_id, "-side", "top"); + pdgui_vmess(0, "rs rs", "pack", text_id, "-side", "top"); + pdgui_vmess(0, "rs rs", "pack", combo_id, "-side", "top"); - pdgui_vmess(0,"sssisiss", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we"); + pdgui_vmess(0, "rs ri ri rs ri ri", "grid", container_id, "-row", pdlua->properties.current_row, "-column", pdlua->properties.current_col, "-sticky", "we", "-padx", 8, "-pady", 8); pdlua_properties_updaterow(&pdlua->properties); #else From 72713746f36586cd0849bfbce32a34929d2168f2 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 24 Mar 2026 13:17:00 +0100 Subject: [PATCH 106/109] Add script to make compat53 header generation reproducible --- luas/generate_compat53_headers.sh | 3 +++ luas/lua-compat-headers/compat53_file_mt.h | 4 ++-- luas/lua-compat-headers/compat53_init.h | 4 ++-- luas/lua-compat-headers/compat53_module.h | 4 ++-- luas/luajit.c | 12 ++++++------ 5 files changed, 15 insertions(+), 12 deletions(-) create mode 100755 luas/generate_compat53_headers.sh diff --git a/luas/generate_compat53_headers.sh b/luas/generate_compat53_headers.sh new file mode 100755 index 0000000..f18baba --- /dev/null +++ b/luas/generate_compat53_headers.sh @@ -0,0 +1,3 @@ +xxd -i ./lua-compat-5.3/compat53/file_mt.lua ./lua-compat-headers/compat53_file_mt.h +xxd -i ./lua-compat-5.3/compat53/init.lua ./lua-compat-headers/compat53_init.h +xxd -i ./lua-compat-5.3/compat53/module.lua ./lua-compat-headers/compat53_module.h diff --git a/luas/lua-compat-headers/compat53_file_mt.h b/luas/lua-compat-headers/compat53_file_mt.h index e888327..5678afd 100644 --- a/luas/lua-compat-headers/compat53_file_mt.h +++ b/luas/lua-compat-headers/compat53_file_mt.h @@ -1,4 +1,4 @@ -unsigned char lua_compat_5_3_compat53_file_mt_lua[] = { +unsigned char __lua_compat_5_3_compat53_file_mt_lua[] = { 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x2d, 0x33, 0x29, @@ -163,4 +163,4 @@ unsigned char lua_compat_5_3_compat53_file_mt_lua[] = { 0x6e, 0x64, 0x0a, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4d, 0x0a }; -unsigned int lua_compat_5_3_compat53_file_mt_lua_len = 1945; +unsigned int __lua_compat_5_3_compat53_file_mt_lua_len = 1945; diff --git a/luas/lua-compat-headers/compat53_init.h b/luas/lua-compat-headers/compat53_init.h index 55e817e..8e0abce 100644 --- a/luas/lua-compat-headers/compat53_init.h +++ b/luas/lua-compat-headers/compat53_init.h @@ -1,4 +1,4 @@ -unsigned char lua_compat_5_3_compat53_init_lua[] = { +unsigned char __lua_compat_5_3_compat53_init_lua[] = { 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x2d, 0x33, 0x29, @@ -997,4 +997,4 @@ unsigned char lua_compat_5_3_compat53_init_lua[] = { 0x74, 0x6f, 0x70, 0x3d, 0x33, 0x20, 0x73, 0x68, 0x69, 0x66, 0x74, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x33, 0x20, 0x3a, 0x0a }; -unsigned int lua_compat_5_3_compat53_init_lua_len = 11961; +unsigned int __lua_compat_5_3_compat53_init_lua_len = 11961; diff --git a/luas/lua-compat-headers/compat53_module.h b/luas/lua-compat-headers/compat53_module.h index f5e4041..4a335f5 100644 --- a/luas/lua-compat-headers/compat53_module.h +++ b/luas/lua-compat-headers/compat53_module.h @@ -1,4 +1,4 @@ -unsigned char lua_compat_5_3_compat53_module_lua[] = { +unsigned char __lua_compat_5_3_compat53_module_lua[] = { 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x47, 0x2c, 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x5f, 0x47, 0x2c, 0x20, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x0a, 0x6c, 0x6f, @@ -2340,4 +2340,4 @@ unsigned char lua_compat_5_3_compat53_module_lua[] = { 0x73, 0x68, 0x69, 0x66, 0x74, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x33, 0x20, 0x3a, 0x0a }; -unsigned int lua_compat_5_3_compat53_module_lua_len = 28071; +unsigned int __lua_compat_5_3_compat53_module_lua_len = 28071; diff --git a/luas/luajit.c b/luas/luajit.c index 42b44d4..30e300b 100644 --- a/luas/luajit.c +++ b/luas/luajit.c @@ -39,16 +39,16 @@ static void preload_compat53(lua_State *L) { lua_getglobal(L, "package"); lua_getfield(L, -1, "preload"); - luaL_loadbuffer(L, (const char*)lua_compat_5_3_compat53_init_lua, - lua_compat_5_3_compat53_init_lua_len, "compat53"); + luaL_loadbuffer(L, (const char*)__lua_compat_5_3_compat53_init_lua, + __lua_compat_5_3_compat53_init_lua_len, "compat53"); lua_setfield(L, -2, "compat53"); - luaL_loadbuffer(L, (const char*)lua_compat_5_3_compat53_module_lua, - lua_compat_5_3_compat53_module_lua_len, "compat53.module"); + luaL_loadbuffer(L, (const char*)__lua_compat_5_3_compat53_module_lua, + __lua_compat_5_3_compat53_module_lua_len, "compat53.module"); lua_setfield(L, -2, "compat53.module"); - luaL_loadbuffer(L, (const char*)lua_compat_5_3_compat53_file_mt_lua, - lua_compat_5_3_compat53_file_mt_lua_len, "compat53.file_mt"); + luaL_loadbuffer(L, (const char*)__lua_compat_5_3_compat53_file_mt_lua, + __lua_compat_5_3_compat53_file_mt_lua_len, "compat53.file_mt"); lua_setfield(L, -2, "compat53.file_mt"); lua_pop(L, 2); From 46bbcea8bb0d9f2ab8fe6127f5f1f95223718ba1 Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 24 Mar 2026 14:13:35 +0100 Subject: [PATCH 107/109] Fix plugdata compilation --- pdlua.c | 4 +++- pdlua/examples/props.pd_lua | 41 ++++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/pdlua.c b/pdlua.c index 98c02c2..26f225c 100644 --- a/pdlua.c +++ b/pdlua.c @@ -1070,7 +1070,7 @@ static void pdlua_select(t_gobj *z, t_glist *glist, int state) text_widgetbehavior.w_selectfn(z, glist, state); } } -#else +#elif !defined(PLUGDATA) static void pdlua_select(t_gobj *z, t_glist *glist, int state) { t_pdlua *x = (t_pdlua *)z; @@ -1591,7 +1591,9 @@ static int pdlua_class_new(lua_State *L) // text_widgetbehavior won't give the right object tag with a freshly // created gop for some reason. // For pure-data, we need to trigger a repaint when an object gets selected to update the border colour +#ifndef PLUGDATA pdlua_widgetbehavior.w_selectfn = pdlua_select; +#endif pdlua_widgetbehavior.w_deletefn = pdlua_delete; pdlua_widgetbehavior.w_clickfn = pdlua_click; pdlua_widgetbehavior.w_visfn = pdlua_vis; diff --git a/pdlua/examples/props.pd_lua b/pdlua/examples/props.pd_lua index 84ef098..1409617 100644 --- a/pdlua/examples/props.pd_lua +++ b/pdlua/examples/props.pd_lua @@ -8,7 +8,8 @@ function properties:initialize(sel, atoms) self.checkbox1 = 1 self.checkbox2 = 0 - self.color = {155,155,155} + self.bgcolor = {155,155,155} + self.fgcolor = {100,100,100} self.textinput1 = "Hello" self.textinput2 = "World" @@ -27,28 +28,41 @@ function properties:properties(p) p:add_check("Check Box 2", "updatecheckbox2", self.checkbox2) -- Text inputs - p:new_frame("First textinput", 2) + p:new_frame("First textinput", 3) p:add_text("Check text 1", "updatetext1", self.textinput1) p:add_text("Check text 2", "updatetext2", self.textinput2) + p:add_text("Check", "updatetext2", self.textinput2) -- Color picker - p:new_frame("My Color Picker", 1) - p:add_color("Background", "updatecolorbg", self.color) + p:new_frame("My Color Picker", 3) + p:add_color("Background", "updatecolorbg", self.bgcolor) + p:add_color("Foreground", "updatecolorfg", self.fgcolor) + p:add_color("Text", "updatecolorfg", {50, 50, 50}) -- Number boxes - p:new_frame("Numbers", 2) + p:new_frame("Numbers", 3) p:add_float("Float", "updatefloat", self.float, 0, 1) p:add_int("Int", "updateint", self.int, 1, 16) + p:add_int("Int", "updateint", self.int, 1, 16) -- Combobox - p:new_frame("Combo", 1) + p:new_frame("Combo", 3) p:add_combo("Waveform", "updatecombo", self.combo, { "Sine", "Square", "Saw", "Triangle" }) + p:add_combo("Letter", "updateletter", 1, { "A", "B", "C", "D" }) + p:add_color("Foreground", "updatecolorfg", self.fgcolor) end function properties:updatecolorbg(args) - self.color[1] = args[1] - self.color[2] = args[2] - self.color[3] = args[3] + self.bgcolor[1] = args[1] + self.bgcolor[2] = args[2] + self.bgcolor[3] = args[3] + self:repaint(1) +end + +function properties:updatecolorfg(args) + self.fgcolor[1] = args[1] + self.fgcolor[2] = args[2] + self.fgcolor[3] = args[3] self:repaint(1) end @@ -87,7 +101,14 @@ function properties:updatecombo(combosel) pd.post("combo is now " .. self.combo); end +function properties:updateletter(letter) + pd.post("letter is now " .. letter); +end + function properties:paint(g) - g:set_color(table.unpack(self.color)) + g:set_color(table.unpack(self.bgcolor)) g:fill_all() + + g:set_color(table.unpack(self.fgcolor)) + g:fill_rect(20, 20, 100, 100) end From deda02d7a0d4ad839e2add7b4f3154fc2b9b659e Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 24 Mar 2026 16:36:13 +0100 Subject: [PATCH 108/109] Improve pure-data image cleanup logic --- luas/lua.c | 2 -- pdlua.h | 2 +- pdlua_gfx.h | 5 ++--- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/luas/lua.c b/luas/lua.c index 13e2152..01023ec 100644 --- a/luas/lua.c +++ b/luas/lua.c @@ -174,8 +174,6 @@ #define luaopen_string lua55_luaopen_string #define luaopen_table lua55_luaopen_table #define luaopen_utf8 lua55_luaopen_utf8 -#define l_likely(x) luai_likely(x) -#define l_unlikely(x) luai_unlikely(x) #include "lua/lua.h" #include "lua/lauxlib.h" diff --git a/pdlua.h b/pdlua.h index cc87698..8a62aa1 100644 --- a/pdlua.h +++ b/pdlua.h @@ -76,7 +76,7 @@ typedef struct _pdlua_gfx // Variables to keep track of mouse position, button state and whether the mouse is inside the object int mouse_x, mouse_y, mouse_down, mouse_inside; int first_draw; - uint32_t paint_generation; + int paint_generation; #ifndef PURR_DATA uint64_t *images; uint32_t *images_last_used; diff --git a/pdlua_gfx.h b/pdlua_gfx.h index 43e0dfe..029981b 100644 --- a/pdlua_gfx.h +++ b/pdlua_gfx.h @@ -130,7 +130,6 @@ static void pdlua_gfx_free(t_pdlua_gfx *gfx) { static void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { #ifndef PLUGDATA o->gfx.first_draw = firsttime; - o->gfx.paint_generation++; #endif lua_getglobal(__L(), "pd"); lua_getfield (__L(), -1, "_repaint"); @@ -149,7 +148,6 @@ static void pdlua_gfx_repaint(t_pdlua *o, int firsttime) { // Pass mouse events to lua script static void pdlua_gfx_mouse_event(t_pdlua *o, int x, int y, int type) { - lua_getglobal(__L(), "pd"); lua_getfield (__L(), -1, "_mouseevent"); lua_pushlightuserdata(__L(), o); @@ -552,7 +550,7 @@ static void pdlua_sweep_image_cache(t_pdlua_gfx *gfx) snprintf(image_name, 64, ".x%llupix%llu", (unsigned long long)gfx, (unsigned long long)gfx->images[i]); pdgui_vmess(0, "rrs", "image", "delete", image_name); - // Swap with last entry and shrink (O(1) removal) + // Swap with last entry and shrink gfx->images[i] = gfx->images[gfx->num_images - 1]; gfx->images_last_used[i] = gfx->images_last_used[gfx->num_images - 1]; @@ -1006,6 +1004,7 @@ static int end_paint(lua_State *L) { pdgui_vmess(0, "crss", cnv, "raise", gfx->current_layer_tag, gfx->layer_tags[layer - 1]); } } + if(layer == 0) gfx->paint_generation++; // Currently, image cleanup only happens on a full repaint. This could be improved pdlua_sweep_image_cache(gfx); #endif From 4b485f9763a0f83c45930692ab04e90bfea1002b Mon Sep 17 00:00:00 2001 From: Timothy Schoen Date: Tue, 24 Mar 2026 17:57:03 +0100 Subject: [PATCH 109/109] iOS: disable JIT since Apple doesn't allow it --- pdlua.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pdlua.c b/pdlua.c index 26f225c..48cba22 100644 --- a/pdlua.c +++ b/pdlua.c @@ -3249,6 +3249,7 @@ static int init_pdlua_environment(lua_State* L, const char* datadir) pdlua_properties_setup(L); #if LUA_USE_JIT +#ifndef TARGET_OS_IPHONE lua_getglobal(L, "jit"); lua_getfield(L, -1, "on"); lua_call(L, 0, 0); @@ -3258,6 +3259,7 @@ static int init_pdlua_environment(lua_State* L, const char* datadir) lua_getfield(L, -1, "start"); lua_pushstring(L, "hotloop=1"); lua_call(L, 1, 0); +#endif #endif return 1; /* success */

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�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%0A5=sjFB-RJ_@trR3xN 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 lrQF)>sSC=5hQIx6?0?o;NATAVQ5(*Z7n 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 A<^TWy literal 1608381 zcma%?Q*19lxAtq>w%uKK_g~w#ZQHhO+qP}n?yh(3_S%*tf4E>@nE zl_$R;mlqbLXJ+7lArJVsU|@c+6EP9l8Ct^d@W3#NT39=qI1(|6S{pc<2%8w$8JoZ` zN}Jf4Ihzx)GP5(o@bbbqIXjvd*uc1FuV`z{;kF_Btktcbfta}W0f_*gHzl8eLA-+o zjtUsyhJXA71a9XX5T|)1;NiNUh+(u$k#h}Yu$YC?HcOo3Nys|Bclp;XSRx-iZk0{t zVRC^}7c!5&N^F$}yDG|whEXNEdcNP^PW64W`}BT#Fn0(@R!D`t);#~+DvQdz@9X>K zneltOKe%6-GkyQNcP}LFsi^p|eSM3W5Y3GG{j-)==5myVm_|fNNqK91)39Ax_SWYO z`SmpwHg)}VQWloujIt?n>(^KA@oaf75nSG!Rh_Zx*ZCgEFkHXw8%|; z-L+VI_?!9xE+=hKgE}X1@%==TqwUPg(W{r?MWt3ns?W2R*Kg(Jg!f_Y{L7Ewy|D)D;c{^R=l43nW1DR&p-p1Z%$h8>~^i2 z1UZlUMkj-e$F-Kgd5AGhZ&lJfn0eHMTw3r=-r4@$TT-QLF6~{Z=Tph)VJs>;x