1 /* 2 * Copyright (c) 2000, 2003, 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 /* 28 * FUNCTION 29 * Internal functions for mlib_ImageAffine with Nearest Neighbor filtering. 30 */ 31 32 #include "mlib_ImageAffine.h" 33 34 /***************************************************************/ 35 #define sp srcPixelPtr 36 #define dp dstPixelPtr 37 38 /***************************************************************/ 39 #undef DTYPE 40 #define DTYPE mlib_s32 41 42 #ifdef _MSC_VER 43 /* Workaround for MSC optimizer bug (known affected versions 44 12.00.8168-12.00.8804). See bug 4893435 for details. */ 45 #pragma optimize("gs", off) 46 #endif /* _MSC_VER */ 47 #ifdef i386 /* do not perform the coping by mlib_d64 data type for x86 */ 48 49 mlib_status mlib_ImageAffine_s32_1ch_nn(mlib_affine_param *param) 50 { 51 DECLAREVAR(); 52 DTYPE *srcPixelPtr; 53 DTYPE *dstLineEnd; 54 55 for (j = yStart; j <= yFinish; j++) { 56 CLIP(1); 57 dstLineEnd = (DTYPE *) dstData + xRight; 58 59 #ifdef __SUNPRO_C 60 #pragma pipeloop(0) 61 #endif /* __SUNPRO_C */ 62 for (; dp <= dstLineEnd; dp++) { 63 sp = S_PTR(Y) + (X >> MLIB_SHIFT); 64 dp[0] = sp[0]; 65 66 X += dX; 67 Y += dY; 68 } 69 } 70 71 return MLIB_SUCCESS; 72 } 73 74 #else 75 76 mlib_status mlib_ImageAffine_s32_1ch_nn(mlib_affine_param *param) 77 { 78 DECLAREVAR(); 79 DTYPE *srcPixelPtr; 80 mlib_s32 i, size; 81 82 for (j = yStart; j <= yFinish; j++) { 83 d64_2x32 dd; 84 85 CLIP(1); 86 size = xRight - xLeft + 1; 87 88 if ((mlib_addr) dp & 7) { 89 sp = S_PTR(Y); 90 *dp++ = sp[X >> MLIB_SHIFT]; 91 X += dX; 92 Y += dY; 93 size--; 94 } 95 96 #ifdef __SUNPRO_C 97 #pragma pipeloop(0) 98 #endif /* __SUNPRO_C */ 99 for (i = 0; i <= (size - 2); i += 2) { 100 mlib_f32 *sp0, *sp1; 101 102 sp0 = (mlib_f32 *) S_PTR(Y); 103 sp1 = (mlib_f32 *) S_PTR(Y + dY); 104 105 dd.f32s.f0 = sp0[X >> MLIB_SHIFT]; 106 dd.f32s.f1 = sp1[(X + dX) >> MLIB_SHIFT]; 107 108 *(mlib_d64 *) dp = dd.d64; 109 110 dp += 2; 111 X += 2 * dX; 112 Y += 2 * dY; 113 } 114 115 if (size & 1) { 116 sp = S_PTR(Y); 117 *dp = sp[X >> MLIB_SHIFT]; 118 } 119 } 120 121 return MLIB_SUCCESS; 122 } 123 124 #endif /* i386 ( do not perform the coping by mlib_d64 data type for x86 ) */ 125 126 /***************************************************************/ 127 mlib_status mlib_ImageAffine_s32_2ch_nn(mlib_affine_param *param) 128 { 129 DECLAREVAR(); 130 DTYPE *srcPixelPtr; 131 DTYPE *dstLineEnd; 132 133 for (j = yStart; j <= yFinish; j++) { 134 CLIP(2); 135 dstLineEnd = (DTYPE *) dstData + 2 * xRight; 136 137 #ifdef __SUNPRO_C 138 #pragma pipeloop(0) 139 #endif /* __SUNPRO_C */ 140 for (; dp <= dstLineEnd; dp += 2) { 141 sp = S_PTR(Y) + 2 * (X >> MLIB_SHIFT); 142 dp[0] = sp[0]; 143 dp[1] = sp[1]; 144 145 X += dX; 146 Y += dY; 147 } 148 } 149 150 return MLIB_SUCCESS; 151 } 152 153 /***************************************************************/ 154 mlib_status mlib_ImageAffine_s32_3ch_nn(mlib_affine_param *param) 155 { 156 DECLAREVAR(); 157 DTYPE *srcPixelPtr; 158 DTYPE *dstLineEnd; 159 160 for (j = yStart; j <= yFinish; j++) { 161 CLIP(3); 162 dstLineEnd = (DTYPE *) dstData + 3 * xRight; 163 164 #ifdef __SUNPRO_C 165 #pragma pipeloop(0) 166 #endif /* __SUNPRO_C */ 167 for (; dp <= dstLineEnd; dp += 3) { 168 sp = S_PTR(Y) + 3 * (X >> MLIB_SHIFT); 169 dp[0] = sp[0]; 170 dp[1] = sp[1]; 171 dp[2] = sp[2]; 172 173 X += dX; 174 Y += dY; 175 } 176 } 177 178 return MLIB_SUCCESS; 179 } 180 181 /***************************************************************/ 182 mlib_status mlib_ImageAffine_s32_4ch_nn(mlib_affine_param *param) 183 { 184 DECLAREVAR(); 185 DTYPE *srcPixelPtr; 186 DTYPE *dstLineEnd; 187 188 for (j = yStart; j <= yFinish; j++) { 189 CLIP(4); 190 dstLineEnd = (DTYPE *) dstData + 4 * xRight; 191 192 #ifdef __SUNPRO_C 193 #pragma pipeloop(0) 194 #endif /* __SUNPRO_C */ 195 for (; dp <= dstLineEnd; dp += 4) { 196 sp = S_PTR(Y) + 4 * (X >> MLIB_SHIFT); 197 dp[0] = sp[0]; 198 dp[1] = sp[1]; 199 dp[2] = sp[2]; 200 dp[3] = sp[3]; 201 202 X += dX; 203 Y += dY; 204 } 205 } 206 207 return MLIB_SUCCESS; 208 } 209 210 /***************************************************************/ 211 #undef DTYPE 212 #define DTYPE mlib_d64 213 214 mlib_status mlib_ImageAffine_d64_1ch_nn(mlib_affine_param *param) 215 { 216 DECLAREVAR(); 217 DTYPE *srcPixelPtr; 218 DTYPE *dstLineEnd; 219 220 for (j = yStart; j <= yFinish; j++) { 221 CLIP(1); 222 dstLineEnd = (DTYPE *) dstData + xRight; 223 224 #ifdef __SUNPRO_C 225 #pragma pipeloop(0) 226 #endif /* __SUNPRO_C */ 227 for (; dp <= dstLineEnd; dp++) { 228 sp = S_PTR(Y); 229 dp[0] = sp[X >> MLIB_SHIFT]; 230 231 X += dX; 232 Y += dY; 233 } 234 } 235 236 return MLIB_SUCCESS; 237 } 238 239 /***************************************************************/ 240 mlib_status mlib_ImageAffine_d64_2ch_nn(mlib_affine_param *param) 241 { 242 DECLAREVAR(); 243 DTYPE *srcPixelPtr; 244 DTYPE *dstLineEnd; 245 246 for (j = yStart; j <= yFinish; j++) { 247 CLIP(2); 248 dstLineEnd = (DTYPE *) dstData + 2 * xRight; 249 250 #ifdef __SUNPRO_C 251 #pragma pipeloop(0) 252 #endif /* __SUNPRO_C */ 253 for (; dp <= dstLineEnd; dp += 2) { 254 sp = S_PTR(Y) + 2 * (X >> MLIB_SHIFT); 255 dp[0] = sp[0]; 256 dp[1] = sp[1]; 257 258 X += dX; 259 Y += dY; 260 } 261 } 262 263 return MLIB_SUCCESS; 264 } 265 266 /***************************************************************/ 267 mlib_status mlib_ImageAffine_d64_3ch_nn(mlib_affine_param *param) 268 { 269 DECLAREVAR(); 270 DTYPE *srcPixelPtr; 271 DTYPE *dstLineEnd; 272 273 for (j = yStart; j <= yFinish; j++) { 274 CLIP(3); 275 dstLineEnd = (DTYPE *) dstData + 3 * xRight; 276 277 #ifdef __SUNPRO_C 278 #pragma pipeloop(0) 279 #endif /* __SUNPRO_C */ 280 for (; dp <= dstLineEnd; dp += 3) { 281 sp = S_PTR(Y) + 3 * (X >> MLIB_SHIFT); 282 dp[0] = sp[0]; 283 dp[1] = sp[1]; 284 dp[2] = sp[2]; 285 286 X += dX; 287 Y += dY; 288 } 289 } 290 291 return MLIB_SUCCESS; 292 } 293 294 /***************************************************************/ 295 mlib_status mlib_ImageAffine_d64_4ch_nn(mlib_affine_param *param) 296 { 297 DECLAREVAR(); 298 DTYPE *srcPixelPtr; 299 DTYPE *dstLineEnd; 300 301 for (j = yStart; j <= yFinish; j++) { 302 CLIP(4); 303 dstLineEnd = (DTYPE *) dstData + 4 * xRight; 304 305 #ifdef __SUNPRO_C 306 #pragma pipeloop(0) 307 #endif /* __SUNPRO_C */ 308 for (; dp <= dstLineEnd; dp += 4) { 309 sp = S_PTR(Y) + 4 * (X >> MLIB_SHIFT); 310 dp[0] = sp[0]; 311 dp[1] = sp[1]; 312 dp[2] = sp[2]; 313 dp[3] = sp[3]; 314 315 X += dX; 316 Y += dY; 317 } 318 } 319 320 return MLIB_SUCCESS; 321 } 322 323 /***************************************************************/ 324 #ifdef _MSC_VER 325 /* Workaround for MSC optimizer bug (known affected versions 326 12.00.8168-12.00.8804). See bug 4893435 for details. */ 327 #pragma optimize("gs", on) 328 #endif /* _MSC_VER */