Commit | Line | Data |
---|---|---|
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 |
14 | extern int i_ppixf_fp(i_img *im, i_img_dim x, i_img_dim y, const i_fcolor *pix); |
15 | extern int i_gpixf_fp(i_img *im, i_img_dim x, i_img_dim y, i_fcolor *pix); | |
16 | extern 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); | |
17 | extern i_img_dim i_glinf_fp(i_img *im, i_img_dim l, i_img_dim r, i_img_dim y, i_fcolor *pix); | |
18 | extern 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 | 25 | extern int i_addcolors_forward(i_img *im, const i_color *, int count); |
faa9b3e7 TC |
26 | extern int i_getcolors_forward(i_img *im, int i, i_color *, int count); |
27 | extern int i_colorcount_forward(i_img *im); | |
28 | extern int i_maxcolors_forward(i_img *im); | |
97ac0a96 TC |
29 | extern int i_findcolor_forward(i_img *im, const i_color *color, |
30 | i_palidx *entry); | |
31 | extern 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 | 35 | extern 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 |
48 | extern 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 | ||
55 | extern 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 | 60 | typedef struct i_int_hline_seg_tag { |
8d14daab | 61 | i_img_dim minx, x_limit; |
a8652edf TC |
62 | } i_int_hline_seg; |
63 | ||
64 | typedef 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 */ | |
71 | typedef 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 | ||
77 | extern void | |
78 | i_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 | ); |
85 | extern void i_int_init_hlines_img(i_int_hlines *hlines, i_img *img); | |
8d14daab | 86 | extern void i_int_hlines_add(i_int_hlines *hlines, i_img_dim y, i_img_dim minx, i_img_dim width); |
a8652edf TC |
87 | extern void i_int_hlines_destroy(i_int_hlines *hlines); |
88 | ||
97ac0a96 | 89 | extern void i_int_hlines_fill_color(i_img *im, i_int_hlines *hlines, const i_color *val); |
a8652edf TC |
90 | extern 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 | |
100 | extern 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 |
106 | i_img_dim i_minx(i_img_dim a, i_img_dim b); |
107 | i_img_dim i_maxx(i_img_dim x, i_img_dim y); | |
8d14daab | 108 | i_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 |
116 | typedef 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 | |
121 | int log_level; | |
122 | FILE *lg_file; | |
696cb85d TC |
123 | const char *filename; |
124 | int line; | |
74315ca9 | 125 | #endif |
44d86483 TC |
126 | |
127 | /* file size limits */ | |
128 | i_img_dim max_width, max_height; | |
129 | size_t max_bytes; | |
31a13473 | 130 | |
fc02e376 TC |
131 | /* per context storage */ |
132 | size_t slot_alloc; | |
133 | void **slots; | |
134 | ||
31a13473 | 135 | ptrdiff_t refcount; |
74315ca9 TC |
136 | } im_context_struct; |
137 | ||
44d86483 TC |
138 | #define DEF_BYTES_LIMIT 0x40000000 |
139 | ||
faa9b3e7 | 140 | #endif |