crashtest-r0ket/firmware/lcd/o.h

142 lines
4.5 KiB
C

/*
* o - a project called circle - that draws stuff
*
* Copyright (c) 2011 Øyvind Kolås <pippin@gimp.org>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _O_H
#define _O_H
/* initialize o with a given work data buffer, and the size of the data buffer
in bytes. This data buffer should be allocated on the stack (char buf[2048];
o_init (buf, sizeof (buf));
*/
void o_init (void *data, int data_size);
/* macro defines for relative commands */
#define o_rel_move_to(x, y) do { int ox, oy;\
o_current_point (&ox, &oy);\
o_move_to (ox + (x), oy + (y)); } while(0);
#define o_rel_line_to(x, y) do { int ox, oy;\
o_current_point (&ox, &oy);\
o_line_to (ox + (x), oy + (y)); } while(0);
#define o_rel_curve_to(x1, y1, x2,y2,x3,y3) do { int ox, oy;\
o_current_point (&ox, &oy);\
o_curve_to (ox + (x1), oy + (y1),\
ox + (x2), oy + (y2),\
ox + (x3), oy + (y3));} } while(0);
/* start drawing a new path */
/* clear current path */
void o_path_new (void);
/* move to */
void o_move_to (int x, int y);
/* line to */
void o_line_to (int x, int y);
/* bezier curve */
void o_curve_to (int x1, int y1, int x2, int y2, int x3, int y3);
/* close path with a straight line */
void o_close (void);
/* only available if compiled with stack*/
void o_save (void);
/* saved graphics drawing and transformation state*/
void o_restore (void);
/* retrieve the current pen coordinates */
void o_current_point (int *x, int *y);
void o_rectangle (int x0, int y0, int width, int height);
/* the shader is the rendering function invoked for each fragment/pixel touched
* when stroking and filling, setting the shader only possible when specially
* compiled with such support.
*/
typedef int (*ShaderFunction)(int x, int y, void *shader_data);
void o_set_shader (ShaderFunction shader, void *shader_data);
/* set a solid grayscale color, uses an internal shader for generating
* dither
*/
/* 0 = black 500 = gray 1000 = white */
void o_set_gray (int value);
/* fill currnet path (does not clear the path) */
void o_fill (void);
/* set the stroking line width */
void o_set_line_width (int line_width);
/* stroke path with current shader and line width */
void o_stroke (void);
/* Interface for binary "EPS"/SVG like renderer, can be used for storing sprites/
* icons inline with code or separately on disk
*/
void o_render (const signed char *vector_data);
/* query the offset in a file containing vector sprite number no */
int o_file_offset (const char *file_path, int no);
/* renders the sprite starting at the given offset in a file */
void o_render_file (const char *file_path, int offset);
/*** clipping ***/
void o_clip (void);
void o_reset_clip (void);
/* query the rough bounds of a program in mem/file,
o_path_extents would be a better API for this ... */
void o_bounds (const signed char *vector_data, int *minx, int *miny, int *maxx, int *maxy);
void o_bounds_file (const char *file_path, int offset, int *minx, int *miny, int *maxx, int *maxy);
/*** transformation manipulation ***/
typedef struct _OMatrix OMatrix;
struct _OMatrix
{
int m[3][2];
};
void o_transform (OMatrix *matrix, int replace);
void o_identity (void);
/* 1000 = 1.0 */
void o_translate (int x, int y);
/* 1000 = 1.0 */
void o_scale (int sx, int sy);
/* 1000 = 1.0, expressed in radians */
void o_rotate (int angle);
/*** font rendering ***/
void o_set_font_size (int size);
/* appends a path of the given ascii text.
*
* x,y : positioning of baseline for first characther
* width : the right margin. 0 means no wrapping
* ascii : a text string that may contain newlines.
*
*/
void o_show_text (const char *ascii, int wrap_width);
#endif