jdk/src/share/native/sun/awt/medialib/mlib_ImageAffine_NN.c
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/native/sun/awt/medialib/mlib_ImageAffine_NN.c	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2000-2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+
+/*
+ * FUNCTION
+ *      Internal functions for mlib_ImageAffine with Nearest Neighbor filtering.
+ */
+
+#include "mlib_ImageAffine.h"
+
+/***************************************************************/
+#define sp  srcPixelPtr
+#define dp  dstPixelPtr
+
+/***************************************************************/
+#undef  DTYPE
+#define DTYPE mlib_s32
+
+#ifdef _MSC_VER
+/* Workaround for MSC optimizer bug (known affected versions
+   12.00.8168-12.00.8804). See bug 4893435 for details. */
+#pragma optimize("gs", off)
+#endif /* _MSC_VER */
+#ifdef i386 /* do not perform the coping by mlib_d64 data type for x86 */
+
+mlib_status mlib_ImageAffine_s32_1ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(1);
+    dstLineEnd = (DTYPE *) dstData + xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp++) {
+      sp = S_PTR(Y) + (X >> MLIB_SHIFT);
+      dp[0] = sp[0];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+#else
+
+mlib_status mlib_ImageAffine_s32_1ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  mlib_s32 i, size;
+
+  for (j = yStart; j <= yFinish; j++) {
+    d64_2x32 dd;
+
+    CLIP(1);
+    size = xRight - xLeft + 1;
+
+    if ((mlib_addr) dp & 7) {
+      sp = S_PTR(Y);
+      *dp++ = sp[X >> MLIB_SHIFT];
+      X += dX;
+      Y += dY;
+      size--;
+    }
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (i = 0; i <= (size - 2); i += 2) {
+      mlib_f32 *sp0, *sp1;
+
+      sp0 = (mlib_f32 *) S_PTR(Y);
+      sp1 = (mlib_f32 *) S_PTR(Y + dY);
+
+      dd.f32s.f0 = sp0[X >> MLIB_SHIFT];
+      dd.f32s.f1 = sp1[(X + dX) >> MLIB_SHIFT];
+
+      *(mlib_d64 *) dp = dd.d64;
+
+      dp += 2;
+      X += 2 * dX;
+      Y += 2 * dY;
+    }
+
+    if (size & 1) {
+      sp = S_PTR(Y);
+      *dp = sp[X >> MLIB_SHIFT];
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+#endif /* i386 ( do not perform the coping by mlib_d64 data type for x86 ) */
+
+/***************************************************************/
+mlib_status mlib_ImageAffine_s32_2ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(2);
+    dstLineEnd = (DTYPE *) dstData + 2 * xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp += 2) {
+      sp = S_PTR(Y) + 2 * (X >> MLIB_SHIFT);
+      dp[0] = sp[0];
+      dp[1] = sp[1];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/
+mlib_status mlib_ImageAffine_s32_3ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(3);
+    dstLineEnd = (DTYPE *) dstData + 3 * xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp += 3) {
+      sp = S_PTR(Y) + 3 * (X >> MLIB_SHIFT);
+      dp[0] = sp[0];
+      dp[1] = sp[1];
+      dp[2] = sp[2];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/
+mlib_status mlib_ImageAffine_s32_4ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(4);
+    dstLineEnd = (DTYPE *) dstData + 4 * xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp += 4) {
+      sp = S_PTR(Y) + 4 * (X >> MLIB_SHIFT);
+      dp[0] = sp[0];
+      dp[1] = sp[1];
+      dp[2] = sp[2];
+      dp[3] = sp[3];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/
+#undef  DTYPE
+#define DTYPE mlib_d64
+
+mlib_status mlib_ImageAffine_d64_1ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(1);
+    dstLineEnd = (DTYPE *) dstData + xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp++) {
+      sp = S_PTR(Y);
+      dp[0] = sp[X >> MLIB_SHIFT];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/
+mlib_status mlib_ImageAffine_d64_2ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(2);
+    dstLineEnd = (DTYPE *) dstData + 2 * xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp += 2) {
+      sp = S_PTR(Y) + 2 * (X >> MLIB_SHIFT);
+      dp[0] = sp[0];
+      dp[1] = sp[1];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/
+mlib_status mlib_ImageAffine_d64_3ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(3);
+    dstLineEnd = (DTYPE *) dstData + 3 * xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp += 3) {
+      sp = S_PTR(Y) + 3 * (X >> MLIB_SHIFT);
+      dp[0] = sp[0];
+      dp[1] = sp[1];
+      dp[2] = sp[2];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/
+mlib_status mlib_ImageAffine_d64_4ch_nn(mlib_affine_param *param)
+{
+  DECLAREVAR();
+  DTYPE *srcPixelPtr;
+  DTYPE *dstLineEnd;
+
+  for (j = yStart; j <= yFinish; j++) {
+    CLIP(4);
+    dstLineEnd = (DTYPE *) dstData + 4 * xRight;
+
+#ifdef __SUNPRO_C
+#pragma pipeloop(0)
+#endif /* __SUNPRO_C */
+    for (; dp <= dstLineEnd; dp += 4) {
+      sp = S_PTR(Y) + 4 * (X >> MLIB_SHIFT);
+      dp[0] = sp[0];
+      dp[1] = sp[1];
+      dp[2] = sp[2];
+      dp[3] = sp[3];
+
+      X += dX;
+      Y += dY;
+    }
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/
+#ifdef _MSC_VER
+/* Workaround for MSC optimizer bug (known affected versions
+   12.00.8168-12.00.8804). See bug 4893435 for details. */
+#pragma optimize("gs", on)
+#endif /* _MSC_VER */