0N/A/*
3909N/A * Copyright (c) 2003, 2010, 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_AlphaMacros.h"
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbPreAlphaMaskFill()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 srcF, dstF; \
0N/A \
0N/A srcF = ((dstA & ConstAnd) ^ ConstXor) + ConstAdd; \
0N/A srcF = MUL8_INT(srcF, pathA); \
0N/A dstF = mul8_cnstF[pathA] + (255 - pathA); \
0N/A \
0N/A t0 = MUL8_VIS(cnstARGB0, srcF); \
0N/A t1 = MUL8_VIS(dstARGB, dstF); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid IntArgbPreAlphaMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_s32 *log_val,
0N/A mlib_u8 *mul8_cnstF,
0N/A mlib_u8 *mul8_tbl);
0N/A
0N/A#pragma no_inline(IntArgbPreAlphaMaskFill_line)
0N/A
0N/Avoid IntArgbPreAlphaMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_s32 *log_val,
0N/A mlib_u8 *mul8_cnstF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0;
0N/A mlib_s32 ConstAnd, ConstXor, ConstAdd;
0N/A
0N/A ConstAnd = log_val[0];
0N/A ConstXor = log_val[1];
0N/A ConstAdd = log_val[2];
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A pathA0 = pMask[i];
0N/A pathA1 = pMask[i + 1];
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstA1 = *(mlib_u8*)(dst_ptr + i + 1);
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB));
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A msk = (((-pathA0) & (1 << 11)) | ((-pathA1) & (1 << 10))) >> 10;
0N/A vis_pst_32(res0, dst_ptr + i, msk);
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, cnstF, dstA, dstARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 srcF, dstF; \
0N/A \
0N/A srcF = ((dstA & ConstAnd) ^ ConstXor) + ConstAdd; \
0N/A dstF = cnstF; \
0N/A \
0N/A t0 = MUL8_VIS(cnstARGB0, srcF); \
0N/A t1 = MUL8_VIS(dstARGB, dstF); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid IntArgPrebAlphaMaskFill_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_s32 width,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_s32 *log_val,
0N/A mlib_s32 cnstF);
0N/A
0N/A#pragma no_inline(IntArgPrebAlphaMaskFill_A1_line)
0N/A
0N/Avoid IntArgPrebAlphaMaskFill_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_s32 width,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_s32 *log_val,
0N/A mlib_s32 cnstF)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 dstA0, dstA1;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0;
0N/A mlib_s32 ConstAnd, ConstXor, ConstAdd;
0N/A
0N/A ConstAnd = log_val[0];
0N/A ConstXor = log_val[1];
0N/A ConstAdd = log_val[2];
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, cnstF, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstA1 = *(mlib_u8*)(dst_ptr + i + 1);
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A
0N/A MASK_FILL(res0, cnstF, dstA0, vis_read_hi(dstARGB));
0N/A MASK_FILL(res1, cnstF, dstA1, vis_read_lo(dstARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A *(mlib_d64*)(dst_ptr + i) = res0;
0N/A }
0N/A
0N/A if (i < width) {
0N/A {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, cnstF, dstA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbPreAlphaMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_u8 *mul8_cnstF;
0N/A mlib_s32 SrcOpAnd, SrcOpXor, SrcOpAdd;
0N/A mlib_s32 DstOpAnd, DstOpXor, DstOpAdd;
0N/A mlib_s32 dstFbase;
0N/A mlib_s32 log_val[3];
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8table[cnstA][cnstR];
0N/A cnstG = mul8table[cnstA][cnstG];
0N/A cnstB = mul8table[cnstA][cnstB];
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB);
0N/A
0N/A SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;
0N/A SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;
0N/A SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;
0N/A SrcOpAdd -= SrcOpXor;
0N/A
0N/A log_val[0] = SrcOpAnd;
0N/A log_val[1] = SrcOpXor;
0N/A log_val[2] = SrcOpAdd;
0N/A
0N/A DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;
0N/A DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;
0N/A DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;
0N/A DstOpAdd -= DstOpXor;
0N/A
0N/A dstFbase = (((cnstA) & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A
0N/A mul8_cnstF = mul8table[dstFbase];
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A if (rasScan == 4*width && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbPreAlphaMaskFill_line(rasBase, pMask, width, cnstARGB0,
0N/A log_val, mul8_cnstF,
0N/A (void*)mul8table);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A if (rasScan == 4*width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgPrebAlphaMaskFill_A1_line(rasBase, width, cnstARGB0,
0N/A log_val, dstFbase);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(FourByteAbgrPreAlphaMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff, *p_dst;
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_u8 *mul8_cnstF;
0N/A mlib_s32 SrcOpAnd, SrcOpXor, SrcOpAdd;
0N/A mlib_s32 DstOpAnd, DstOpXor, DstOpAdd;
0N/A mlib_s32 dstFbase;
0N/A mlib_s32 log_val[3];
0N/A mlib_s32 j;
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8table[cnstA][cnstR];
0N/A cnstG = mul8table[cnstA][cnstG];
0N/A cnstB = mul8table[cnstA][cnstB];
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR);
0N/A
0N/A SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;
0N/A SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;
0N/A SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;
0N/A SrcOpAdd -= SrcOpXor;
0N/A
0N/A log_val[0] = SrcOpAnd;
0N/A log_val[1] = SrcOpXor;
0N/A log_val[2] = SrcOpAdd;
0N/A
0N/A DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;
0N/A DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;
0N/A DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;
0N/A DstOpAdd -= DstOpXor;
0N/A
0N/A dstFbase = (((cnstA) & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A
0N/A mul8_cnstF = mul8table[dstFbase];
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A if ((mlib_s32)rasBase & 3) {
0N/A mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32));
0N/A p_dst = pbuff;
0N/A } else {
0N/A p_dst = rasBase;
0N/A }
0N/A
0N/A IntArgbPreAlphaMaskFill_line(p_dst, pMask, width, cnstARGB0,
0N/A log_val, mul8_cnstF,
0N/A (void*)mul8table);
0N/A
0N/A if (p_dst != rasBase) {
0N/A mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A for (j = 0; j < height; j++) {
0N/A if ((mlib_s32)rasBase & 3) {
0N/A mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32));
0N/A p_dst = pbuff;
0N/A } else {
0N/A p_dst = rasBase;
0N/A }
0N/A
0N/A IntArgPrebAlphaMaskFill_A1_line(p_dst, width, cnstARGB0,
0N/A log_val, dstFbase);
0N/A
0N/A if (p_dst != rasBase) {
0N/A mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A }
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbPreSrcMaskFill()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A \
0N/A t0 = MUL8_VIS(cnstARGB0, pathA); \
0N/A t1 = MUL8_VIS(dstARGB, (0xff - pathA)); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid IntArgbPreSrcMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_d64 fgARGB,
0N/A mlib_f32 cnstARGB0);
0N/A
0N/A#pragma no_inline(IntArgbPreSrcMaskFill_line)
0N/A
0N/Avoid IntArgbPreSrcMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_d64 fgARGB,
0N/A mlib_f32 cnstARGB0)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A if (pathA0 == 0xff) {
0N/A dst_ptr[i] = vis_read_hi(fgARGB);
0N/A } else if (pathA0) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A pathA0 = pMask[i];
0N/A pathA1 = pMask[i + 1];
0N/A
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A
0N/A msk = (((254 - pathA0) & (1 << 11)) |
0N/A ((254 - pathA1) & (1 << 10))) >> 10;
0N/A
0N/A MASK_FILL(res0, pathA0, vis_read_hi(dstARGB));
0N/A MASK_FILL(res1, pathA1, vis_read_lo(dstARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A *(mlib_d64*)(dst_ptr + i) = res0;
0N/A
0N/A vis_pst_32(fgARGB, dst_ptr + i, msk);
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A if (pathA0 == 0xff) {
0N/A dst_ptr[i] = vis_read_hi(fgARGB);
0N/A } else if (pathA0) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbPreSrcMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 fgARGB;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA != 0xff) {
0N/A#ifdef LOOPS_OLD_VERSION
0N/A if (cnstA == 0) return;
0N/A#endif
0N/A cnstR = mul8table[cnstA][cnstR];
0N/A cnstG = mul8table[cnstA][cnstG];
0N/A cnstB = mul8table[cnstA][cnstB];
0N/A }
0N/A
0N/A if (pMask == NULL) {
0N/A#ifdef LOOPS_OLD_VERSION
0N/A ADD_SUFF(AnyIntSetRect)(pRasInfo, 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
0N/A#else
3265N/A void *pBase = pRasInfo->rasBase;
3265N/A pRasInfo->rasBase = rasBase;
0N/A if (cnstA != 0xff) {
0N/A fgColor = (cnstA << 24) | (cnstR << 16) | (cnstG << 8) | cnstB;
0N/A }
0N/A ADD_SUFF(AnyIntSetRect)(pRasInfo,
3265N/A 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
3265N/A pRasInfo->rasBase = pBase;
0N/A#endif
0N/A return;
0N/A }
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB);
0N/A
0N/A fgARGB = vis_to_double_dup(fgColor);
0N/A
0N/A pMask += maskOff;
0N/A
0N/A if (rasScan == 4*width && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbPreSrcMaskFill_line(rasBase, pMask, width, fgARGB, cnstARGB0);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(FourByteAbgrPreSrcMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff, *p_dst;
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 fgARGB;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA != 0xff) {
0N/A cnstR = mul8table[cnstA][cnstR];
0N/A cnstG = mul8table[cnstA][cnstG];
0N/A cnstB = mul8table[cnstA][cnstB];
0N/A }
0N/A
0N/A if (pMask == NULL) {
3265N/A void *pBase = pRasInfo->rasBase;
3265N/A pRasInfo->rasBase = rasBase;
0N/A fgColor = (cnstR << 24) | (cnstG << 16) | (cnstB << 8) | cnstA;
0N/A ADD_SUFF(Any4ByteSetRect)(pRasInfo,
3265N/A 0, 0, width, height,
0N/A fgColor, pPrim, pCompInfo);
3265N/A pRasInfo->rasBase = pBase;
0N/A return;
0N/A }
0N/A
0N/A fgColor = (cnstA << 24) | (cnstB << 16) | (cnstG << 8) | cnstR;
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR);
0N/A
0N/A fgARGB = vis_to_double_dup(fgColor);
0N/A
0N/A pMask += maskOff;
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A if ((mlib_s32)rasBase & 3) {
0N/A mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32));
0N/A p_dst = pbuff;
0N/A } else {
0N/A p_dst = rasBase;
0N/A }
0N/A
0N/A IntArgbPreSrcMaskFill_line(p_dst, pMask, width, fgARGB, cnstARGB0);
0N/A
0N/A if (p_dst != rasBase) {
0N/A mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbPreSrcOverMaskFill()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 dstA; \
0N/A \
0N/A dstA = 0xff - mul8_cnstA[pathA]; \
0N/A \
0N/A t0 = MUL8_VIS(cnstARGB0, pathA); \
0N/A t1 = MUL8_VIS(dstARGB, dstA); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbPreSrcOverMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_u8 *mul8_cnstA);
0N/A
0N/A#pragma no_inline(IntArgbPreSrcOverMaskFill_line)
0N/A
0N/Astatic void IntArgbPreSrcOverMaskFill_line(mlib_f32 *dst_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_f32 cnstARGB0,
0N/A mlib_u8 *mul8_cnstA)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A pathA0 = pMask[i];
0N/A pathA1 = pMask[i + 1];
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A
0N/A MASK_FILL(res0, pathA0, vis_read_hi(dstARGB));
0N/A MASK_FILL(res1, pathA1, vis_read_lo(dstARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A *(mlib_d64 *)(dst_ptr + i) = res0;
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A
0N/A if (pathA0) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, dstARGB) \
0N/A{ \
0N/A rr = MUL8_VIS(dstARGB, cnstA); \
0N/A rr = vis_fpadd16(rr, cnstARGB); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbPreSrcOverMaskFill_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_s32 width,
0N/A mlib_d64 cnstARGB,
0N/A mlib_s32 cnstA);
0N/A
0N/A#pragma no_inline(IntArgbPreSrcOverMaskFill_A1_line)
0N/A
0N/Astatic void IntArgbPreSrcOverMaskFill_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_s32 width,
0N/A mlib_d64 cnstARGB,
0N/A mlib_s32 cnstA)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0;
0N/A
0N/A cnstA = 0xff - cnstA;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A
0N/A MASK_FILL(res0, vis_read_hi(dstARGB));
0N/A MASK_FILL(res1, vis_read_lo(dstARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A *(mlib_d64*)(dst_ptr + i) = res0;
0N/A }
0N/A
0N/A if (i < width) {
0N/A dstARGB0 = dst_ptr[i];
0N/A MASK_FILL(res0, dstARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbPreSrcOverMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 cnstARGB;
0N/A mlib_u8 *mul8_cnstA;
0N/A mlib_s32 j;
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA != 0xff) {
0N/A if (cnstA == 0) return;
0N/A
0N/A cnstR = mul8table[cnstA][cnstR];
0N/A cnstG = mul8table[cnstA][cnstG];
0N/A cnstB = mul8table[cnstA][cnstB];
0N/A }
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A if (rasScan == 4*width && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A mul8_cnstA = mul8table[cnstA];
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbPreSrcOverMaskFill_line(rasBase, pMask, width, cnstARGB0,
0N/A mul8_cnstA);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A if (rasScan == 4*width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A cnstARGB = vis_to_double((cnstA << 23) | (cnstR << 7),
0N/A (cnstG << 23) | (cnstB << 7));
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbPreSrcOverMaskFill_A1_line(rasBase, width, cnstARGB, cnstA);
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(FourByteAbgrPreSrcOverMaskFill)(void *rasBase,
0N/A jubyte *pMask,
0N/A jint maskOff,
0N/A jint maskScan,
0N/A jint width,
0N/A jint height,
0N/A jint fgColor,
0N/A SurfaceDataRasInfo *pRasInfo,
0N/A NativePrimitive *pPrim,
0N/A CompositeInfo *pCompInfo)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff, *p_dst;
0N/A mlib_s32 cnstA, cnstR, cnstG, cnstB;
0N/A mlib_s32 rasScan = pRasInfo->scanStride;
0N/A mlib_f32 cnstARGB0;
0N/A mlib_d64 cnstARGB;
0N/A mlib_u8 *mul8_cnstA;
0N/A mlib_s32 j;
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A cnstA = (fgColor >> 24) & 0xff;
0N/A cnstR = (fgColor >> 16) & 0xff;
0N/A cnstG = (fgColor >> 8) & 0xff;
0N/A cnstB = (fgColor ) & 0xff;
0N/A
0N/A if (cnstA != 0xff) {
0N/A if (cnstA == 0) return;
0N/A
0N/A cnstR = mul8table[cnstA][cnstR];
0N/A cnstG = mul8table[cnstA][cnstG];
0N/A cnstB = mul8table[cnstA][cnstB];
0N/A }
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A mul8_cnstA = mul8table[cnstA];
0N/A
0N/A cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A if ((mlib_s32)rasBase & 3) {
0N/A mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32));
0N/A p_dst = pbuff;
0N/A } else {
0N/A p_dst = rasBase;
0N/A }
0N/A
0N/A IntArgbPreSrcOverMaskFill_line(p_dst, pMask, width, cnstARGB0,
0N/A mul8_cnstA);
0N/A
0N/A if (p_dst != rasBase) {
0N/A mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A cnstARGB = vis_to_double((cnstA << 23) | (cnstB << 7),
0N/A (cnstG << 23) | (cnstR << 7));
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A if ((mlib_s32)rasBase & 3) {
0N/A mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32));
0N/A p_dst = pbuff;
0N/A } else {
0N/A p_dst = rasBase;
0N/A }
0N/A
0N/A IntArgbPreSrcOverMaskFill_A1_line(p_dst, width, cnstARGB, cnstA);
0N/A
0N/A if (p_dst != rasBase) {
0N/A mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(rasBase, rasScan);
0N/A }
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbToIntArgbPreSrcOverMaskBlit()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 dstF; \
0N/A \
0N/A srcA = MUL8_INT(mul8_extra[pathA], srcA); \
0N/A dstF = 0xff - srcA; \
0N/A \
0N/A t0 = MUL8_VIS(srcARGB, srcA); \
0N/A t1 = MUL8_VIS(dstARGB, dstF); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntArgbPreSrcOverMaskBlit_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_u8 *mul8_extra,
0N/A mlib_u8 *mul8_tbl);
0N/A
0N/A#pragma no_inline(IntArgbToIntArgbPreSrcOverMaskBlit_line)
0N/A
0N/Astatic void IntArgbToIntArgbPreSrcOverMaskBlit_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_u8 *mul8_extra,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, srcA0, srcA1;
0N/A mlib_d64 res0, res1, dstARGB, srcARGB;
0N/A mlib_f32 dstARGB0, srcARGB0;
0N/A mlib_d64 or_alpha = vis_to_double_dup(0xff000000);
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0);
0N/A MASK_FILL(res0, pathA0, dstARGB0, srcA0, srcARGB0);
0N/A if (srcA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A pathA0 = pMask[i];
0N/A pathA1 = pMask[i + 1];
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A srcA1 = *(mlib_u8*)(src_ptr + i + 1);
0N/A srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);
0N/A srcARGB = vis_for(or_alpha, srcARGB);
0N/A
0N/A MASK_FILL(res0, pathA0, vis_read_hi(dstARGB),
0N/A srcA0, vis_read_hi(srcARGB));
0N/A MASK_FILL(res1, pathA1, vis_read_lo(dstARGB),
0N/A srcA1, vis_read_lo(srcARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A *(mlib_d64*)(dst_ptr + i) = res0;
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0);
0N/A MASK_FILL(res0, pathA0, dstARGB0, srcA0, srcARGB0);
0N/A if (srcA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 dstF; \
0N/A \
0N/A srcA = mul8_extra[srcA]; \
0N/A dstF = 0xff - srcA; \
0N/A \
0N/A t0 = MUL8_VIS(srcARGB, srcA); \
0N/A t1 = MUL8_VIS(dstARGB, dstF); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_s32 width,
0N/A mlib_u8 *mul8_extra);
0N/A
0N/A#pragma no_inline(IntArgbToIntArgbPreSrcOverMaskBlit_A1_line)
0N/A
0N/Astatic void IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_s32 width,
0N/A mlib_u8 *mul8_extra)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 srcA0, srcA1;
0N/A mlib_d64 res0, res1, dstARGB, srcARGB;
0N/A mlib_f32 dstARGB0, srcARGB0;
0N/A mlib_d64 or_alpha = vis_to_double_dup(0xff000000);
0N/A
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0);
0N/A MASK_FILL(res0, dstARGB0, srcA0, srcARGB0);
0N/A if (srcA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A
0N/A i0 = 1;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = i0; i <= width - 2; i += 2) {
0N/A dstARGB = *(mlib_d64*)(dst_ptr + i);
0N/A srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A srcA1 = *(mlib_u8*)(src_ptr + i + 1);
0N/A srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);
0N/A srcARGB = vis_for(or_alpha, srcARGB);
0N/A
0N/A MASK_FILL(res0, vis_read_hi(dstARGB), srcA0, vis_read_hi(srcARGB));
0N/A MASK_FILL(res1, vis_read_lo(dstARGB), srcA1, vis_read_lo(srcARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A *(mlib_d64*)(dst_ptr + i) = res0;
0N/A }
0N/A
0N/A if (i < width) {
0N/A srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0);
0N/A MASK_FILL(res0, dstARGB0, srcA0, srcARGB0);
0N/A if (srcA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntArgbPreSrcOverMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_s32 extraA;
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_u8 *mul8_extra;
0N/A mlib_s32 j;
0N/A
0N/A extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);
0N/A
0N/A mul8_extra = mul8table[extraA];
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbToIntArgbPreSrcOverMaskBlit_line(dstBase, srcBase, pMask,
0N/A width, mul8_extra,
0N/A (void*)mul8table);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A if (dstScan == 4*width && srcScan == dstScan) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(dstBase, srcBase, width,
0N/A mul8_extra);
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/A
0N/Avoid ADD_SUFF(IntArgbToFourByteAbgrPreSrcOverMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff;
0N/A mlib_s32 extraA;
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_u8 *mul8_extra;
0N/A mlib_s32 j;
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);
0N/A
0N/A mul8_extra = mul8table[extraA];
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A IntArgbToIntArgbPreSrcOverMaskBlit_line(pbuff, srcBase, pMask,
0N/A width, mul8_extra,
0N/A (void*)mul8table);
0N/A
0N/A ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A for (j = 0; j < height; j++) {
0N/A ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(pbuff, srcBase, width,
0N/A mul8_extra);
0N/A
0N/A ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbToIntArgbPreAlphaMaskBlit()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 srcF, dstF; \
0N/A \
0N/A srcA = mul8_extra[srcA]; \
0N/A \
0N/A srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \
0N/A \
0N/A srcF = MUL8_INT(pathA, srcF); \
0N/A dstF = MUL8_INT(pathA, dstF) + (0xff - pathA); \
0N/A \
0N/A srcA = MUL8_INT(srcF, srcA); \
0N/A \
0N/A t0 = MUL8_VIS(srcARGB, srcA); \
0N/A t1 = MUL8_VIS(dstARGB, dstF); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/**************************************************************/
0N/A
0N/Astatic void IntArgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_u8 *mul8_extra,
0N/A mlib_u8 *mul8_tbl);
0N/A
0N/A#pragma no_inline(IntArgbToIntArgbPreAlphaMaskBlit_line)
0N/A
0N/Astatic void IntArgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_u8 *mul8_extra,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i;
0N/A mlib_s32 pathA0, dstA0, srcA0;
0N/A mlib_d64 res0;
0N/A mlib_f32 dstARGB0, srcARGB0;
0N/A mlib_s32 SrcOpAnd = log_val[0];
0N/A mlib_s32 SrcOpXor = log_val[1];
0N/A mlib_s32 SrcOpAdd = log_val[2];
0N/A mlib_s32 DstOpAnd = log_val[3];
0N/A mlib_s32 DstOpXor = log_val[4];
0N/A mlib_s32 DstOpAdd = log_val[5];
0N/A mlib_f32 or_alpha = vis_to_float(0xff000000);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i < width; i++) {
0N/A
0N/A pathA0 = pMask[i];
0N/A
0N/A dstA0 = *(mlib_u8*)dst_ptr;
0N/A
0N/A dstARGB0 = *dst_ptr;
0N/A srcA0 = *(mlib_u8*)src_ptr;
0N/A srcARGB0 = *src_ptr;
0N/A srcARGB0 = vis_fors(or_alpha, srcARGB0);
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A
0N/A *dst_ptr = vis_fpack16(res0);
0N/A dst_ptr++;
0N/A src_ptr++;
0N/A }
0N/A
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, dstA, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 srcF, dstF; \
0N/A \
0N/A srcA = mul8_extra[srcA]; \
0N/A \
0N/A srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \
0N/A \
0N/A srcA = MUL8_INT(srcF, srcA); \
0N/A \
0N/A t0 = MUL8_VIS(srcARGB, srcA); \
0N/A t1 = MUL8_VIS(dstARGB, dstF); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_u8 *mul8_extra,
0N/A mlib_u8 *mul8_tbl);
0N/A
0N/A#pragma no_inline(IntArgbToIntArgbPreAlphaMaskBlit_A1_line)
0N/A
0N/Astatic void IntArgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_u8 *mul8_extra,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i;
0N/A mlib_s32 dstA0, srcA0;
0N/A mlib_d64 res0;
0N/A mlib_f32 dstARGB0, srcARGB0;
0N/A mlib_s32 SrcOpAnd = log_val[0];
0N/A mlib_s32 SrcOpXor = log_val[1];
0N/A mlib_s32 SrcOpAdd = log_val[2];
0N/A mlib_s32 DstOpAnd = log_val[3];
0N/A mlib_s32 DstOpXor = log_val[4];
0N/A mlib_s32 DstOpAdd = log_val[5];
0N/A mlib_f32 or_alpha = vis_to_float(0xff000000);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i < width; i++) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A srcARGB0 = vis_fors(or_alpha, srcARGB0);
0N/A
0N/A MASK_FILL(res0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntArgbPreAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_s32 extraA;
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 log_val[6];
0N/A mlib_s32 j;
0N/A mlib_s32 SrcOpAnd;
0N/A mlib_s32 SrcOpXor;
0N/A mlib_s32 SrcOpAdd;
0N/A mlib_s32 DstOpAnd;
0N/A mlib_s32 DstOpXor;
0N/A mlib_s32 DstOpAdd;
0N/A mlib_u8 *mul8_extra;
0N/A
0N/A extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);
0N/A
0N/A mul8_extra = mul8table[extraA];
0N/A
0N/A SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;
0N/A SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;
0N/A SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;
0N/A SrcOpAdd -= SrcOpXor;
0N/A
0N/A DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;
0N/A DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;
0N/A DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;
0N/A DstOpAdd -= DstOpXor;
0N/A
0N/A log_val[0] = SrcOpAnd;
0N/A log_val[1] = SrcOpXor;
0N/A log_val[2] = SrcOpAdd;
0N/A log_val[3] = DstOpAnd;
0N/A log_val[4] = DstOpXor;
0N/A log_val[5] = DstOpAdd;
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbToIntArgbPreAlphaMaskBlit_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A if (dstScan == 4*width && srcScan == dstScan) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbToIntArgbPreAlphaMaskBlit_A1_line(dstBase, srcBase,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
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/A
0N/Avoid ADD_SUFF(IntArgbToFourByteAbgrPreAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff;
0N/A mlib_s32 extraA;
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 log_val[6];
0N/A mlib_s32 j;
0N/A mlib_s32 SrcOpAnd;
0N/A mlib_s32 SrcOpXor;
0N/A mlib_s32 SrcOpAdd;
0N/A mlib_s32 DstOpAnd;
0N/A mlib_s32 DstOpXor;
0N/A mlib_s32 DstOpAdd;
0N/A mlib_u8 *mul8_extra;
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);
0N/A
0N/A mul8_extra = mul8table[extraA];
0N/A
0N/A SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;
0N/A SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;
0N/A SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;
0N/A SrcOpAdd -= SrcOpXor;
0N/A
0N/A DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;
0N/A DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;
0N/A DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;
0N/A DstOpAdd -= DstOpXor;
0N/A
0N/A log_val[0] = SrcOpAnd;
0N/A log_val[1] = SrcOpXor;
0N/A log_val[2] = SrcOpAdd;
0N/A log_val[3] = DstOpAnd;
0N/A log_val[4] = DstOpXor;
0N/A log_val[5] = DstOpAdd;
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A IntArgbToIntArgbPreAlphaMaskBlit_line(pbuff, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
0N/A
0N/A ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A for (j = 0; j < height; j++) {
0N/A ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A IntArgbToIntArgbPreAlphaMaskBlit_A1_line(pbuff, srcBase,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
0N/A
0N/A ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntRgbToIntArgbPreAlphaMaskBlit()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 srcF, dstF; \
0N/A \
0N/A srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \
0N/A \
0N/A srcF = MUL8_INT(pathA, srcF); \
0N/A dstF = mul8_tbl[pathA + dstF_0] + (0xff - pathA); \
0N/A \
0N/A srcF = mul8_tbl[srcF + srcA]; \
0N/A \
0N/A t0 = MUL8_VIS(srcARGB, srcF); \
0N/A t1 = MUL8_VIS(dstARGB, dstF); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/**************************************************************/
0N/A
0N/Astatic void IntRgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_s32 extraA,
0N/A mlib_s32 dstF_0,
0N/A mlib_u8 *mul8_tbl);
0N/A
0N/A#pragma no_inline(IntRgbToIntArgbPreAlphaMaskBlit_line)
0N/A
0N/Astatic void IntRgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_u8 *pMask,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_s32 extraA,
0N/A mlib_s32 dstF_0,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i;
0N/A mlib_s32 pathA0, dstA0, srcA0;
0N/A mlib_d64 res0;
0N/A mlib_f32 dstARGB0, srcARGB0;
0N/A mlib_s32 SrcOpAnd = log_val[0];
0N/A mlib_s32 SrcOpXor = log_val[1];
0N/A mlib_s32 SrcOpAdd = log_val[2];
0N/A mlib_f32 or_alpha = vis_to_float(0xff000000);
0N/A
0N/A srcA0 = extraA*256;
0N/A dstF_0 *= 256;
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i < width; i++) {
0N/A pathA0 = pMask[i];
0N/A
0N/A dstA0 = *(mlib_u8*)dst_ptr;
0N/A dstARGB0 = *dst_ptr;
0N/A srcARGB0 = *src_ptr;
0N/A
0N/A srcARGB0 = vis_fors(or_alpha, srcARGB0);
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A
0N/A *dst_ptr = vis_fpack16(res0);
0N/A dst_ptr++;
0N/A src_ptr++;
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, dstA, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A mlib_s32 srcF; \
0N/A \
0N/A srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \
0N/A \
0N/A srcF = mul8_tbl[srcF + srcA]; \
0N/A \
0N/A t0 = MUL8_VIS(srcARGB, srcF); \
0N/A t1 = MUL8_VIS(dstARGB, dstF_0); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_s32 extraA,
0N/A mlib_s32 dstF_0,
0N/A mlib_u8 *mul8_tbl);
0N/A
0N/A#pragma no_inline(IntRgbToIntArgbPreAlphaMaskBlit_A1_line)
0N/A
0N/Astatic void IntRgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,
0N/A mlib_f32 *src_ptr,
0N/A mlib_s32 width,
0N/A mlib_s32 *log_val,
0N/A mlib_s32 extraA,
0N/A mlib_s32 dstF_0,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i;
0N/A mlib_s32 dstA0, srcA0;
0N/A mlib_d64 res0;
0N/A mlib_f32 dstARGB0, srcARGB0;
0N/A mlib_s32 SrcOpAnd = log_val[0];
0N/A mlib_s32 SrcOpXor = log_val[1];
0N/A mlib_s32 SrcOpAdd = log_val[2];
0N/A mlib_f32 or_alpha = vis_to_float(0xff000000);
0N/A
0N/A srcA0 = extraA*256;
0N/A
0N/A#pragma pipeloop(0)
0N/A for (i = 0; i < width; i++) {
0N/A dstA0 = *(mlib_u8*)dst_ptr;
0N/A
0N/A dstARGB0 = *dst_ptr;
0N/A srcARGB0 = *src_ptr;
0N/A srcARGB0 = vis_fors(or_alpha, srcARGB0);
0N/A
0N/A MASK_FILL(res0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A
0N/A *dst_ptr = vis_fpack16(res0);
0N/A
0N/A dst_ptr++;
0N/A src_ptr++;
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntRgbToIntArgbPreAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_s32 extraA;
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 log_val[3];
0N/A mlib_s32 j;
0N/A mlib_s32 SrcOpAnd;
0N/A mlib_s32 SrcOpXor;
0N/A mlib_s32 SrcOpAdd;
0N/A mlib_s32 DstOpAnd;
0N/A mlib_s32 DstOpXor;
0N/A mlib_s32 DstOpAdd;
0N/A mlib_s32 dstF_0;
0N/A
0N/A extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);
0N/A
0N/A SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;
0N/A SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;
0N/A SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;
0N/A SrcOpAdd -= SrcOpXor;
0N/A
0N/A DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;
0N/A DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;
0N/A DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;
0N/A DstOpAdd -= DstOpXor;
0N/A
0N/A log_val[0] = SrcOpAnd;
0N/A log_val[1] = SrcOpXor;
0N/A log_val[2] = SrcOpAdd;
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A dstF_0 = ((extraA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntRgbToIntArgbPreAlphaMaskBlit_line(dstBase, srcBase, pMask,
0N/A width, log_val, extraA, dstF_0,
0N/A (void*)mul8table);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A if (dstScan == 4*width && srcScan == dstScan) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntRgbToIntArgbPreAlphaMaskBlit_A1_line(dstBase, srcBase, width,
0N/A log_val, extraA, dstF_0,
0N/A (void*)mul8table);
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/A
0N/Avoid ADD_SUFF(IntRgbToFourByteAbgrPreAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff;
0N/A mlib_s32 extraA;
0N/A mlib_s32 dstScan = pDstInfo->scanStride;
0N/A mlib_s32 srcScan = pSrcInfo->scanStride;
0N/A mlib_s32 log_val[3];
0N/A mlib_s32 j;
0N/A mlib_s32 SrcOpAnd;
0N/A mlib_s32 SrcOpXor;
0N/A mlib_s32 SrcOpAdd;
0N/A mlib_s32 DstOpAnd;
0N/A mlib_s32 DstOpXor;
0N/A mlib_s32 DstOpAdd;
0N/A mlib_s32 dstF_0;
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);
0N/A
0N/A SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;
0N/A SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;
0N/A SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;
0N/A SrcOpAdd -= SrcOpXor;
0N/A
0N/A DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;
0N/A DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;
0N/A DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;
0N/A DstOpAdd -= DstOpXor;
0N/A
0N/A log_val[0] = SrcOpAnd;
0N/A log_val[1] = SrcOpXor;
0N/A log_val[2] = SrcOpAdd;
0N/A
0N/A vis_write_gsr(0 << 3);
0N/A
0N/A dstF_0 = ((extraA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A IntRgbToIntArgbPreAlphaMaskBlit_line(pbuff, srcBase, pMask, width,
0N/A log_val, extraA, dstF_0,
0N/A (void*)mul8table);
0N/A
0N/A ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A PTR_ADD(pMask, maskScan);
0N/A }
0N/A } else {
0N/A for (j = 0; j < height; j++) {
0N/A ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A IntRgbToIntArgbPreAlphaMaskBlit_A1_line(pbuff, srcBase, width,
0N/A log_val, extraA, dstF_0,
0N/A (void*)mul8table);
0N/A
0N/A ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1,
0N/A pSrcInfo, pDstInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#endif /* JAVA2D_NO_MLIB */