mii_emu/libmui/mui/cg.h

315 lines
10 KiB
C
Raw Normal View History

#ifndef __CG_H__
#define __CG_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "xft.h"
struct cg_point_t {
double x;
double y;
};
struct cg_rect_t {
double x;
double y;
double w;
double h;
};
struct cg_matrix_t {
double a; double b;
double c; double d;
double tx; double ty;
};
struct cg_color_t {
double r;
double g;
double b;
double a;
};
struct cg_gradient_stop_t {
double offset;
struct cg_color_t color;
};
enum cg_path_element_t {
CG_PATH_ELEMENT_MOVE_TO = 0,
CG_PATH_ELEMENT_LINE_TO = 1,
CG_PATH_ELEMENT_CURVE_TO = 2,
CG_PATH_ELEMENT_CLOSE = 3,
};
enum cg_spread_method_t {
CG_SPREAD_METHOD_PAD = 0,
CG_SPREAD_METHOD_REFLECT = 1,
CG_SPREAD_METHOD_REPEAT = 2,
};
enum cg_gradient_type_t {
CG_GRADIENT_TYPE_LINEAR = 0,
CG_GRADIENT_TYPE_RADIAL = 1,
};
enum cg_texture_type_t {
CG_TEXTURE_TYPE_PLAIN = 0,
CG_TEXTURE_TYPE_TILED = 1,
};
enum cg_line_cap_t {
CG_LINE_CAP_BUTT = 0,
CG_LINE_CAP_ROUND = 1,
CG_LINE_CAP_SQUARE = 2,
};
enum cg_line_join_t {
CG_LINE_JOIN_MITER = 0,
CG_LINE_JOIN_ROUND = 1,
CG_LINE_JOIN_BEVEL = 2,
};
enum cg_fill_rule_t {
CG_FILL_RULE_NON_ZERO = 0,
CG_FILL_RULE_EVEN_ODD = 1,
};
enum cg_paint_type_t {
CG_PAINT_TYPE_COLOR = 0,
CG_PAINT_TYPE_GRADIENT = 1,
CG_PAINT_TYPE_TEXTURE = 2,
};
enum cg_operator_t {
CG_OPERATOR_SRC = 0, /* r = s * ca + d * cia */
CG_OPERATOR_SRC_OVER = 1, /* r = (s + d * sia) * ca + d * cia */
CG_OPERATOR_DST_IN = 2, /* r = d * sa * ca + d * cia */
CG_OPERATOR_DST_OUT = 3, /* r = d * sia * ca + d * cia */
};
struct cg_surface_t {
int ref;
int width;
int height;
int stride;
int owndata;
void * pixels;
};
struct cg_path_t {
int contours;
struct cg_point_t start;
struct {
enum cg_path_element_t * data;
int size;
int capacity;
} elements;
struct {
struct cg_point_t * data;
int size;
int capacity;
} points;
};
struct cg_gradient_t {
enum cg_gradient_type_t type;
enum cg_spread_method_t spread;
struct cg_matrix_t matrix;
double values[6];
double opacity;
struct {
struct cg_gradient_stop_t * data;
int size;
int capacity;
} stops;
};
struct cg_texture_t {
enum cg_texture_type_t type;
struct cg_surface_t * surface;
struct cg_matrix_t matrix;
double opacity;
};
struct cg_paint_t {
enum cg_paint_type_t type;
struct cg_color_t color;
struct cg_gradient_t gradient;
struct cg_texture_t texture;
};
struct cg_span_t {
int x;
int len;
int y;
unsigned char coverage;
};
struct cg_rle_t {
struct {
struct cg_span_t * data;
int size;
int capacity;
} spans;
int x;
int y;
int w;
int h;
};
struct cg_dash_t {
double offset;
double * data;
int size;
};
struct cg_stroke_data_t {
double width;
double miterlimit;
enum cg_line_cap_t cap;
enum cg_line_join_t join;
struct cg_dash_t * dash;
};
struct cg_state_t {
struct cg_rle_t * clippath;
struct cg_paint_t paint;
struct cg_matrix_t matrix;
enum cg_fill_rule_t winding;
struct cg_stroke_data_t stroke;
enum cg_operator_t op;
double opacity;
struct cg_state_t * next;
};
struct cg_ctx_t {
struct cg_surface_t * surface;
struct cg_state_t * state;
struct cg_path_t * path;
struct cg_rle_t * rle;
struct cg_rle_t * clippath;
struct cg_rect_t clip;
void * outline_data;
size_t outline_size;
};
#ifndef CG_MIN
#define CG_MIN(a, b) ({typeof(a) _amin = (a); typeof(b) _bmin = (b); (void)(&_amin == &_bmin); _amin < _bmin ? _amin : _bmin;})
#endif
#ifndef CG_MAX
#define CG_MAX(a, b) ({typeof(a) _amax = (a); typeof(b) _bmax = (b); (void)(&_amax == &_bmax); _amax > _bmax ? _amax : _bmax;})
#endif
#ifndef CG_CLAMP
#define CG_CLAMP(v, a, b) CG_MIN(CG_MAX(a, v), b)
#endif
#ifndef CG_ALPHA
#define CG_ALPHA(c) ((c) >> 24)
#endif
#ifndef CG_DIV255
#define CG_DIV255(x) (((x) + ((x) >> 8) + 0x80) >> 8)
#endif
#ifndef CG_BYTE_MUL
#define CG_BYTE_MUL(x, a) ((((((x) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + (((((x) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff))
#endif
void cg_memfill32(uint32_t * dst, uint32_t val, int len);
void cg_comp_solid_source(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_solid_source_over(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_solid_destination_in(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_solid_destination_out(uint32_t * dst, int len, uint32_t color, uint32_t alpha);
void cg_comp_source(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);
void cg_comp_source_over(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);
void cg_comp_destination_in(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);
void cg_comp_destination_out(uint32_t * dst, int len, uint32_t * src, uint32_t alpha);
void cg_matrix_init(struct cg_matrix_t * m, double a, double b, double c, double d, double tx, double ty);
void cg_matrix_init_identity(struct cg_matrix_t * m);
void cg_matrix_init_translate(struct cg_matrix_t * m, double tx, double ty);
void cg_matrix_init_scale(struct cg_matrix_t * m, double sx, double sy);
void cg_matrix_init_rotate(struct cg_matrix_t * m, double r);
void cg_matrix_translate(struct cg_matrix_t * m, double tx, double ty);
void cg_matrix_scale(struct cg_matrix_t * m, double sx, double sy);
void cg_matrix_rotate(struct cg_matrix_t * m, double r);
void cg_matrix_multiply(struct cg_matrix_t * m, struct cg_matrix_t * m1, struct cg_matrix_t * m2);
void cg_matrix_invert(struct cg_matrix_t * m);
void cg_matrix_map_point(struct cg_matrix_t * m, struct cg_point_t * p1, struct cg_point_t * p2);
struct cg_surface_t * cg_surface_create(int width, int height);
struct cg_surface_t * cg_surface_create_for_data(int width, int height, void * pixels);
void cg_surface_destroy(struct cg_surface_t * surface);
struct cg_surface_t * cg_surface_reference(struct cg_surface_t * surface);
void cg_gradient_set_values_linear(struct cg_gradient_t * gradient, double x1, double y1, double x2, double y2);
void cg_gradient_set_values_radial(struct cg_gradient_t * gradient, double cx, double cy, double cr, double fx, double fy, double fr);
void cg_gradient_set_spread(struct cg_gradient_t * gradient, enum cg_spread_method_t spread);
void cg_gradient_set_matrix(struct cg_gradient_t * gradient, struct cg_matrix_t * m);
void cg_gradient_set_opacity(struct cg_gradient_t * gradient, double opacity);
void cg_gradient_add_stop_rgb(struct cg_gradient_t * gradient, double offset, double r, double g, double b);
void cg_gradient_add_stop_rgba(struct cg_gradient_t * gradient, double offset, double r, double g, double b, double a);
void cg_gradient_add_stop_color(struct cg_gradient_t * gradient, double offset, struct cg_color_t * color);
void cg_gradient_add_stop(struct cg_gradient_t * gradient, struct cg_gradient_stop_t * stop);
void cg_gradient_clear_stops(struct cg_gradient_t * gradient);
void cg_texture_set_type(struct cg_texture_t * texture, enum cg_texture_type_t type);
void cg_texture_set_matrix(struct cg_texture_t * texture, struct cg_matrix_t * m);
void cg_texture_set_surface(struct cg_texture_t * texture, struct cg_surface_t * surface);
void cg_texture_set_opacity(struct cg_texture_t * texture, double opacity);
struct cg_ctx_t * cg_create(struct cg_surface_t * surface);
void cg_destroy(struct cg_ctx_t * ctx);
void cg_save(struct cg_ctx_t * ctx);
void cg_restore(struct cg_ctx_t * ctx);
struct cg_color_t * cg_set_source_rgb(struct cg_ctx_t * ctx, double r, double g, double b);
struct cg_color_t * cg_set_source_rgba(struct cg_ctx_t * ctx, double r, double g, double b, double a);
struct cg_color_t * cg_set_source_color(struct cg_ctx_t * ctx, struct cg_color_t * color);
struct cg_gradient_t * cg_set_source_linear_gradient(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2);
struct cg_gradient_t * cg_set_source_radial_gradient(struct cg_ctx_t * ctx, double cx, double cy, double cr, double fx, double fy, double fr);
struct cg_texture_t * cg_set_source_surface(struct cg_ctx_t * ctx, struct cg_surface_t * surface, double x, double y);
void cg_set_operator(struct cg_ctx_t * ctx, enum cg_operator_t op);
void cg_set_opacity(struct cg_ctx_t * ctx, double opacity);
void cg_set_fill_rule(struct cg_ctx_t * ctx, enum cg_fill_rule_t winding);
void cg_set_line_width(struct cg_ctx_t * ctx, double width);
void cg_set_line_cap(struct cg_ctx_t * ctx, enum cg_line_cap_t cap);
void cg_set_line_join(struct cg_ctx_t * ctx, enum cg_line_join_t join);
void cg_set_miter_limit(struct cg_ctx_t * ctx, double limit);
void cg_set_dash(struct cg_ctx_t * ctx, double * dashes, int ndash, double offset);
void cg_translate(struct cg_ctx_t * ctx, double tx, double ty);
void cg_scale(struct cg_ctx_t * ctx, double sx, double sy);
void cg_rotate(struct cg_ctx_t * ctx, double r);
void cg_transform(struct cg_ctx_t * ctx, struct cg_matrix_t * m);
void cg_set_matrix(struct cg_ctx_t * ctx, struct cg_matrix_t * m);
void cg_identity_matrix(struct cg_ctx_t * ctx);
void cg_move_to(struct cg_ctx_t * ctx, double x, double y);
void cg_line_to(struct cg_ctx_t * ctx, double x, double y);
void cg_curve_to(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2, double x3, double y3);
void cg_quad_to(struct cg_ctx_t * ctx, double x1, double y1, double x2, double y2);
void cg_rel_move_to(struct cg_ctx_t * ctx, double dx, double dy);
void cg_rel_line_to(struct cg_ctx_t * ctx, double dx, double dy);
void cg_rel_curve_to(struct cg_ctx_t * ctx, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3);
void cg_rel_quad_to(struct cg_ctx_t * ctx, double dx1, double dy1, double dx2, double dy2);
void cg_rectangle(struct cg_ctx_t * ctx, double x, double y, double w, double h);
void cg_round_rectangle(struct cg_ctx_t * ctx, double x, double y, double w, double h, double rx, double ry);
void cg_ellipse(struct cg_ctx_t * ctx, double cx, double cy, double rx, double ry);
void cg_circle(struct cg_ctx_t * ctx, double cx, double cy, double r);
void cg_arc(struct cg_ctx_t * ctx, double cx, double cy, double r, double a0, double a1);
void cg_arc_negative(struct cg_ctx_t * ctx, double cx, double cy, double r, double a0, double a1);
void cg_new_path(struct cg_ctx_t * ctx);
void cg_close_path(struct cg_ctx_t * ctx);
void cg_reset_clip(struct cg_ctx_t * ctx);
void cg_clip(struct cg_ctx_t * ctx);
void cg_clip_preserve(struct cg_ctx_t * ctx);
void cg_fill(struct cg_ctx_t * ctx);
void cg_fill_preserve(struct cg_ctx_t * ctx);
void cg_stroke(struct cg_ctx_t * ctx);
void cg_stroke_preserve(struct cg_ctx_t * ctx);
void cg_paint(struct cg_ctx_t * ctx);
#ifdef __cplusplus
}
#endif
#endif /* __CG_H__ */