// C-ABI surface of the Nim library. Hand-maintained; ffigen parses this. #ifndef NIMFLUTTER_H #define NIMFLUTTER_H #include #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) #define NF_API __declspec(dllexport) #else #define NF_API __attribute__((visibility("default"))) #endif // Runs NimMain. Idempotent. Shared builds run it from a library constructor, // but static archives (iOS) have no such hook, so call this first. NF_API void nf_init(void); NF_API int nf_add(int a, int b); // Returns a NUL-terminated string allocated by Nim on the SHARED heap. // Caller MUST release it with nf_free. Never free it with Dart's calloc. NF_API char *nf_greet(const char *name); NF_API void nf_free(void *p); // Fills rows [y0, y1) of a w x h Mandelbrot image as RGBA8888, packed from // the start of `buf`. The buffer is owned by the CALLER: Nim allocates // nothing here and there is nothing to nf_free. Bands are independent, so // separate calls may run concurrently on different threads/isolates. // // `buf_len` is how many bytes `buf` holds; it must be at least // (y1 - y0) * w * 4. Every rejection is all-or-nothing — a buffer one byte // short writes nothing at all, rather than filling what fits, since partial // output is indistinguishable from a rendered frame. The size is computed in // 64-bit, because that product overflows int32 for plausible geometry. NF_API void nf_mandelbrot(unsigned char *buf, size_t buf_len, int w, int h, double cx, double cy, double scale, int max_iter, int y0, int y1); #ifdef __cplusplus } #endif #endif // NIMFLUTTER_H