]> mj.ucw.cz Git - libucw.git/blob - images/image-walk.h
backup of incomplete sources
[libucw.git] / images / image-walk.h
1 /*
2  *      Image Library -- Pixels iteration
3  *
4  *      (c) 2006 Pavel Charvat <pchar@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #if !defined(IMAGE_WALK_INLINE) && !defined(IMAGE_WALK_STATIC)
11 #  error Missing IMAGE_WALK_INLINE or IMAGE_WALK_STATIC
12 #endif
13
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
18 #endif
19
20 #ifndef IMAGE_WALK_PIXELS
21 #  define IMAGE_WALK_PIXELS (img->pixels)
22 #endif
23 #ifndef IMAGE_WALK_COLS
24 #  define IMAGE_WALK_COLS (img->cols)
25 #endif
26 #ifndef IMAGE_WALK_ROWS
27 #  define IMAGE_WALK_ROWS (img->rows)
28 #endif
29 #ifndef IMAGE_WALK_COL_STEP
30 #  define IMAGE_WALK_COL_STEP (img->pixel_size)
31 #endif
32 #ifndef IMAGE_WALK_ROW_STEP
33 #  define IMAGE_WALK_ROW_STEP (img->row_size)
34 #endif
35
36 #ifdef IMAGE_WALK_DOUBLE
37 #  ifndef IMAGE_WALK_SEC_PIXELS
38 #    define IMAGE_WALK_SEC_PIXELS (sec_img->pixels)
39 #  endif
40 #  ifndef IMAGE_WALK_SEC_COLS
41 #    define IMAGE_WALK_SEC_COLS (sec_img->cols)
42 #  endif
43 #  ifndef IMAGE_WALK_SEC_ROWS
44 #    define IMAGE_WALK_SEC_ROWS (sec_img->rows)
45 #  endif
46 #  ifndef IMAGE_WALK_SEC_COL_STEP
47 #    define IMAGE_WALK_SEC_COL_STEP (sec_img->pixel_size)
48 #  endif
49 #  ifndef IMAGE_WALK_SEC_ROW_STEP
50 #    define IMAGE_WALK_SEC_ROW_STEP (sec_img->row_size)
51 #  endif
52 #  define STEP IMAGE_WALK_DO_STEP; pos += col_step; sec_pos += sec_col_step
53 #else
54 #  define STEP IMAGE_WALK_DO_STEP; pos += col_step
55 #endif
56
57 #ifndef IMAGE_WALK_DO_START
58 #  define IMAGE_WALK_DO_START
59 #endif
60
61 #ifndef IMAGE_WALK_DO_END
62 #  define IMAGE_WALK_DO_END
63 #endif
64
65 #ifndef IMAGE_WALK_DO_ROW_START
66 #  define IMAGE_WALK_DO_ROW_START
67 #endif
68
69 #ifndef IMAGE_WALK_DO_ROW_END
70 #  define IMAGE_WALK_DO_ROW_END
71 #endif
72
73 #ifndef IMAGE_WALK_DO_STEP
74 #  define IMAGE_WALK_DO_STEP
75 #endif
76
77 #ifndef IMAGE_WALK_INLINE
78 static void IMAGE_WALK_STATIC
79     (struct image *img
80 #   ifdef IMAGE_WALK_DOUBLE
81     , struct image *sec_img
82 #   endif
83 #   ifdef IMAGE_WALK_EXTRA_ARGS
84     , IMAGE_WALK_EXTRA_ARGS
85 #   endif
86     )
87 #endif
88 {
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;
94 # endif
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;
102 # endif
103   IMAGE_WALK_DO_START;
104   while (rows--)
105     {
106       IMAGE_WALK_DO_ROW_START;
107 #     if IMAGE_WALK_UNROLL == 1
108       for (uns i = cols; i--; )
109 #     else
110       for (uns i = cols_unroll_block_count; i--; )
111 #     endif
112         {
113 #         if IMAGE_WALK_UNROLL >= 4
114           STEP;
115           STEP;
116 #         endif
117 #         if IMAGE_WALK_UNROLL >= 2
118           STEP;
119 #         endif
120           STEP;
121         }
122 #     if IMAGE_WALK_UNROLL > 1
123       for (uns i = cols_unroll_end_count; i--; )
124         {
125           STEP;
126         }
127 #     endif
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);
132 #     endif
133     }
134   IMAGE_WALK_DO_END;
135 }
136
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
157 #undef STEP