/* See LICENSE file for copyright and license details. */ #ifndef LIBTRACEBITMAP_H #define LIBTRACEBITMAP_H #include #include /** * The background is show for pixels with this value */ #define LIBTRACEBITMAP_INK_OFF 0 /** * The foreground is show for pixels with this value */ #define LIBTRACEBITMAP_INK_ON 1 /** * Bitmap */ struct libtracebitmap_bitmap { /** * The height of the bitmap, in pixels */ size_t height; /** * The width of the bitmap, in pixels */ size_t width; /** * The bitmap * * Row-major order oriented and non-packed, meaning * that for an y-position `y` and an x-position `x`, * `.image[y * .width + x]` returns the pixel value, * which must either be `LIBTRACEBITMAP_INK_OFF` or * `LIBTRACEBITMAP_INK_ON` */ uint8_t *image; }; /** * Vectorise a bitmap * * @param bitmap The bitmap to vectorise; `bitmap->image` will be * be erased, but not deallocated * @param new_component Callback function that will be called each time the function * starts vectorising a separate component in the bitmap; the * first argument will be the 0 if the component shall be drawn, * and 1 if the component shall erase from a drawn component; * the second argument will be `user_data`; assuming the bitmap * is not empty, this will be the first callback the function calls; * the callback function shall return 0 upon successful completion * and any other value on failure * @param new_stop Callback function that is called each time the function finds * a node for the vector image; the first argument will be the * node's y-position (0 at the top, positive downwards); the second * argument will be the node's x-position (0 at the far left, * positive rightwards); the third argument will be `user_data`; * the callback function shall return 0 upon successful completion * and any other value on failure: Lines between adjecent nodes * within the same component (the initial and the final nodes are * adjacent) are always either horizontal or vertical, with no * other nodes between the them. * @param component_finished Callback function that is called each time the function is * finished with a component. The function will only vectorise * one component at a time, so after calling this callback, the * function will either return or immediate call `*new_component`, * and after calling `*new_component`, it will never `*new_component` * again before calling `*component_finished`; additionally, * `*component_finished` is called once for every call to * `*new_component`; the callback function shall return 0 upon * successful completion and any other value on failure * @param user_data Value to pass as the last argument for each callback function * @return 0 upon success, and the value returned by a callback function * if it returns a non-zero value */ int libtracebitmap_trace( struct libtracebitmap_bitmap *bitmap, int (*new_component)(int negative, void *user_data), int (*new_stop)(size_t y, size_t x, void *user_data), int (*component_finished)(void *user_data), void *user_data); #endif