0N/A/*
2362N/A * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A#if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF)
0N/A
0N/A#include <vis_proto.h>
0N/A#include "java2d_Mlib.h"
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define ARGB_XOR(index, chan) \
0N/A{ \
0N/A jint srcpixel = src_ptr[index]; \
0N/A jint neg_mask = srcpixel >> 31; \
0N/A dst_ptr[index] ^= (srcpixel ^ xorpixel) & (neg_mask &~ alphamask); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define BGR_XOR(index, chan) \
0N/A{ \
0N/A jint srcpixel = src_ptr[index]; \
0N/A jint neg_mask = srcpixel >> 31; \
0N/A srcpixel = (srcpixel << 16) | (srcpixel & 0xff00) | \
0N/A ((srcpixel >> 16) & 0xff); \
0N/A dst_ptr[index] ^= (srcpixel ^ xorpixel) & (neg_mask &~ alphamask); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define ARGB_BM_XOR(index, chan) \
0N/A{ \
0N/A jint srcpixel = src_ptr[index]; \
0N/A jint neg_mask = srcpixel >> 31; \
0N/A srcpixel |= 0xFF000000; \
0N/A dst_ptr[index] ^= (srcpixel ^ xorpixel) & (neg_mask &~ alphamask); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define RGBX_XOR(index, chan) \
0N/A{ \
0N/A jint srcpixel = src_ptr[index]; \
0N/A jint neg_mask = srcpixel >> 31; \
0N/A dst_ptr[index] ^= ((srcpixel << 8) ^ xorpixel) & \
0N/A (neg_mask &~ alphamask); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define ARGB_to_GBGR_FL2(dst, src0, src1) { \
0N/A mlib_d64 t0, t1, t2; \
0N/A t0 = vis_fpmerge(src0, src1); \
0N/A t1 = vis_fpmerge(vis_read_lo(t0), vis_read_hi(t0)); \
0N/A t2 = vis_fpmerge(vis_read_lo(t0), vis_read_lo(t0)); \
0N/A dst = vis_fpmerge(vis_read_hi(t2), vis_read_lo(t1)); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#ifdef MLIB_ADD_SUFF
0N/A#pragma weak IntArgbToIntRgbXorBlit_F = IntArgbToIntArgbXorBlit_F
0N/A#else
0N/A#pragma weak IntArgbToIntRgbXorBlit = IntArgbToIntArgbXorBlit
0N/A#endif
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntArgbXorBlit)(BLIT_PARAMS)
0N/A{
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 xorpixel = pCompInfo->details.xorPixel;
0N/A mlib_s32 alphamask = pCompInfo->alphaMask;
0N/A mlib_s32 i, j;
0N/A mlib_d64 res, xorpixel64, alphamask64, dzero;
0N/A
0N/A if (width < 8) {
0N/A LOOP_DST_SRC(AnyInt, 1, dstBase, dstScan, srcBase, srcScan, ARGB_XOR);
0N/A return;
0N/A }
0N/A
0N/A if (dstScan == 4*width && srcScan == dstScan) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A xorpixel64 = vis_to_double_dup(xorpixel);
0N/A alphamask64 = vis_to_double_dup(alphamask);
0N/A dzero = vis_fzero();
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_s32 *dst_ptr = dstBase;
0N/A mlib_s32 *src_ptr = srcBase;
0N/A mlib_s32 size = width;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A ARGB_XOR(0, 0);
0N/A dst_ptr++;
0N/A src_ptr++;
0N/A size--;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i <= size - 2; i += 2) {
0N/A mlib_s32 neg_mask;
0N/A mlib_f32 *pp0 = (mlib_f32*)src_ptr + i;
0N/A mlib_f32 *pp1 = (mlib_f32*)src_ptr + i + 1;
0N/A neg_mask = (((*(mlib_u8*)pp0) >> 6) & 2) | ((*(mlib_u8*)pp1) >> 7);
0N/A res = vis_freg_pair(*pp0, *pp1);
0N/A res = vis_fxor(res, xorpixel64);
0N/A res = vis_fandnot(alphamask64, res);
0N/A res = vis_fxor(res, *(mlib_d64*)(dst_ptr + i));
0N/A vis_pst_32(res, dst_ptr + i, neg_mask);
0N/A }
0N/A
0N/A if (i < size) {
0N/A ARGB_XOR(i, 0);
0N/A }
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntBgrXorBlit)(BLIT_PARAMS)
0N/A{
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 xorpixel = pCompInfo->details.xorPixel;
0N/A mlib_s32 alphamask = pCompInfo->alphaMask;
0N/A mlib_s32 i, j;
0N/A mlib_d64 res, xorpixel64, alphamask64, dzero;
0N/A
0N/A if (width < 8) {
0N/A LOOP_DST_SRC(AnyInt, 1, dstBase, dstScan, srcBase, srcScan, BGR_XOR);
0N/A return;
0N/A }
0N/A
0N/A if (dstScan == 4*width && srcScan == dstScan) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A xorpixel64 = vis_to_double_dup(xorpixel);
0N/A alphamask64 = vis_to_double_dup(alphamask);
0N/A dzero = vis_fzero();
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_s32 *dst_ptr = dstBase;
0N/A mlib_s32 *src_ptr = srcBase;
0N/A mlib_s32 size = width;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A BGR_XOR(0, 0);
0N/A dst_ptr++;
0N/A src_ptr++;
0N/A size--;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i <= size - 2; i += 2) {
0N/A mlib_s32 neg_mask;
0N/A mlib_f32 *pp0 = (mlib_f32*)src_ptr + i;
0N/A mlib_f32 *pp1 = (mlib_f32*)src_ptr + i + 1;
0N/A neg_mask = (((*(mlib_u8*)pp0) >> 6) & 2) | ((*(mlib_u8*)pp1) >> 7);
0N/A ARGB_to_GBGR_FL2(res, *pp0, *pp1);
0N/A res = vis_fxor(res, xorpixel64);
0N/A res = vis_fandnot(alphamask64, res);
0N/A res = vis_fxor(res, *(mlib_d64*)(dst_ptr + i));
0N/A vis_pst_32(res, dst_ptr + i, neg_mask);
0N/A }
0N/A
0N/A if (i < size) {
0N/A BGR_XOR(i, 0);
0N/A }
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntArgbBmXorBlit)(BLIT_PARAMS)
0N/A{
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 xorpixel = pCompInfo->details.xorPixel;
0N/A mlib_s32 alphamask = pCompInfo->alphaMask;
0N/A mlib_s32 i, j, neg_mask;
0N/A mlib_d64 res, xorpixel64, alphamask64, dzero, dFF;
0N/A
0N/A if (width < 8) {
0N/A LOOP_DST_SRC(AnyInt, 1, dstBase, dstScan, srcBase, srcScan,
0N/A ARGB_BM_XOR);
0N/A return;
0N/A }
0N/A
0N/A if (dstScan == 4*width && srcScan == dstScan) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A xorpixel64 = vis_to_double_dup(xorpixel);
0N/A alphamask64 = vis_to_double_dup(alphamask);
0N/A dzero = vis_fzero();
0N/A dFF = vis_to_double_dup(0xFF000000);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_s32 *dst_ptr = dstBase;
0N/A mlib_s32 *src_ptr = srcBase;
0N/A mlib_s32 size = width;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A ARGB_BM_XOR(0, 0);
0N/A dst_ptr++;
0N/A src_ptr++;
0N/A size--;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i <= size - 2; i += 2) {
0N/A mlib_s32 neg_mask;
0N/A mlib_f32 *pp0 = (mlib_f32*)src_ptr + i;
0N/A mlib_f32 *pp1 = (mlib_f32*)src_ptr + i + 1;
0N/A neg_mask = (((*(mlib_u8*)pp0) >> 6) & 2) | ((*(mlib_u8*)pp1) >> 7);
0N/A res = vis_freg_pair(*pp0, *pp1);
0N/A res = vis_for(res, dFF);
0N/A res = vis_fxor(res, xorpixel64);
0N/A res = vis_fandnot(alphamask64, res);
0N/A res = vis_fxor(res, *(mlib_d64*)(dst_ptr + i));
0N/A vis_pst_32(res, dst_ptr + i, neg_mask);
0N/A }
0N/A
0N/A if (i < size) {
0N/A ARGB_BM_XOR(i, 0);
0N/A }
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntRgbxXorBlit)(BLIT_PARAMS)
0N/A{
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 xorpixel = pCompInfo->details.xorPixel;
0N/A mlib_s32 alphamask = pCompInfo->alphaMask;
0N/A mlib_s32 i, j, neg_mask;
0N/A mlib_d64 res, xorpixel64, alphamask64, rgbx_mask, dzero;
0N/A
0N/A if (width < 8) {
0N/A LOOP_DST_SRC(AnyInt, 1, dstBase, dstScan, srcBase, srcScan, RGBX_XOR);
0N/A return;
0N/A }
0N/A
0N/A if (dstScan == 4*width && srcScan == dstScan) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A xorpixel64 = vis_to_double_dup(xorpixel);
0N/A alphamask64 = vis_to_double_dup(alphamask);
0N/A rgbx_mask = vis_to_double_dup(0xFFFFFF00);
0N/A dzero = vis_fzero();
0N/A
0N/A vis_alignaddr(NULL, 1);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_s32 *dst_ptr = dstBase;
0N/A mlib_s32 *src_ptr = srcBase;
0N/A mlib_s32 size = width;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A RGBX_XOR(0, 0);
0N/A dst_ptr++;
0N/A src_ptr++;
0N/A size--;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i <= size - 2; i += 2) {
0N/A mlib_s32 neg_mask;
0N/A mlib_f32 *pp0 = (mlib_f32*)src_ptr + i;
0N/A mlib_f32 *pp1 = (mlib_f32*)src_ptr + i + 1;
0N/A neg_mask = (((*(mlib_u8*)pp0) >> 6) & 2) | ((*(mlib_u8*)pp1) >> 7);
0N/A res = vis_freg_pair(*pp0, *pp1);
0N/A res = vis_fand(vis_faligndata(res, res), rgbx_mask);
0N/A res = vis_fxor(res, xorpixel64);
0N/A res = vis_fandnot(alphamask64, res);
0N/A res = vis_fxor(res, *(mlib_d64*)(dst_ptr + i));
0N/A vis_pst_32(res, dst_ptr + i, neg_mask);
0N/A }
0N/A
0N/A if (i < size) {
0N/A RGBX_XOR(i, 0);
0N/A }
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToFourByteAbgrPreXorBlit)(BLIT_PARAMS)
0N/A{
0N/A jint xorpixel = pCompInfo->details.xorPixel;
0N/A juint alphamask = pCompInfo->alphaMask;
0N/A jint xor0, xor1, xor2, xor3;
0N/A jint mask0, mask1, mask2, mask3;
0N/A jint *pSrc = srcBase;
0N/A jubyte *pDst = dstBase;
0N/A jint srcScan = pSrcInfo->scanStride;
0N/A jint dstScan = pDstInfo->scanStride;
0N/A
0N/A xor0 = xorpixel;
0N/A xor1 = xorpixel >> 8;
0N/A xor2 = xorpixel >> 16;
0N/A xor3 = xorpixel >> 24;
0N/A mask0 = alphamask;
0N/A mask1 = alphamask >> 8;
0N/A mask2 = alphamask >> 16;
0N/A mask3 = alphamask >> 24;
0N/A
0N/A srcScan -= width * 4;
0N/A dstScan -= width * 4;
0N/A
0N/A do {
0N/A juint w = width;;
0N/A do {
0N/A jint srcpixel;
0N/A jint a, r, g, b;
0N/A
0N/A srcpixel = pSrc[0];
0N/A b = srcpixel & 0xff;
0N/A g = (srcpixel >> 8) & 0xff;
0N/A r = (srcpixel >> 16) & 0xff;
0N/A a = (mlib_u32)srcpixel >> 24;
0N/A
0N/A if (srcpixel < 0) {
0N/A r = mul8table[a][r];
0N/A g = mul8table[a][g];
0N/A b = mul8table[a][b];
0N/A
0N/A pDst[0] ^= (a ^ xor0) & ~mask0;
0N/A pDst[1] ^= (b ^ xor1) & ~mask1;
0N/A pDst[2] ^= (g ^ xor2) & ~mask2;
0N/A pDst[3] ^= (r ^ xor3) & ~mask3;
0N/A }
0N/A pSrc = ((void *) (((intptr_t) (pSrc)) + (4)));
0N/A pDst = ((void *) (((intptr_t) (pDst)) + (4)));;
0N/A }
0N/A while (--w > 0);
0N/A pSrc = ((void *) (((intptr_t) (pSrc)) + (srcScan)));
0N/A pDst = ((void *) (((intptr_t) (pDst)) + (dstScan)));;
0N/A }
0N/A while (--height > 0);
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#endif