mirror of
https://github.com/buserror/mii_emu.git
synced 2024-11-25 05:32:20 +00:00
315 lines
10 KiB
C
315 lines
10 KiB
C
|
#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__ */
|