From 22f703cab05b7cd368f4de9e03991b7664dc5022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Mon, 1 Sep 2014 13:56:46 +0200 Subject: Initial import of argyll version 1.5.1-8 --- render/render.h | 239 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 render/render.h (limited to 'render/render.h') 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 */ + -- cgit v1.2.3