2 * Image Library -- Pixels iteration
4 * (c) 2006 Pavel Charvat <pchar@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
10 #if !defined(IMAGE_WALK_INLINE) && !defined(IMAGE_WALK_STATIC)
11 # error Missing IMAGE_WALK_INLINE or IMAGE_WALK_STATIC
14 #if !defined(IMAGE_WALK_UNROLL)
15 # define IMAGE_WALK_UNROLL 1
16 #elif IMAGE_WALK_UNROLL != 1 && IMAGE_WALK_UNROLL != 2 && IMAGE_WALK_UNROLL != 4
17 # error IMAGE_WALK_UNROLL must be 1, 2 or 4
20 #ifndef IMAGE_WALK_PIXELS
21 # define IMAGE_WALK_PIXELS (img->pixels)
23 #ifndef IMAGE_WALK_COLS
24 # define IMAGE_WALK_COLS (img->cols)
26 #ifndef IMAGE_WALK_ROWS
27 # define IMAGE_WALK_ROWS (img->rows)
29 #ifndef IMAGE_WALK_COL_STEP
30 # define IMAGE_WALK_COL_STEP (img->pixel_size)
32 #ifndef IMAGE_WALK_ROW_STEP
33 # define IMAGE_WALK_ROW_STEP (img->row_size)
36 #ifdef IMAGE_WALK_DOUBLE
37 # ifndef IMAGE_WALK_SEC_PIXELS
38 # define IMAGE_WALK_SEC_PIXELS (sec_img->pixels)
40 # ifndef IMAGE_WALK_SEC_COLS
41 # define IMAGE_WALK_SEC_COLS (sec_img->cols)
43 # ifndef IMAGE_WALK_SEC_ROWS
44 # define IMAGE_WALK_SEC_ROWS (sec_img->rows)
46 # ifndef IMAGE_WALK_SEC_COL_STEP
47 # define IMAGE_WALK_SEC_COL_STEP (sec_img->pixel_size)
49 # ifndef IMAGE_WALK_SEC_ROW_STEP
50 # define IMAGE_WALK_SEC_ROW_STEP (sec_img->row_size)
52 # define STEP IMAGE_WALK_DO_STEP; pos += col_step; sec_pos += sec_col_step
54 # define STEP IMAGE_WALK_DO_STEP; pos += col_step
57 #ifndef IMAGE_WALK_DO_START
58 # define IMAGE_WALK_DO_START
61 #ifndef IMAGE_WALK_DO_END
62 # define IMAGE_WALK_DO_END
65 #ifndef IMAGE_WALK_DO_ROW_START
66 # define IMAGE_WALK_DO_ROW_START
69 #ifndef IMAGE_WALK_DO_ROW_END
70 # define IMAGE_WALK_DO_ROW_END
73 #ifndef IMAGE_WALK_DO_STEP
74 # define IMAGE_WALK_DO_STEP
77 #ifndef IMAGE_WALK_INLINE
78 static void IMAGE_WALK_STATIC
80 # ifdef IMAGE_WALK_DOUBLE
81 , struct image *sec_img
83 # ifdef IMAGE_WALK_EXTRA_ARGS
84 , IMAGE_WALK_EXTRA_ARGS
89 uns cols = IMAGE_WALK_COLS;
90 uns rows = IMAGE_WALK_ROWS;
91 # if IMAGE_WALK_UNROLL > 1
92 uns cols_unroll_block_count = cols / IMAGE_WALK_UNROLL;
93 uns cols_unroll_end_count = cols % IMAGE_WALK_UNROLL;
95 byte *pos = IMAGE_WALK_PIXELS, *row_start = pos;
96 int col_step = IMAGE_WALK_COL_STEP;
97 int row_step = IMAGE_WALK_ROW_STEP;
98 # ifdef IMAGE_WALK_DOUBLE
99 byte *sec_pos = IMAGE_WALK_SEC_PIXELS, *sec_row_start = sec_pos;
100 int sec_col_step = IMAGE_WALK_SEC_COL_STEP;
101 int sec_row_step = IMAGE_WALK_SEC_ROW_STEP;
106 IMAGE_WALK_DO_ROW_START;
107 # if IMAGE_WALK_UNROLL == 1
108 for (uns i = cols; i--; )
110 for (uns i = cols_unroll_block_count; i--; )
113 # if IMAGE_WALK_UNROLL >= 4
117 # if IMAGE_WALK_UNROLL >= 2
122 # if IMAGE_WALK_UNROLL > 1
123 for (uns i = cols_unroll_end_count; i--; )
128 IMAGE_WALK_DO_ROW_END;
129 pos = (row_start += row_step);
130 # ifdef IMAGE_WALK_DOUBLE
131 sec_pos = (sec_row_start += sec_row_step);
137 #undef IMAGE_WALK_INLINE
138 #undef IMAGE_WALK_STATIC
139 #undef IMAGE_WALK_UNROLL
140 #undef IMAGE_WALK_DOUBLE
141 #undef IMAGE_WALK_EXTRA_ARGS
142 #undef IMAGE_WALK_PIXELS
143 #undef IMAGE_WALK_COLS
144 #undef IMAGE_WALK_ROWS
145 #undef IMAGE_WALK_COL_STEP
146 #undef IMAGE_WALK_ROW_STEP
147 #undef IMAGE_WALK_SEC_PIXELS
148 #undef IMAGE_WALK_SEC_COLS
149 #undef IMAGE_WALK_SEC_ROWS
150 #undef IMAGE_WALK_SEC_COL_STEP
151 #undef IMAGE_WALK_SEC_ROW_STEP
152 #undef IMAGE_WALK_DO_START
153 #undef IMAGE_WALK_DO_END
154 #undef IMAGE_WALK_DO_ROW_START
155 #undef IMAGE_WALK_DO_ROW_END
156 #undef IMAGE_WALK_DO_STEP