avoid ignoring the result of i_io_getc()
[imager.git] / imageri.h
CommitLineData
faa9b3e7
TC
1/* Declares utility functions useful across various files which
2 aren't meant to be available externally
3*/
4
5#ifndef IMAGEI_H_
6#define IMAGEI_H_
7
92bda632 8#include "imager.h"
31a13473 9#include <stddef.h>
faa9b3e7
TC
10
11/* wrapper functions that implement the floating point sample version of a
12 function in terms of the 8-bit sample version
13*/
8d14daab
TC
14extern int i_ppixf_fp(i_img *im, i_img_dim x, i_img_dim y, const i_fcolor *pix);
15extern int i_gpixf_fp(i_img *im, i_img_dim x, i_img_dim y, i_fcolor *pix);
16extern i_img_dim i_plinf_fp(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, const i_fcolor *pix);
17extern i_img_dim i_glinf_fp(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fcolor *pix);
18extern i_img_dim i_gsampf_fp(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fsample_t *samp,
18accb2a 19 int const *chans, int chan_count);
faa9b3e7
TC
20
21/* wrapper functions that forward palette calls to the underlying image,
22 assuming the underlying image is the first pointer in whatever
23 ext_data points at
24*/
97ac0a96 25extern int i_addcolors_forward(i_img *im, const i_color *, int count);
faa9b3e7
TC
26extern int i_getcolors_forward(i_img *im, int i, i_color *, int count);
27extern int i_colorcount_forward(i_img *im);
28extern int i_maxcolors_forward(i_img *im);
97ac0a96
TC
29extern int i_findcolor_forward(i_img *im, const i_color *color,
30 i_palidx *entry);
31extern int i_setcolors_forward(i_img *im, int index, const i_color *colors,
faa9b3e7
TC
32 int count);
33
bd8052a6 34/* fallback handler for gsamp_bits */
8d14daab 35extern i_img_dim i_gsamp_bits_fb(i_img *im, i_img_dim x, i_img_dim r, i_img_dim y, unsigned *samp,
bd8052a6
TC
36 const int *chans, int chan_count, int bits);
37
29b38678 38#define SampleFTo16(num) ((int)((num) * 65535.0 + 0.5))
faa9b3e7
TC
39/* we add that little bit to avoid rounding issues */
40#define Sample16ToF(num) ((num) / 65535.0)
41
29b38678 42#define SampleFTo8(num) ((int)((num) * 255.0 + 0.5))
faa9b3e7
TC
43#define Sample8ToF(num) ((num) / 255.0)
44
29b38678 45#define Sample16To8(num) (((num)+128) / 257)
faa9b3e7
TC
46#define Sample8To16(num) ((num) * 257)
47
efdc2568
TC
48extern void i_get_combine(int combine, i_fill_combine_f *, i_fill_combinef_f *);
49
a8652edf
TC
50#define im_min(a, b) ((a) < (b) ? (a) : (b))
51#define im_max(a, b) ((a) > (b) ? (a) : (b))
52
b33c08f8
TC
53#include "ext.h"
54
55extern UTIL_table_t i_UTIL_table;
56
35f40526
TC
57/* test if all channels are writable */
58#define I_ALL_CHANNELS_WRITABLE(im) (((im)->ch_mask & 0xF) == 0xf)
59
a8652edf 60typedef struct i_int_hline_seg_tag {
8d14daab 61 i_img_dim minx, x_limit;
a8652edf
TC
62} i_int_hline_seg;
63
64typedef struct i_int_hline_entry_tag {
8d14daab
TC
65 i_img_dim count;
66 size_t alloc;
a8652edf
TC
67 i_int_hline_seg segs[1];
68} i_int_hline_entry;
69
70/* represents a set of horizontal line segments to be filled in later */
71typedef struct i_int_hlines_tag {
8d14daab
TC
72 i_img_dim start_y, limit_y;
73 i_img_dim start_x, limit_x;
a8652edf
TC
74 i_int_hline_entry **entries;
75} i_int_hlines;
76
77extern void
78i_int_init_hlines(
79 i_int_hlines *hlines,
8d14daab
TC
80 i_img_dim start_y,
81 i_img_dim count_y,
82 i_img_dim start_x,
83 i_img_dim width_x
a8652edf
TC
84 );
85extern void i_int_init_hlines_img(i_int_hlines *hlines, i_img *img);
8d14daab 86extern void i_int_hlines_add(i_int_hlines *hlines, i_img_dim y, i_img_dim minx, i_img_dim width);
a8652edf
TC
87extern void i_int_hlines_destroy(i_int_hlines *hlines);
88
97ac0a96 89extern void i_int_hlines_fill_color(i_img *im, i_int_hlines *hlines, const i_color *val);
a8652edf
TC
90extern void i_int_hlines_fill_fill(i_img *im, i_int_hlines *hlines, i_fill_t *fill);
91
13c9a303
TC
92#define I_LIMIT_8(x) ((x) < 0 ? 0 : (x) > 255 ? 255 : (x))
93#define I_LIMIT_DOUBLE(x) ((x) < 0.0 ? 0.0 : (x) > 1.0 ? 1.0 : (x))
94
42a0797f 95#define IM_STRING(x) #x
b3afeed5
TC
96
97/* I considered using assert.h here, but perl does it's own thing with
98 assert() and the NDEBUG test is opposite to the direction I prefer */
99#ifdef IM_ASSERT
100extern void im_assert_fail(char const *, int, char const *);
42a0797f 101#define im_assert(x) ((x) ? (void)(0) : im_assert_fail(__FILE__, __LINE__, IM_STRING(x)))
b3afeed5
TC
102#else
103#define im_assert(x) (void)(0)
104#endif
105
50c75381
TC
106i_img_dim i_minx(i_img_dim a, i_img_dim b);
107i_img_dim i_maxx(i_img_dim x, i_img_dim y);
8d14daab 108i_img_dim i_abs(i_img_dim x);
50c75381
TC
109
110#define i_min(a, b) i_minx((a), (b))
111#define i_max(a, b) i_maxx((a), (b))
112
6d068d36
TC
113#define color_to_grey(col) ((col)->rgb.r * 0.222 + (col)->rgb.g * 0.707 + (col)->rgb.b * 0.071)
114
74315ca9
TC
115#define IM_ERROR_COUNT 20
116typedef struct im_context_tag {
117 int error_sp;
118 size_t error_alloc[IM_ERROR_COUNT];
119 i_errmsg error_stack[IM_ERROR_COUNT];
120#ifdef IMAGER_LOG
6ee0c41f 121 /* the log file and level for this context */
74315ca9 122 FILE *lg_file;
6ee0c41f
TC
123 int log_level;
124
125 /* whether we own the lg_file, false for stderr and for cloned contexts */
126 int own_log;
127
128 /* values supplied by lhead */
696cb85d
TC
129 const char *filename;
130 int line;
74315ca9 131#endif
44d86483
TC
132
133 /* file size limits */
134 i_img_dim max_width, max_height;
135 size_t max_bytes;
31a13473 136
fc02e376
TC
137 /* per context storage */
138 size_t slot_alloc;
139 void **slots;
140
31a13473 141 ptrdiff_t refcount;
74315ca9
TC
142} im_context_struct;
143
44d86483
TC
144#define DEF_BYTES_LIMIT 0x40000000
145
faa9b3e7 146#endif