aboutsummaryrefslogblamecommitdiffstats
path: root/libtracebitmap.h
blob: 144f347f3e273c74aec26a265f22d5f36ebd2bec (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11






                                                         



                                                    
                                



                                                    
                                
 



         
                              


                                              
                      



                                             
                     










                                                            

  




































                                                                                                 
                         
                                             





                                                             
/* See LICENSE file for copyright and license details. */
#ifndef LIBTRACEBITMAP_H
#define LIBTRACEBITMAP_H

#include <stddef.h>
#include <stdint.h>


/**
 * 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