jdk/src/solaris/native/sun/awt/medialib/mlib_ImageConvCopyEdge_Fp.c
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/native/sun/awt/medialib/mlib_ImageConvCopyEdge_Fp.c	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,155 @@
+/*
+ * Copyright 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.
+ */
+
+/*
+ * FUNCTIONS
+ *      mlib_ImageConvCopyEdge_Fp  - Copy src edges  to dst edges
+ *
+ *
+ * SYNOPSIS
+ *      mlib_status mlib_ImageConvCopyEdge_Fp(mlib_image       *dst,
+ *                                            const mlib_image *src,
+ *                                            mlib_s32         dx_l,
+ *                                            mlib_32          dx_r,
+ *                                            mlib_s32         dy_t,
+ *                                            mlib_32          dy_b,
+ *                                            mlib_s32         cmask);
+ *
+ * ARGUMENT
+ *      dst       Pointer to an dst image.
+ *      src       Pointer to an src image.
+ *      dx_l      Number of columns on the left side of the
+ *                image to be copyed.
+ *      dx_r      Number of columns on the right side of the
+ *                image to be copyed.
+ *      dy_t      Number of rows on the top edge of the
+ *                image to be copyed.
+ *      dy_b      Number of rows on the top edge of the
+ *                image to be copyed.
+ *      cmask     Channel mask to indicate the channels to be convolved.
+ *                Each bit of which represents a channel in the image. The
+ *                channels corresponded to 1 bits are those to be processed.
+ *
+ * RESTRICTION
+ *      The src and the dst must be the same type, same width, same height and have same number
+ *      of channels (1, 2, 3, or 4). The unselected channels are not
+ *      overwritten. If both src and dst have just one channel,
+ *      cmask is ignored.
+ *
+ * DESCRIPTION
+ *      Copy src edges  to dst edges.
+ *
+ *      The unselected channels are not overwritten.
+ *      If src and dst have just one channel,
+ *      cmask is ignored.
+ */
+
+#include "mlib_image.h"
+#include "mlib_ImageConvEdge.h"
+
+/***************************************************************/
+#define EDGES(chan, type, mask)                                   \
+{                                                                 \
+  type *pdst = (type *) mlib_ImageGetData(dst);                   \
+  type *psrc = (type *) mlib_ImageGetData(src);                   \
+  mlib_s32 dst_stride = mlib_ImageGetStride(dst) / sizeof(type);  \
+  mlib_s32 src_stride = mlib_ImageGetStride(src) / sizeof(type);  \
+  mlib_s32 i, j, l;                                               \
+  mlib_s32 testchan;                                              \
+                                                                  \
+  testchan = 1;                                                   \
+  for (l = chan - 1; l >= 0; l--) {                               \
+    if ((mask & testchan) == 0) {                                 \
+      testchan <<= 1;                                             \
+      continue;                                                   \
+    }                                                             \
+    testchan <<= 1;                                               \
+    for (j = 0; j < dx_l; j++) {                                  \
+      for (i = dy_t; i < (img_height - dy_b); i++) {              \
+        pdst[i * dst_stride + l + j * chan] =                     \
+          psrc[i * src_stride + l + j * chan];                    \
+      }                                                           \
+    }                                                             \
+    for (j = 0; j < dx_r; j++) {                                  \
+      for (i = dy_t; i < (img_height - dy_b); i++) {              \
+        pdst[i * dst_stride + l + (img_width - 1 - j) * chan] =   \
+          psrc[i * src_stride + l + (img_width - 1 - j) * chan];  \
+      }                                                           \
+    }                                                             \
+    for (i = 0; i < dy_t; i++) {                                  \
+      for (j = 0; j < img_width; j++) {                           \
+        pdst[i * dst_stride + l + j * chan] =                     \
+          psrc[i * src_stride + l + j * chan];                    \
+      }                                                           \
+    }                                                             \
+    for (i = 0; i < dy_b; i++) {                                  \
+      for (j = 0; j < img_width; j++) {                           \
+        pdst[(img_height - 1 - i) * dst_stride + l + j * chan] =  \
+          psrc[(img_height - 1 - i) * src_stride + l + j * chan]; \
+      }                                                           \
+    }                                                             \
+  }                                                               \
+}
+
+/***************************************************************/
+mlib_status mlib_ImageConvCopyEdge_Fp(mlib_image       *dst,
+                                      const mlib_image *src,
+                                      mlib_s32         dx_l,
+                                      mlib_s32         dx_r,
+                                      mlib_s32         dy_t,
+                                      mlib_s32         dy_b,
+                                      mlib_s32         cmask)
+{
+  mlib_s32 img_width  = mlib_ImageGetWidth(dst);
+  mlib_s32 img_height = mlib_ImageGetHeight(dst);
+  mlib_s32 channel    = mlib_ImageGetChannels(dst);
+
+  if (dx_l + dx_r > img_width) {
+    dx_l = img_width;
+    dx_r = 0;
+  }
+
+  if (dy_t + dy_b > img_height) {
+    dy_t = img_height;
+    dy_b = 0;
+  }
+
+  if (channel == 1) cmask = 1;
+
+  switch (mlib_ImageGetType(src)) {
+    case MLIB_FLOAT:
+      EDGES(channel,mlib_f32, cmask)
+      break;
+    case MLIB_DOUBLE:
+      EDGES(channel,mlib_d64, cmask)
+      break;
+    default:
+      return MLIB_FAILURE;
+  }
+
+  return MLIB_SUCCESS;
+}
+
+/***************************************************************/