1 | /* |
2 | * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. Oracle designates this |
8 | * particular file as subject to the "Classpath" exception as provided |
9 | * by Oracle in the LICENSE file that accompanied this code. |
10 | * |
11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
14 | * version 2 for more details (a copy is included in the LICENSE file that |
15 | * accompanied this code). |
16 | * |
17 | * You should have received a copy of the GNU General Public License version |
18 | * 2 along with this work; if not, write to the Free Software Foundation, |
19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
20 | * |
21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 | * or visit www.oracle.com if you need additional information or have any |
23 | * questions. |
24 | */ |
25 | |
26 | |
27 | #ifndef __MLIB_IMAGEAFFINE_H |
28 | #define __MLIB_IMAGEAFFINE_H |
29 | |
30 | #include "mlib_image.h" |
31 | #include "mlib_ImageDivTables.h" |
32 | #include "mlib_ImageFilters.h" |
33 | |
34 | #ifdef __cplusplus |
35 | extern "C" { |
36 | #endif /* __cplusplus */ |
37 | |
38 | /* |
39 | * DESCRIPTION |
40 | * Internal macro for mlib_ImageAffine. |
41 | * |
42 | * DTYPE define must be set to data type of image. |
43 | * FTYPE define must be set to type of floating-point operations. |
44 | */ |
45 | |
46 | /***************************************************************/ |
47 | typedef struct { |
48 | mlib_image *src; |
49 | mlib_image *dst; |
50 | mlib_u8 *buff_malloc; |
51 | mlib_u8 **lineAddr; |
52 | mlib_u8 *dstData; |
53 | mlib_s32 *leftEdges; |
54 | mlib_s32 *rightEdges; |
55 | mlib_s32 *xStarts; |
56 | mlib_s32 *yStarts; |
57 | mlib_s32 yStart; |
58 | mlib_s32 yFinish; |
59 | mlib_s32 dX; |
60 | mlib_s32 dY; |
61 | mlib_s32 max_xsize; |
62 | mlib_s32 srcYStride; |
63 | mlib_s32 dstYStride; |
64 | mlib_s32 *warp_tbl; |
65 | mlib_filter filter; |
66 | } mlib_affine_param; |
67 | |
68 | /***************************************************************/ |
69 | |
70 | #define LOAD_PARAM(param, x) x = param->x |
71 | #define STORE_PARAM(param, x) param->x=x |
72 | |
73 | /***************************************************************/ |
74 | mlib_status mlib_AffineEdges(mlib_affine_param *param, |
75 | const mlib_image *dst, |
76 | const mlib_image *src, |
77 | void *buff_lcl, |
78 | mlib_s32 buff_size, |
79 | mlib_s32 kw, |
80 | mlib_s32 kh, |
81 | mlib_s32 kw1, |
82 | mlib_s32 kh1, |
83 | mlib_edge edge, |
84 | const mlib_d64 *mtx, |
85 | mlib_s32 shiftx, |
86 | mlib_s32 shifty); |
87 | |
88 | /***************************************************************/ |
89 | typedef mlib_status (*type_affine_fun)(mlib_affine_param *param); |
90 | |
91 | /***************************************************************/ |
92 | void mlib_ImageAffine_bit_1ch_nn(mlib_affine_param *param, |
93 | mlib_s32 s_bitoff, |
94 | mlib_s32 d_bitoff); |
95 | |
96 | mlib_status mlib_ImageAffine_u8_1ch_nn(mlib_affine_param *param); |
97 | mlib_status mlib_ImageAffine_u8_2ch_nn(mlib_affine_param *param); |
98 | mlib_status mlib_ImageAffine_u8_3ch_nn(mlib_affine_param *param); |
99 | mlib_status mlib_ImageAffine_u8_4ch_nn(mlib_affine_param *param); |
100 | mlib_status mlib_ImageAffine_s16_1ch_nn(mlib_affine_param *param); |
101 | mlib_status mlib_ImageAffine_s16_2ch_nn(mlib_affine_param *param); |
102 | mlib_status mlib_ImageAffine_s16_3ch_nn(mlib_affine_param *param); |
103 | mlib_status mlib_ImageAffine_s16_4ch_nn(mlib_affine_param *param); |
104 | mlib_status mlib_ImageAffine_s32_1ch_nn(mlib_affine_param *param); |
105 | mlib_status mlib_ImageAffine_s32_2ch_nn(mlib_affine_param *param); |
106 | mlib_status mlib_ImageAffine_s32_3ch_nn(mlib_affine_param *param); |
107 | mlib_status mlib_ImageAffine_s32_4ch_nn(mlib_affine_param *param); |
108 | mlib_status mlib_ImageAffine_d64_1ch_nn(mlib_affine_param *param); |
109 | mlib_status mlib_ImageAffine_d64_2ch_nn(mlib_affine_param *param); |
110 | mlib_status mlib_ImageAffine_d64_3ch_nn(mlib_affine_param *param); |
111 | mlib_status mlib_ImageAffine_d64_4ch_nn(mlib_affine_param *param); |
112 | |
113 | mlib_status mlib_ImageAffine_u8_1ch_bl(mlib_affine_param *param); |
114 | mlib_status mlib_ImageAffine_u8_2ch_bl(mlib_affine_param *param); |
115 | mlib_status mlib_ImageAffine_u8_3ch_bl(mlib_affine_param *param); |
116 | mlib_status mlib_ImageAffine_u8_4ch_bl(mlib_affine_param *param); |
117 | mlib_status mlib_ImageAffine_s16_1ch_bl(mlib_affine_param *param); |
118 | mlib_status mlib_ImageAffine_s16_2ch_bl(mlib_affine_param *param); |
119 | mlib_status mlib_ImageAffine_s16_3ch_bl(mlib_affine_param *param); |
120 | mlib_status mlib_ImageAffine_s16_4ch_bl(mlib_affine_param *param); |
121 | mlib_status mlib_ImageAffine_u16_1ch_bl(mlib_affine_param *param); |
122 | mlib_status mlib_ImageAffine_u16_2ch_bl(mlib_affine_param *param); |
123 | mlib_status mlib_ImageAffine_u16_3ch_bl(mlib_affine_param *param); |
124 | mlib_status mlib_ImageAffine_u16_4ch_bl(mlib_affine_param *param); |
125 | mlib_status mlib_ImageAffine_s32_1ch_bl(mlib_affine_param *param); |
126 | mlib_status mlib_ImageAffine_s32_2ch_bl(mlib_affine_param *param); |
127 | mlib_status mlib_ImageAffine_s32_3ch_bl(mlib_affine_param *param); |
128 | mlib_status mlib_ImageAffine_s32_4ch_bl(mlib_affine_param *param); |
129 | mlib_status mlib_ImageAffine_f32_1ch_bl(mlib_affine_param *param); |
130 | mlib_status mlib_ImageAffine_f32_2ch_bl(mlib_affine_param *param); |
131 | mlib_status mlib_ImageAffine_f32_3ch_bl(mlib_affine_param *param); |
132 | mlib_status mlib_ImageAffine_f32_4ch_bl(mlib_affine_param *param); |
133 | mlib_status mlib_ImageAffine_d64_1ch_bl(mlib_affine_param *param); |
134 | mlib_status mlib_ImageAffine_d64_2ch_bl(mlib_affine_param *param); |
135 | mlib_status mlib_ImageAffine_d64_3ch_bl(mlib_affine_param *param); |
136 | mlib_status mlib_ImageAffine_d64_4ch_bl(mlib_affine_param *param); |
137 | |
138 | mlib_status mlib_ImageAffine_u8_1ch_bc(mlib_affine_param *param); |
139 | mlib_status mlib_ImageAffine_u8_2ch_bc(mlib_affine_param *param); |
140 | mlib_status mlib_ImageAffine_u8_3ch_bc(mlib_affine_param *param); |
141 | mlib_status mlib_ImageAffine_u8_4ch_bc(mlib_affine_param *param); |
142 | mlib_status mlib_ImageAffine_s16_1ch_bc(mlib_affine_param *param); |
143 | mlib_status mlib_ImageAffine_s16_2ch_bc(mlib_affine_param *param); |
144 | mlib_status mlib_ImageAffine_s16_3ch_bc(mlib_affine_param *param); |
145 | mlib_status mlib_ImageAffine_s16_4ch_bc(mlib_affine_param *param); |
146 | mlib_status mlib_ImageAffine_u16_1ch_bc(mlib_affine_param *param); |
147 | mlib_status mlib_ImageAffine_u16_2ch_bc(mlib_affine_param *param); |
148 | mlib_status mlib_ImageAffine_u16_3ch_bc(mlib_affine_param *param); |
149 | mlib_status mlib_ImageAffine_u16_4ch_bc(mlib_affine_param *param); |
150 | mlib_status mlib_ImageAffine_s32_1ch_bc(mlib_affine_param *param); |
151 | mlib_status mlib_ImageAffine_s32_2ch_bc(mlib_affine_param *param); |
152 | mlib_status mlib_ImageAffine_s32_3ch_bc(mlib_affine_param *param); |
153 | mlib_status mlib_ImageAffine_s32_4ch_bc(mlib_affine_param *param); |
154 | mlib_status mlib_ImageAffine_f32_1ch_bc(mlib_affine_param *param); |
155 | mlib_status mlib_ImageAffine_f32_2ch_bc(mlib_affine_param *param); |
156 | mlib_status mlib_ImageAffine_f32_3ch_bc(mlib_affine_param *param); |
157 | mlib_status mlib_ImageAffine_f32_4ch_bc(mlib_affine_param *param); |
158 | mlib_status mlib_ImageAffine_d64_1ch_bc(mlib_affine_param *param); |
159 | mlib_status mlib_ImageAffine_d64_2ch_bc(mlib_affine_param *param); |
160 | mlib_status mlib_ImageAffine_d64_3ch_bc(mlib_affine_param *param); |
161 | mlib_status mlib_ImageAffine_d64_4ch_bc(mlib_affine_param *param); |
162 | |
163 | /***************************************************************/ |
164 | void mlib_ImageAffineEdgeZero(mlib_affine_param *param, |
165 | mlib_affine_param *param_e); |
166 | |
167 | void mlib_ImageAffineEdgeNearest(mlib_affine_param *param, |
168 | mlib_affine_param *param_e); |
169 | |
170 | mlib_status mlib_ImageAffineEdgeExtend_BL(mlib_affine_param *param, |
171 | mlib_affine_param *param_e); |
172 | |
173 | mlib_status mlib_ImageAffineEdgeExtend_BC(mlib_affine_param *param, |
174 | mlib_affine_param *param_e); |
175 | |
176 | /***************************************************************/ |
177 | mlib_status mlib_ImageAffine_alltypes(mlib_image *dst, |
178 | const mlib_image *src, |
179 | const mlib_d64 *mtx, |
180 | mlib_filter filter, |
181 | mlib_edge edge); |
182 | |
183 | /***************************************************************/ |
184 | extern const type_affine_fun mlib_AffineFunArr_nn[]; |
185 | extern const type_affine_fun mlib_AffineFunArr_bl[]; |
186 | extern const type_affine_fun mlib_AffineFunArr_bc[]; |
187 | |
188 | /***************************************************************/ |
189 | typedef union { |
190 | mlib_d64 d64; |
191 | struct { |
192 | mlib_f32 f0; |
193 | mlib_f32 f1; |
194 | } f32s; |
195 | } d64_2x32; |
196 | |
197 | /***************************************************************/ |
198 | #define MLIB_SHIFT 16 |
199 | #define MLIB_PREC (1 << MLIB_SHIFT) |
200 | #define MLIB_MASK (MLIB_PREC - 1) |
201 | |
202 | /***************************************************************/ |
203 | #define ONE (FTYPE)1.0 |
204 | |
205 | /***************************************************************/ |
206 | #ifdef MLIB_USE_FTOI_CLAMPING |
207 | |
208 | #define SAT_32(DST, SRC) \ |
209 | DST = (mlib_s32) SRC |
210 | |
211 | #else |
212 | |
213 | #define SAT_32(DST, SRC) \ |
214 | if (SRC >= MLIB_S32_MAX) \ |
215 | SRC = MLIB_S32_MAX; \ |
216 | if (SRC <= MLIB_S32_MIN) \ |
217 | SRC = MLIB_S32_MIN; \ |
218 | DST = (mlib_s32) SRC |
219 | |
220 | #endif /* MLIB_USE_FTOI_CLAMPING */ |
221 | |
222 | //we still need this for mlib_ImageAffine_BC_S32.c |
223 | #define SAT32(DST) SAT_32(DST, val0) |
224 | |
225 | /***************************************************************/ |
226 | #if defined(MLIB_OS64BIT) || (defined(MACOSX) && defined(_LP64)) |
227 | #define PBITS 3 |
228 | #define MLIB_POINTER_SHIFT(P) (((P) >> (MLIB_SHIFT - 3)) &~ 7) |
229 | #define MLIB_POINTER_GET(A, P) (*(DTYPE**)((mlib_u8*)(A) + (P))) |
230 | #else |
231 | #define PBITS 2 |
232 | #define MLIB_POINTER_SHIFT(P) (((P) >> (MLIB_SHIFT - 2)) &~ 3) |
233 | #define MLIB_POINTER_GET(A, P) (*(DTYPE**)((mlib_addr)(A) + (P))) |
234 | #endif /* MLIB_OS64BIT */ |
235 | |
236 | #define PTR_SHIFT MLIB_POINTER_SHIFT |
237 | |
238 | /***************************************************************/ |
239 | #define SHIFT(X, SH, LO_BITS) \ |
240 | (((X) >> (SH - LO_BITS)) & ((1 << (15 + LO_BITS)) - (1 << LO_BITS))) |
241 | |
242 | /***************************************************************/ |
243 | #define S_PTRl(Y, SH) \ |
244 | (*(DTYPE**)((mlib_u8*)lineAddr + SHIFT(Y, SH, PBITS))) |
245 | |
246 | #define S_PTR(Y) S_PTRl(Y, 16) |
247 | |
248 | /***************************************************************/ |
249 | #define AL_ADDR(sp, ind) (mlib_d64*)((mlib_addr)(sp + ind) &~ 7) |
250 | |
251 | /***************************************************************/ |
252 | #define FILTER_ELEM_BITS 3 |
253 | |
254 | /***************************************************************/ |
255 | #define FILTER_SHIFT (MLIB_SHIFT - FILTER_BITS - FILTER_ELEM_BITS) |
256 | #define FILTER_SIZE (1 << FILTER_BITS) |
257 | #define FILTER_MASK ((FILTER_SIZE - 1) << FILTER_ELEM_BITS) |
258 | |
259 | /***************************************************************/ |
260 | #define DECLAREVAR0() \ |
261 | mlib_s32 *leftEdges = param -> leftEdges; \ |
262 | mlib_s32 *rightEdges = param -> rightEdges; \ |
263 | mlib_s32 *xStarts = param -> xStarts; \ |
264 | mlib_s32 *yStarts = param -> yStarts; \ |
265 | mlib_u8 *dstData = param -> dstData; \ |
266 | mlib_u8 **lineAddr = param -> lineAddr; \ |
267 | mlib_s32 dstYStride = param -> dstYStride; \ |
268 | mlib_s32 xLeft, xRight, X, Y; \ |
269 | mlib_s32 yStart = param -> yStart; \ |
270 | mlib_s32 yFinish = param -> yFinish; \ |
271 | mlib_s32 dX = param -> dX; \ |
272 | mlib_s32 dY = param -> dY; \ |
273 | mlib_s32 j |
274 | |
275 | /***************************************************************/ |
276 | #define DECLAREVAR() \ |
277 | DECLAREVAR0(); \ |
278 | mlib_s32 *warp_tbl = param -> warp_tbl; \ |
279 | DTYPE *dstPixelPtr |
280 | |
281 | /***************************************************************/ |
282 | #define DECLAREVAR_NN() \ |
283 | DECLAREVAR(); \ |
284 | DTYPE *srcPixelPtr; \ |
285 | mlib_s32 xSrc, ySrc |
286 | |
287 | /***************************************************************/ |
288 | #define DECLAREVAR_BL() \ |
289 | DECLAREVAR_NN(); \ |
290 | mlib_s32 srcYStride = param -> srcYStride |
291 | |
292 | /***************************************************************/ |
293 | #define DECLAREVAR_BC() \ |
294 | DECLAREVAR_BL(); \ |
295 | mlib_filter filter = param -> filter |
296 | |
297 | /***************************************************************/ |
298 | #define PREPARE_DELTAS \ |
299 | if (warp_tbl != NULL) { \ |
300 | dX = warp_tbl[2*j]; \ |
301 | dY = warp_tbl[2*j + 1]; \ |
302 | } |
303 | |
304 | /***************************************************************/ |
305 | #define CLIP(N) \ |
306 | dstData += dstYStride; \ |
307 | xLeft = leftEdges[j]; \ |
308 | xRight = rightEdges[j]; \ |
309 | X = xStarts[j]; \ |
310 | Y = yStarts[j]; \ |
311 | PREPARE_DELTAS; \ |
312 | if (xLeft > xRight) continue; \ |
313 | dstPixelPtr = (DTYPE*)dstData + N * xLeft |
314 | |
315 | /***************************************************************/ |
316 | #define NEW_LINE(NCHAN) \ |
317 | dstData += dstYStride; \ |
318 | xLeft = leftEdges[j]; \ |
319 | xRight = rightEdges[j]; \ |
320 | X = xStarts[j]; \ |
321 | Y = yStarts[j]; \ |
322 | PREPARE_DELTAS \ |
323 | dl = (void*)((DTYPE*)dstData + NCHAN*xLeft); \ |
324 | size = xRight - xLeft + 1; \ |
325 | if (size <= 0) continue |
326 | |
327 | /***************************************************************/ |
328 | |
329 | #ifdef __cplusplus |
330 | } |
331 | #endif /* __cplusplus */ |
332 | #endif /* __MLIB_IMAGEAFFINE_H */ |
333 | |