Initial load
diff --git a/jdk/src/solaris/native/sun/java2d/loops/java2d_Mlib.c b/jdk/src/solaris/native/sun/java2d/loops/java2d_Mlib.c
new file mode 100644
index 0000000..cf0a277
--- /dev/null
+++ b/jdk/src/solaris/native/sun/java2d/loops/java2d_Mlib.c
@@ -0,0 +1,387 @@
+/*
+ * 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.
+ */
+
+#if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF)
+
+#include "java2d_Mlib.h"
+#include "SurfaceData.h"
+
+#include "mlib_ImageZoom.h"
+
+/***************************************************************/
+
+#define DEFINE_ISO_COPY(FUNC, ANYTYPE)               \
+void ADD_SUFF(ANYTYPE##FUNC)(BLIT_PARAMS)            \
+{                                                    \
+    mlib_s32 srcScan = pSrcInfo->scanStride;         \
+    mlib_s32 dstScan = pDstInfo->scanStride;         \
+    mlib_s32 xsize = width*ANYTYPE##PixelStride;     \
+    mlib_s32 i;                                      \
+                                                     \
+    if (srcScan == xsize && dstScan == xsize) {      \
+        xsize *= height;                             \
+        height = 1;                                  \
+    }                                                \
+                                                     \
+    for (i = 0; i < height; i++) {                   \
+        mlib_ImageCopy_na(srcBase, dstBase, xsize);  \
+        srcBase = (mlib_u8*)srcBase + srcScan;       \
+        dstBase = (mlib_u8*)dstBase + dstScan;       \
+    }                                                \
+}
+
+DEFINE_ISO_COPY(IsomorphicCopy, Any3Byte)
+DEFINE_ISO_COPY(IsomorphicCopy, Any4Byte)
+DEFINE_ISO_COPY(IsomorphicCopy, AnyByte)
+DEFINE_ISO_COPY(IsomorphicCopy, AnyInt)
+DEFINE_ISO_COPY(IsomorphicCopy, AnyShort)
+
+/***************************************************************/
+
+#define SET_PIX(index, chan)         \
+    dst_ptr[index] = pixel##chan
+
+#define W_LEVEL_1   8
+#define W_LEVEL_3  16
+#define W_LEVEL_4   8
+
+#define DEFINE_SET_RECT(FUNC, ANYTYPE, NCHAN)                       \
+void ADD_SUFF(ANYTYPE##FUNC)(SurfaceDataRasInfo * pRasInfo,         \
+                             jint lox, jint loy, jint hix,          \
+                             jint hiy, jint pixel,                  \
+                             NativePrimitive * pPrim,               \
+                             CompositeInfo * pCompInfo)             \
+{                                                                   \
+    mlib_image dst[1];                                              \
+    mlib_s32 dstScan = pRasInfo->scanStride;                        \
+    mlib_s32 height = hiy - loy;                                    \
+    mlib_s32 width  = hix - lox;                                    \
+    mlib_u8  *dstBase = (mlib_u8*)(pRasInfo->rasBase);              \
+    mlib_s32 c_arr[4];                                              \
+                                                                    \
+    dstBase += loy*dstScan + lox*ANYTYPE##PixelStride;              \
+                                                                    \
+    if (width <= W_LEVEL_##NCHAN) {                                 \
+        EXTRACT_CONST_##NCHAN(pixel);                               \
+                                                                    \
+        LOOP_DST(ANYTYPE, NCHAN, dstBase, dstScan, SET_PIX);        \
+        return;                                                     \
+    }                                                               \
+                                                                    \
+    STORE_CONST_##NCHAN(c_arr, pixel);                              \
+                                                                    \
+    MLIB_IMAGE_SET(dst, MLIB_##ANYTYPE, NCHAN,                      \
+                   width, height, dstScan, dstBase);                \
+                                                                    \
+    mlib_ImageClear(dst, c_arr);                                    \
+}
+
+DEFINE_SET_RECT(SetRect, Any3Byte, 3)
+DEFINE_SET_RECT(SetRect, Any4Byte, 4)
+DEFINE_SET_RECT(SetRect, AnyByte,  1)
+DEFINE_SET_RECT(SetRect, AnyInt,   1)
+DEFINE_SET_RECT(SetRect, AnyShort, 1)
+
+/***************************************************************/
+
+#define XOR_PIX(index, chan)         \
+    dst_ptr[index] ^= pixel##chan
+
+#define DEFINE_XOR_RECT(FUNC, ANYTYPE, NCHAN)                       \
+void ADD_SUFF(ANYTYPE##FUNC)(SurfaceDataRasInfo * pRasInfo,         \
+                             jint lox, jint loy, jint hix,          \
+                             jint hiy, jint pixel,                  \
+                             NativePrimitive * pPrim,               \
+                             CompositeInfo * pCompInfo)             \
+{                                                                   \
+    mlib_image dst[1];                                              \
+    mlib_s32 dstScan = pRasInfo->scanStride;                        \
+    mlib_s32 height = hiy - loy;                                    \
+    mlib_s32 width  = hix - lox;                                    \
+    mlib_u8  *dstBase = (mlib_u8*)(pRasInfo->rasBase);              \
+    mlib_s32 c_arr[4];                                              \
+    mlib_s32 xorpixel = pCompInfo->details.xorPixel;                \
+    mlib_s32 alphamask = pCompInfo->alphaMask;                      \
+                                                                    \
+    pixel = (pixel ^ xorpixel) &~ alphamask;                        \
+                                                                    \
+    dstBase += loy*dstScan + lox*ANYTYPE##PixelStride;              \
+                                                                    \
+    if (width < 8) {                                                \
+        EXTRACT_CONST_##NCHAN(pixel);                               \
+                                                                    \
+        LOOP_DST(ANYTYPE, NCHAN, dstBase, dstScan, XOR_PIX);        \
+        return;                                                     \
+    }                                                               \
+                                                                    \
+    STORE_CONST_##NCHAN(c_arr, pixel);                              \
+                                                                    \
+    MLIB_IMAGE_SET(dst, MLIB_##ANYTYPE, NCHAN,                      \
+                   width, height, dstScan, dstBase);                \
+                                                                    \
+    mlib_ImageConstXor(dst, dst, c_arr);                            \
+}
+
+DEFINE_XOR_RECT(XorRect, Any3Byte, 3)
+DEFINE_XOR_RECT(XorRect, Any4Byte, 4)
+DEFINE_XOR_RECT(XorRect, AnyByte,  1)
+DEFINE_XOR_RECT(XorRect, AnyInt,   1)
+DEFINE_XOR_RECT(XorRect, AnyShort, 1)
+
+/***************************************************************/
+
+#define XOR_COPY(index, chan)         \
+    dst_ptr[index] = dst_ptr[index] ^ src_ptr[index] ^ pixel##chan
+
+#define DEFINE_XOR_COPY(FUNC, ANYTYPE, NCHAN)                  \
+void ADD_SUFF(ANYTYPE##FUNC)(void *srcBase,                    \
+                             void *dstBase,                    \
+                             juint width,                      \
+                             juint height,                     \
+                             SurfaceDataRasInfo *pSrcInfo,     \
+                             SurfaceDataRasInfo *pDstInfo,     \
+                             NativePrimitive *pPrim,           \
+                             CompositeInfo *pCompInfo)         \
+{                                                              \
+    mlib_image src[1], dst[1];                                 \
+    mlib_s32 srcScan = pSrcInfo->scanStride;                   \
+    mlib_s32 dstScan = pDstInfo->scanStride;                   \
+    mlib_s32 c_arr[4];                                         \
+    mlib_s32 pixel  = pCompInfo->details.xorPixel;             \
+                                                               \
+    if (width < 8*sizeof(ANYTYPE##DataType)) {                 \
+        EXTRACT_CONST_##NCHAN(pixel);                          \
+                                                               \
+        LOOP_DST_SRC(ANYTYPE, NCHAN, dstBase, dstScan,         \
+                     srcBase, srcScan, XOR_COPY);              \
+        return;                                                \
+    }                                                          \
+                                                               \
+    STORE_CONST_##NCHAN(c_arr, pixel);                         \
+                                                               \
+    MLIB_IMAGE_SET(src, MLIB_##ANYTYPE, NCHAN,                 \
+                   width, height, srcScan, srcBase);           \
+    MLIB_IMAGE_SET(dst, MLIB_##ANYTYPE, NCHAN,                 \
+                   width, height, dstScan, dstBase);           \
+                                                               \
+    mlib_ImageXor(dst, dst, src);                              \
+    mlib_ImageConstXor(dst, dst, c_arr);                       \
+}
+
+DEFINE_XOR_COPY(IsomorphicXorCopy, Any3Byte, 3)
+DEFINE_XOR_COPY(IsomorphicXorCopy, Any4Byte, 4)
+DEFINE_XOR_COPY(IsomorphicXorCopy, AnyByte,  1)
+DEFINE_XOR_COPY(IsomorphicXorCopy, AnyInt,   1)
+DEFINE_XOR_COPY(IsomorphicXorCopy, AnyShort, 1)
+
+/***************************************************************/
+
+#define DEFINE_SET_SPANS(FUNC, ANYTYPE, NCHAN)                      \
+void ADD_SUFF(ANYTYPE##FUNC)(SurfaceDataRasInfo * pRasInfo,         \
+                             SpanIteratorFuncs * pSpanFuncs,        \
+                             void *siData, jint pixel,              \
+                             NativePrimitive * pPrim,               \
+                             CompositeInfo * pCompInfo)             \
+{                                                                   \
+    mlib_image dst[1];                                              \
+    mlib_s32 dstScan = pRasInfo->scanStride;                        \
+    mlib_s32 height;                                                \
+    mlib_s32 width;                                                 \
+    mlib_u8  *dstBase = (mlib_u8*)(pRasInfo->rasBase), *pdst;       \
+    mlib_s32 c_arr[4];                                              \
+    jint     bbox[4];                                               \
+                                                                    \
+    STORE_CONST_##NCHAN(c_arr, pixel);                              \
+                                                                    \
+    while ((*pSpanFuncs->nextSpan)(siData, bbox)) {                 \
+        mlib_s32 lox = bbox[0];                                     \
+        mlib_s32 loy = bbox[1];                                     \
+        mlib_s32 width  = bbox[2] - lox;                            \
+        mlib_s32 height = bbox[3] - loy;                            \
+                                                                    \
+        pdst = dstBase + loy*dstScan + lox*ANYTYPE##PixelStride;    \
+                                                                    \
+        MLIB_IMAGE_SET(dst, MLIB_##ANYTYPE, NCHAN_##ANYTYPE,        \
+                       width, height, dstScan, pdst);               \
+                                                                    \
+        mlib_ImageClear(dst, c_arr);                                \
+    }                                                               \
+}
+
+DEFINE_SET_SPANS(SetSpans, Any3Byte, 3)
+DEFINE_SET_SPANS(SetSpans, Any4Byte, 4)
+DEFINE_SET_SPANS(SetSpans, AnyByte,  1)
+DEFINE_SET_SPANS(SetSpans, AnyInt,   1)
+DEFINE_SET_SPANS(SetSpans, AnyShort, 1)
+
+/***************************************************************/
+
+#define DEFINE_XOR_SPANS(FUNC, ANYTYPE, NCHAN)                      \
+void ADD_SUFF(ANYTYPE##FUNC)(SurfaceDataRasInfo * pRasInfo,         \
+                             SpanIteratorFuncs * pSpanFuncs,        \
+                             void *siData, jint pixel,              \
+                             NativePrimitive * pPrim,               \
+                             CompositeInfo * pCompInfo)             \
+{                                                                   \
+    mlib_image dst[1];                                              \
+    mlib_s32 dstScan = pRasInfo->scanStride;                        \
+    mlib_s32 height;                                                \
+    mlib_s32 width;                                                 \
+    mlib_u8  *dstBase = (mlib_u8*)(pRasInfo->rasBase), *pdst;       \
+    mlib_s32 c_arr[4];                                              \
+    mlib_s32 xorpixel = pCompInfo->details.xorPixel;                \
+    mlib_s32 alphamask = pCompInfo->alphaMask;                      \
+    jint     bbox[4];                                               \
+                                                                    \
+    pixel = (pixel ^ xorpixel) &~ alphamask;                        \
+                                                                    \
+    STORE_CONST_##NCHAN(c_arr, pixel);                              \
+                                                                    \
+    while ((*pSpanFuncs->nextSpan)(siData, bbox)) {                 \
+        mlib_s32 lox = bbox[0];                                     \
+        mlib_s32 loy = bbox[1];                                     \
+        mlib_s32 width  = bbox[2] - lox;                            \
+        mlib_s32 height = bbox[3] - loy;                            \
+                                                                    \
+        pdst = dstBase + loy*dstScan + lox*ANYTYPE##PixelStride;    \
+                                                                    \
+        MLIB_IMAGE_SET(dst, MLIB_##ANYTYPE, NCHAN_##ANYTYPE,        \
+                       width, height, dstScan, pdst);               \
+                                                                    \
+        mlib_ImageConstXor(dst, dst, c_arr);                        \
+    }                                                               \
+}
+
+DEFINE_XOR_SPANS(XorSpans, Any3Byte, 3)
+DEFINE_XOR_SPANS(XorSpans, Any4Byte, 4)
+DEFINE_XOR_SPANS(XorSpans, AnyByte,  1)
+DEFINE_XOR_SPANS(XorSpans, AnyInt,   1)
+DEFINE_XOR_SPANS(XorSpans, AnyShort, 1)
+
+/***************************************************************/
+
+#define SCALE_COPY(index, chan)         \
+    pDst[chan] = pSrc[index]
+
+#define MLIB_ZOOM_NN_AnyByte  mlib_ImageZoom_U8_1_Nearest(param);
+#define MLIB_ZOOM_NN_Any3Byte mlib_ImageZoom_U8_3_Nearest(param);
+#define MLIB_ZOOM_NN_AnyShort mlib_ImageZoom_S16_1_Nearest(param);
+#define MLIB_ZOOM_NN_AnyInt   mlib_ImageZoom_S32_1_Nearest(param);
+
+#define MLIB_ZOOM_NN_Any4Byte                                      \
+{                                                                  \
+    mlib_s32 b_align = (mlib_s32)srcBase | (mlib_s32)dstBase |     \
+                       srcScan | dstScan;                          \
+                                                                   \
+    if (!(b_align & 3)) {                                          \
+        mlib_ImageZoom_S32_1_Nearest(param);                       \
+    } else if (!(b_align & 1)) {                                   \
+        mlib_ImageZoom_S16_2_Nearest(param);                       \
+    } else {                                                       \
+        mlib_ImageZoom_U8_4_Nearest(param);                        \
+    }                                                              \
+}
+
+#define DEFINE_ISO_SCALE(FUNC, ANYTYPE, NCHAN)                     \
+void ADD_SUFF(ANYTYPE##FUNC)(void *srcBase, void *dstBase,         \
+                             juint width, juint height,            \
+                             jint sxloc, jint syloc,               \
+                             jint sxinc, jint syinc,               \
+                             jint shift,                           \
+                             SurfaceDataRasInfo *pSrcInfo,         \
+                             SurfaceDataRasInfo *pDstInfo,         \
+                             NativePrimitive *pPrim,               \
+                             CompositeInfo *pCompInfo)             \
+{                                                                  \
+    mlib_work_image param[1];                                      \
+    mlib_clipping current[1];                                      \
+    mlib_s32 srcScan = pSrcInfo->scanStride;                       \
+    mlib_s32 dstScan = pDstInfo->scanStride;                       \
+                                                                   \
+    if (width <= 32) {                                             \
+        ANYTYPE##DataType *pSrc;                                   \
+        ANYTYPE##DataType *pDst = dstBase;                         \
+        dstScan -= (width) * ANYTYPE##PixelStride;                 \
+                                                                   \
+        do {                                                       \
+            juint w = width;                                       \
+            jint  tmpsxloc = sxloc;                                \
+            pSrc = srcBase;                                        \
+            PTR_ADD(pSrc, (syloc >> shift) * srcScan);             \
+            do {                                                   \
+                jint i = (tmpsxloc >> shift);                      \
+                PROCESS_PIX_##NCHAN(SCALE_COPY);                   \
+                pDst += NCHAN;                                     \
+                tmpsxloc += sxinc;                                 \
+            }                                                      \
+            while (--w > 0);                                       \
+            PTR_ADD(pDst, dstScan);                                \
+            syloc += syinc;                                        \
+        }                                                          \
+        while (--height > 0);                                      \
+        return;                                                    \
+    }                                                              \
+                                                                   \
+    param->current = current;                                      \
+                                                                   \
+    if (shift <= MLIB_SHIFT /* 16 */) {                            \
+        jint dshift = MLIB_SHIFT - shift;                          \
+        sxloc <<= dshift;                                          \
+        syloc <<= dshift;                                          \
+        sxinc <<= dshift;                                          \
+        syinc <<= dshift;                                          \
+    } else {                                                       \
+        jint dshift = shift - MLIB_SHIFT;                          \
+        sxloc >>= dshift;                                          \
+        syloc >>= dshift;                                          \
+        sxinc >>= dshift;                                          \
+        syinc >>= dshift;                                          \
+    }                                                              \
+                                                                   \
+    current->width  = width;                                       \
+    current->height = height;                                      \
+    param->DX = sxinc;                                             \
+    param->DY = syinc;                                             \
+    param->src_stride = srcScan;                                   \
+    param->dst_stride = dstScan;                                   \
+    current->srcX = sxloc;                                         \
+    current->srcY = syloc;                                         \
+    current->sp = (mlib_u8*)srcBase                                \
+          + (sxloc >> MLIB_SHIFT)*ANYTYPE##PixelStride             \
+          + (syloc >> MLIB_SHIFT)*srcScan;                         \
+    current->dp = dstBase;                                         \
+                                                                   \
+    MLIB_ZOOM_NN_##ANYTYPE                                         \
+}
+
+DEFINE_ISO_SCALE(IsomorphicScaleCopy, Any3Byte, 3)
+DEFINE_ISO_SCALE(IsomorphicScaleCopy, Any4Byte, 4)
+DEFINE_ISO_SCALE(IsomorphicScaleCopy, AnyByte,  1)
+DEFINE_ISO_SCALE(IsomorphicScaleCopy, AnyInt,   1)
+DEFINE_ISO_SCALE(IsomorphicScaleCopy, AnyShort, 1)
+
+/***************************************************************/
+
+#endif /* JAVA2D_NO_MLIB */