summaryrefslogtreecommitdiff
path: root/render/render.h
diff options
context:
space:
mode:
Diffstat (limited to 'render/render.h')
-rw-r--r--render/render.h239
1 files changed, 239 insertions, 0 deletions
diff --git a/render/render.h b/render/render.h
new file mode 100644
index 0000000..e7bcdee
--- /dev/null
+++ b/render/render.h
@@ -0,0 +1,239 @@
+
+#ifndef RENDER2D_H
+#define RENDER2D_H
+
+/*
+ * render2d
+ *
+ * Simple 2D raster rendering support.
+ *
+ * Author: Graeme W. Gill
+ * Date: 28/12/2005
+ *
+ * Copyright 2005, 2008, 2012 Graeme W. Gill
+ * All rights reserved.
+ *
+ * This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
+ * see the License.txt file for licencing details.
+ */
+
+/* This is basically a simple 2D ray tracing renderer, so it's not especially */
+/* efficient, but it's simple and direct, easy to add new primitives or */
+/* capabilities, is high quality, and has an accelleration algorithm that */
+/* makes it fast enough for printed output. */
+
+/* Mathematical coordinate in mm are used for primitives, ie. the origin is */
+/* the bottom left corner. */
+/* Device color values range from 0.0 to 1.0 */
+
+#define MXCH2D 8 /* Maximum color channels */
+#define TOTC2D (MXCH2D+1) /* Maximum total components */
+#define PRIX2D (MXCH2D) /* Index of primitive */
+
+/* Color type */
+/* Shouldn't this be an xcolorants mask ? */
+typedef enum {
+ w_2d, /* Video style grey */
+ k_2d, /* Printing style grey */
+ lab_2d, /* Lab */
+ rgb_2d, /* RGB */
+ cmyk_2d, /* CMYK */
+ ncol_2d, /* N color */
+ ncol_a_2d /* N color with extra as alpha */
+} colort2d;
+
+/* Pixel depth */
+typedef enum {
+ bpc8_2d, /* 8 bits per component */
+ bpc16_2d /* 16 bits per component */
+} depth2d;
+
+typedef double color2d[TOTC2D];
+
+/* Font type */
+typedef enum {
+ rowman_s = 0, /* Rownman, single stroke */
+ rowman_d = 1, /* Rownman, double stroke */
+ rowman_t = 2, /* Rownman, triple stroke */
+ timesr = 3, /* Times Roman */
+ timesr_b = 4, /* Times Roman, Bold */
+ futura_l = 5, /* Futura, Light */
+ futura_m = 6 /* Futura, Medium */
+} font2d;
+
+/* ------------------------------------ */
+
+struct _render2d;
+
+#define PRIM_STRUCT \
+/* primt2d tag; */ /* Type of primitive */ \
+ int ix; /* Index (order added) */ \
+ int ncc; /* Number of color components */ \
+ struct _prim2d *next; /* Linked list to next primitive */ \
+ struct _prim2d *yl0; /* Previous lines Y list linked list */ \
+ struct _prim2d *yl; /* Active Y list linked list */ \
+ struct _prim2d *xl; /* Active X list linked list */ \
+ double x0, y0, x1, y1; /* Extent, top & left inclusive, bot & right non-inclusive */ \
+ void (*del)(struct _prim2d *s); /* Delete the object */ \
+ /* Render the object at location. Return nz if in primitive */ \
+ int (*rend)(struct _prim2d *s, color2d rv, double x, double y);
+
+struct _prim2d {
+ PRIM_STRUCT
+}; typedef struct _prim2d prim2d;
+
+/* ------------------------------------ */
+/* Solid rectange primitive */
+struct _rect2d {
+ PRIM_STRUCT
+ double rx0, ry0, rx1, ry1; /* Rectangle verticies */
+ color2d c; /* Color of rectangle */
+}; typedef struct _rect2d rect2d;
+
+prim2d *new_rect2d(struct _render2d *s, double x, double y, double w, double h, color2d c);
+
+/* ------------------------------------ */
+/* Vertex shaded rectange */
+struct _rectvs2d {
+ PRIM_STRUCT
+ double rx0, ry0, rx1, ry1; /* Rectangle verticies */
+ color2d c[4]; /* Bot left, bot right, top left, top right */
+ int x_blend; /* Blending rule flags, 0 = linear, 1 = spline, 2 = sine */
+ int y_blend;
+ int y_sine;
+}; typedef struct _rectvs2d rectvs2d;
+
+prim2d *new_rectvs2d(struct _render2d *s, double x, double y, double w, double h, color2d c[4]);
+
+/* ------------------------------------ */
+/* Vertex shaded triangle */
+struct _trivs2d {
+ PRIM_STRUCT
+ double be[3][3]; /* baricentric equations */
+ color2d c[3]; /* Color of each vertex */
+}; typedef struct _trivs2d trivs2d;
+
+prim2d *new_trivs2d(struct _render2d *s, double v[3][2], color2d c[3]);
+
+/* ------------------------------------ */
+/* A single line. */
+
+struct _line2d {
+ PRIM_STRUCT
+ double lx0, ly0, lx1, ly1; /* Line verticies */
+ double ww; /* half width of line squared */
+ int cap; /* 0 = butt, 1 = round, 2 = square */
+ color2d c; /* Color of the line */
+ int t; /* nz if line is degenerate */
+ double vx, vy; /* Vector relative to x0 y0 */
+}; typedef struct _line2d line2d;
+
+prim2d *new_line2d(struct _render2d *s, double x0, double y0, double x1, double y1, double w, int cap, color2d c);
+
+/* ------------------------------------ */
+
+/* add a dashed line */
+void add_dashed_line2d(
+struct _render2d *s,
+double x0, double y0,
+double x1, double y1,
+double w,
+double on, double off,
+int cap,
+color2d c);
+
+/* Add a text character at the given location using lines */
+void add_char2d(
+struct _render2d *s,
+double *xinc, /* Add increment to next character */
+double *yinc,
+font2d fo, /* Font to use */
+char ch, /* Character code to be printed */
+double x, double y, /* Location of bottom left of normal orientation text */
+double h, /* Height of text in normal orientation */
+int or, /* Orintation, 0 = right, 1 = down, 2 = left, 3 = up */
+color2d c /* Color of text */
+);
+
+/* Add a string from the given location using lines. */
+void add_string2d(
+struct _render2d *s,
+double *xinc, /* Add increment to next character */
+double *yinc,
+font2d fo, /* Font to use */
+char *string, /* Character code to be printed */
+double x, double y, /* Location of bottom left of normal orientation text */
+double h, /* Height of text in normal orientation */
+int or, /* Orintation, 0 = right, 1 = down, 2 = left, 3 = up */
+color2d c /* Color of text */
+);
+
+/* Return the total width of the string without adding it */
+void meas_string2d(
+struct _render2d *s,
+double *xinc, /* Add increment to next character */
+double *yinc,
+font2d fo, /* Font to use */
+char *string, /* Character code to be printed */
+double h, /* Height of text in normal orientation */
+int or /* Orintation, 0 = right, 1 = down, 2 = left, 3 = up */
+);
+
+/* ------------------------------------ */
+/* Render object */
+
+struct _render2d {
+
+/* Private: */
+ int ix; /* Next primitive index */
+ double fw, fh; /* Page size in mm including margines */
+ double lm, rm, tm, bm; /* Page margines in mm */
+ double w, h; /* Page size in mm excluding margines */
+ double hres, vres; /* Page pixel resolution in pixels/mm */
+ int pw, ph; /* Page size in pixels */
+ colort2d csp; /* Color space */
+ int ncc; /* Number of color components */
+ depth2d dpth; /* Depth of the components */
+ int dither; /* Dither flag */
+
+ color2d defc; /* Default color value */
+
+ void (*bgfunc)(void *cntx, color2d c, double x, double y); /* BG color function */
+ void *cntx;
+
+ prim2d *head; /* Start of list of primitives in rendering order */
+ prim2d *yl; /* Active Y list linked list head */
+ prim2d *xl; /* Active X list linked list head */
+
+/* Public: */
+ /* Methods */
+ void (*del)(struct _render2d *s); /* Free ourselves and all primitives */
+
+ void (*set_defc)(struct _render2d *s, color2d c); /* Set the default/background color */
+
+ void (*set_bg_func)(struct _render2d *s, /* Set background color function */
+ void (*func)(void *cntx, color2d c, double x, double y), /* Func can choose not to set */
+ void *cntx
+ );
+
+ void (*add)(struct _render2d *s, prim2d *p); /* Add a primitive */
+
+ int (*write)(struct _render2d *s, char *filename, int comprn);
+ /* Render and write to a TIFF file */
+}; typedef struct _render2d render2d;
+
+/* Constructor */
+render2d *new_render2d(
+ double w, /* width in mm */
+ double h, /* height in mm */
+ double ma[4], /* Margines, left, right, top, bottom, NULL for zero in mm */
+ double hres, /* horizontal resolution in pixels/mm */
+ double vres, /* horizontal resolution in pixels/mm */
+ colort2d csp, /* Color type */
+ int nd, /* Number of channels if c = ncol */
+ depth2d dpth, /* Pixel depth */
+ int dither /* Dither flag */
+);
+
+#endif /* RENDER2D_H */
+