--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/unix/native/libawt/awt/medialib/mlib_v_ImageCopy.c Fri Sep 19 09:41:05 2014 -0700
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2000, 2003, Oracle and/or its affiliates. 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. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+
+/*
+ * FUNCTION
+ * mlib_ImageCopy - Direct copy from one image to another.
+ *
+ * SYNOPSIS
+ * mlib_status mlib_ImageCopy(mlib_image *dst,
+ * mlib_image *src);
+ *
+ * ARGUMENT
+ * dst pointer to output or destination image
+ * src pointer to input or source image
+ *
+ * RESTRICTION
+ * src and dst must have the same size, type and number of channels.
+ * They can have 1, 2, 3 or 4 channels of MLIB_BIT, MLIB_BYTE,
+ * MLIB_SHORT, MLIB_INT, MLIB_FLOAT or MLIB_DOUBLE data type.
+ *
+ * DESCRIPTION
+ * Direct copy from one image to another.
+ */
+
+#include <stdlib.h>
+#include "mlib_image.h"
+#include "mlib_ImageCheck.h"
+
+/***************************************************************/
+
+extern void mlib_v_ImageCopy_blk(mlib_u8 *sa, mlib_u8 *da, mlib_s32 size);
+extern void mlib_v_ImageCopy_a1(mlib_d64 *sp, mlib_d64 *dp, mlib_s32 size);
+extern void mlib_ImageCopy_na(mlib_u8 *sa, mlib_u8 *da, mlib_s32 size);
+extern void mlib_ImageCopy_bit_al(mlib_u8 *sa, mlib_u8 *da,
+ mlib_s32 size, mlib_s32 offset);
+extern void mlib_ImageCopy_bit_na(mlib_u8 *sa, mlib_u8 *da, mlib_s32 size,
+ mlib_s32 s_offset, mlib_s32 d_offset);
+
+/***************************************************************/
+
+#ifdef MLIB_TEST
+
+mlib_status mlib_v_ImageCopy(mlib_image *dst, mlib_image *src)
+
+#else
+
+mlib_status mlib_ImageCopy(mlib_image *dst, const mlib_image *src)
+
+#endif
+{
+ mlib_u8 *sa; /* start point in source */
+ mlib_u8 *da; /* start points in destination */
+ mlib_s32 width; /* width in bytes of src and dst */
+ mlib_s32 height; /* height in lines of src and dst */
+ mlib_s32 s_offset; /* bit offset of src */
+ mlib_s32 d_offset; /* bit offset of dst */
+ mlib_s32 stride; /* stride in bytes in src*/
+ mlib_s32 dstride; /* stride in bytes in dst */
+ mlib_s32 j; /* indices for x, y */
+ mlib_s32 size;
+
+ MLIB_IMAGE_CHECK(src);
+ MLIB_IMAGE_CHECK(dst);
+ MLIB_IMAGE_TYPE_EQUAL(src, dst);
+ MLIB_IMAGE_CHAN_EQUAL(src, dst);
+ MLIB_IMAGE_SIZE_EQUAL(src, dst);
+
+ width = mlib_ImageGetWidth(dst) * mlib_ImageGetChannels(dst);
+ height = mlib_ImageGetHeight(dst);
+ sa = (mlib_u8 *)mlib_ImageGetData(src);
+ da = (mlib_u8 *)mlib_ImageGetData(dst);
+
+ switch (mlib_ImageGetType(dst)) {
+ case MLIB_BIT:
+
+ if (!mlib_ImageIsNotOneDvector(src) &&
+ !mlib_ImageIsNotOneDvector(dst)) {
+ size = height * (width >> 3);
+ if ((size & 0x3f) == 0 &&
+ !mlib_ImageIsNotAligned64(src) &&
+ !mlib_ImageIsNotAligned64(dst)) {
+
+ mlib_v_ImageCopy_blk(sa, da, size);
+ return MLIB_SUCCESS;
+ }
+ if (((size & 7) == 0) && !mlib_ImageIsNotAligned8(src) &&
+ !mlib_ImageIsNotAligned8(dst)) {
+
+ size >>= 3; /* in octlet */
+ mlib_v_ImageCopy_a1((mlib_d64 *)sa, (mlib_d64 *)da, size);
+ }
+ else {
+
+ mlib_ImageCopy_na(sa, da, size);
+ }
+ }
+ else {
+ stride = mlib_ImageGetStride(src); /* in byte */
+ dstride = mlib_ImageGetStride(dst); /* in byte */
+ s_offset = mlib_ImageGetBitOffset(src); /* in bits */
+ d_offset = mlib_ImageGetBitOffset(dst); /* in bits */
+
+ if (s_offset == d_offset) {
+ for (j = 0; j < height; j++) {
+ mlib_ImageCopy_bit_al(sa, da, width, s_offset);
+ sa += stride;
+ da += dstride;
+ }
+ } else {
+ for (j = 0; j < height; j++) {
+ mlib_ImageCopy_bit_na(sa, da, width, s_offset, d_offset);
+ sa += stride;
+ da += dstride;
+ }
+ }
+ }
+ return MLIB_SUCCESS;
+ case MLIB_BYTE:
+ break;
+ case MLIB_SHORT:
+ width *= 2;
+ break;
+ case MLIB_INT:
+ case MLIB_FLOAT:
+ width *= 4;
+ break;
+ case MLIB_DOUBLE:
+ width *= 8;
+ break;
+ default:
+ return MLIB_FAILURE;
+ }
+
+ if (!mlib_ImageIsNotOneDvector(src) &&
+ !mlib_ImageIsNotOneDvector(dst)) {
+ size = height * width;
+ if ((size & 0x3f) == 0 &&
+ !mlib_ImageIsNotAligned64(src) &&
+ !mlib_ImageIsNotAligned64(dst)) {
+
+ mlib_v_ImageCopy_blk(sa, da, size);
+ return MLIB_SUCCESS;
+ }
+ if (((size & 7) == 0) && !mlib_ImageIsNotAligned8(src) &&
+ !mlib_ImageIsNotAligned8(dst)) {
+
+ size >>= 3; /* in octlet */
+ mlib_v_ImageCopy_a1((mlib_d64 *)sa, (mlib_d64 *)da, size);
+ }
+ else {
+
+ mlib_ImageCopy_na(sa, da, size);
+ }
+ }
+ else {
+ stride = mlib_ImageGetStride(src); /* in byte */
+ dstride = mlib_ImageGetStride(dst); /* in byte */
+
+ /* row loop */
+ for (j = 0; j < height; j++) {
+ mlib_ImageCopy_na(sa, da, width);
+ sa += stride;
+ da += dstride;
+ }
+ }
+ return MLIB_SUCCESS;
+}
+
+/***************************************************************/