diff --git a/libraries/pico_vector/pico_vector.hpp b/libraries/pico_vector/pico_vector.hpp index ff21c4d4..6c70bbe5 100644 --- a/libraries/pico_vector/pico_vector.hpp +++ b/libraries/pico_vector/pico_vector.hpp @@ -31,6 +31,10 @@ namespace pimoroni { class PicoVector { private: af_text_metrics_t text_metrics; + // Hold copies of pretty-poly's pointers + // so MicroPython does not garbage collect them! + void *_pp_nodes; + void *_pp_node_counts; public: static PicoGraphics *graphics; @@ -40,6 +44,8 @@ namespace pimoroni { // TODO: Make these configurable? // Tile buffer size, Max nodes per scanline pp_init(16); + _pp_nodes = pp_nodes; + _pp_node_counts = pp_node_counts; pp_tile_callback(PicoVector::tile_callback); diff --git a/libraries/pico_vector/pretty-poly.h b/libraries/pico_vector/pretty-poly.h index 15bebf40..b726cd95 100644 --- a/libraries/pico_vector/pretty-poly.h +++ b/libraries/pico_vector/pretty-poly.h @@ -127,6 +127,11 @@ extern pp_tile_callback_t _pp_tile_callback; extern pp_antialias_t _pp_antialias; extern pp_mat3_t *_pp_transform; +// Our parent scope might want to hold a pointer to these +// ie: MicroPython to avoid garbage collection +extern int32_t *pp_nodes; +extern uint32_t *pp_node_counts; + void pp_clip(int32_t x, int32_t y, int32_t w, int32_t h); void pp_tile_callback(pp_tile_callback_t callback); void pp_antialias(pp_antialias_t antialias);