/* * Copyright (c) 2003, 2010, 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. */ #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 DEFINE_SET_PGRAM(FUNC, ANYTYPE, NCHAN) \ void ADD_SUFF(ANYTYPE##FUNC)(SurfaceDataRasInfo *pRasInfo, \ jint lox, jint loy, \ jint hix, jint hiy, \ jlong leftx, jlong dleftx, \ jlong rightx, jlong drightx, \ jint pixel, NativePrimitive * pPrim, \ CompositeInfo * pCompInfo) \ { \ mlib_image dst[1]; \ mlib_s32 dstScan = pRasInfo->scanStride; \ mlib_u8 *dstBase = (mlib_u8*)(pRasInfo->rasBase), *pdst; \ mlib_s32 c_arr[4]; \ \ STORE_CONST_##NCHAN(c_arr, pixel); \ pdst = dstBase + loy*dstScan; \ \ while (loy < hiy) { \ jint lx = WholeOfLong(leftx); \ jint rx = WholeOfLong(rightx); \ if (lx < lox) lx = lox; \ if (rx > hix) rx = hix; \ \ MLIB_IMAGE_SET(dst, MLIB_##ANYTYPE, NCHAN_##ANYTYPE, \ rx-lx, 1, dstScan, \ pdst + lx*ANYTYPE##PixelStride); \ \ mlib_ImageClear(dst, c_arr); \ \ pdst = PtrAddBytes(pdst, dstScan); \ leftx += dleftx; \ rightx += drightx; \ loy++; \ } \ } DEFINE_SET_PGRAM(SetParallelogram, Any3Byte, 3) DEFINE_SET_PGRAM(SetParallelogram, Any4Byte, 4) DEFINE_SET_PGRAM(SetParallelogram, AnyByte, 1) DEFINE_SET_PGRAM(SetParallelogram, AnyInt, 1) DEFINE_SET_PGRAM(SetParallelogram, 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 */