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_AlphaMacros.h"
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbToIntArgbAlphaMaskBlit()
0N/A * IntArgbToFourByteAbgrAlphaMaskBlit()
0N/A */
0N/A
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \
0N/A{ \
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 dstA = MUL8_INT(dstF, dstA); \
0N/A \
0N/A BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntArgbAlphaMaskBlit_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, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0, srcARGB0, srcARGB1;
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
0N/A i = i0 = 0;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A if (pathA0) {
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 MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
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 srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A srcA1 = *(mlib_u8*)(src_ptr + i + 1);
0N/A srcARGB0 = src_ptr[i];
0N/A srcARGB1 = src_ptr[i + 1];
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);
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 *(mlib_u8*)(dst_ptr + i ) = dstA0;
0N/A *(mlib_u8*)(dst_ptr + i + 1) = dstA1;
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A if (pathA0) {
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 MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
0N/A }
0N/A }
0N/A}
0N/A
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_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 dstA = MUL8_INT(dstF, dstA); \
0N/A \
0N/A BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntArgbAlphaMaskBlit_A1_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 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
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 MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntArgbAlphaMaskBlit)(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(7 << 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 IntArgbToIntArgbAlphaMaskBlit_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 IntArgbToIntArgbAlphaMaskBlit_A1_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 }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToFourByteAbgrAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *src_buff = buff, *dst_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 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(7 << 3);
0N/A
0N/A if (2*width > BUFF_SIZE) src_buff = mlib_malloc(2*width*sizeof(mlib_s32));
0N/A dst_buff = (mlib_s32*)src_buff + width;
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);
0N/A if (!((mlib_s32)dstBase & 3)) {
0N/A IntArgbToIntArgbAlphaMaskBlit_line(dstBase, src_buff, pMask,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
0N/A } else {
0N/A mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));
0N/A IntArgbToIntArgbAlphaMaskBlit_line(dst_buff, src_buff, pMask,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
0N/A mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));
0N/A }
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 IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);
0N/A if (!((mlib_s32)dstBase & 3)) {
0N/A IntArgbToIntArgbAlphaMaskBlit_A1_line(dstBase, src_buff,
0N/A pMask, width, log_val,
0N/A mul8_extra,
0N/A (void*)mul8table);
0N/A } else {
0N/A mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));
0N/A IntArgbToIntArgbAlphaMaskBlit_A1_line(dst_buff, src_buff,
0N/A pMask, width, log_val,
0N/A mul8_extra,
0N/A (void*)mul8table);
0N/A mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A }
0N/A
0N/A if (src_buff != buff) {
0N/A mlib_free(src_buff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbToIntRgbAlphaMaskBlit()
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_s32 srcF, dstF; \
0N/A \
0N/A srcA = mul8_extra[srcA]; \
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \
0N/A \
0N/A srcF = mul8_srcF[pathA]; \
0N/A dstA = MUL8_INT(dstF, pathA) + (0xff - pathA); \
0N/A \
0N/A pathA = dstA - 0xff - srcF; \
0N/A /* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \
0N/A \
0N/A srcA = MUL8_INT(srcA, srcF); \
0N/A \
0N/A BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntRgbAlphaMaskBlit_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0, srcARGB0, srcARGB1;
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
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 MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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 srcARGB0 = src_ptr[i];
0N/A srcARGB1 = src_ptr[i + 1];
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);
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 srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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, pathA, dstA, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A srcA = mul8_extra[srcA]; \
0N/A dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \
0N/A \
0N/A srcA = mul8_srcF[srcA]; \
0N/A \
0N/A pathA = dstA - srcF_255; \
0N/A /* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \
0N/A \
0N/A BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntRgbAlphaMaskBlit_A1_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0, srcARGB0, srcARGB1;
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_s32 srcF_255 = mul8_srcF[0xff] + 0xff;
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 MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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 srcARGB0 = src_ptr[i];
0N/A srcARGB1 = src_ptr[i + 1];
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);
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 srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntRgbAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_s32 extraA, srcF;
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, *mul8_srcF;
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[3] = DstOpAnd;
0N/A log_val[4] = DstOpXor;
0N/A log_val[5] = DstOpAdd;
0N/A
0N/A srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;
0N/A
0N/A mul8_srcF = mul8table[srcF];
0N/A
0N/A vis_write_gsr(7 << 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 IntArgbToIntRgbAlphaMaskBlit_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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 IntArgbToIntRgbAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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/A/* ##############################################################
0N/A * IntRgbToIntArgbAlphaMaskBlit()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB, srcAX, srcARGB) \
0N/A{ \
0N/A mlib_s32 pathAx256 = pathA << 8; \
0N/A srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \
0N/A \
0N/A srcF = mul8_tbl[pathAx256 + srcF]; \
0N/A dstFX = mul8_tbl[pathAx256 + dstF] + (0xff - pathA); \
0N/A \
0N/A srcAX = mul8_tbl[srcF + srcAx256]; \
0N/A dstA = mul8_tbl[dstFX + (dstA << 8)]; \
0N/A \
0N/A BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcAX); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbToIntArgbAlphaMaskBlit_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, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0, srcARGB0, srcARGB1;
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_s32 srcF, dstF, dstFX, srcAx256;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A srcA = 0xFF;
0N/A srcA = mul8_extra[srcA];
0N/A srcAx256 = srcA << 8;
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A if (pathA0) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
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 srcARGB0 = src_ptr[i];
0N/A srcARGB1 = src_ptr[i + 1];
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);
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 *(mlib_u8*)(dst_ptr + i ) = dstA0;
0N/A *(mlib_u8*)(dst_ptr + i + 1) = dstA1;
0N/A }
0N/A
0N/A if (i < width) {
0N/A pathA0 = pMask[i];
0N/A if (pathA0) {
0N/A dstA0 = *(mlib_u8*)(dst_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \
0N/A{ \
0N/A srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \
0N/A \
0N/A srcA = mul8_tbl[srcF + srcAx256]; \
0N/A dstA = mul8_tbl[dstF + (dstA << 8)]; \
0N/A \
0N/A BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA); \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbToIntArgbAlphaMaskBlit_A1_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 dstA0, srcA, 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_s32 srcF, dstF, srcAx256;
0N/A
0N/A srcA = 0xFF;
0N/A srcA = mul8_extra[srcA];
0N/A srcAx256 = srcA << 8;
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
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 dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A *(mlib_u8*)(dst_ptr + i) = dstA0;
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntRgbToIntArgbAlphaMaskBlit)(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(7 << 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 IntRgbToIntArgbAlphaMaskBlit_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 IntRgbToIntArgbAlphaMaskBlit_A1_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 }
0N/A }
0N/A}
0N/A
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntRgbToFourByteAbgrAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *src_buff = buff, *dst_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 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(7 << 3);
0N/A
0N/A if (2*width > BUFF_SIZE) src_buff = mlib_malloc(2*width*sizeof(mlib_s32));
0N/A dst_buff = (mlib_s32*)src_buff + width;
0N/A
0N/A if (pMask != NULL) {
0N/A pMask += maskOff;
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);
0N/A if (!((mlib_s32)dstBase & 3)) {
0N/A IntRgbToIntArgbAlphaMaskBlit_line(dstBase, src_buff, pMask,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
0N/A } else {
0N/A mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));
0N/A IntRgbToIntArgbAlphaMaskBlit_line(dst_buff, src_buff, pMask,
0N/A width, log_val, mul8_extra,
0N/A (void*)mul8table);
0N/A mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));
0N/A }
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 IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);
0N/A if (!((mlib_s32)dstBase & 3)) {
0N/A IntRgbToIntArgbAlphaMaskBlit_A1_line(dstBase, src_buff, pMask,
0N/A width, log_val,
0N/A mul8_extra,
0N/A (void*)mul8table);
0N/A } else {
0N/A mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));
0N/A IntRgbToIntArgbAlphaMaskBlit_A1_line(dst_buff, src_buff, pMask,
0N/A width, log_val,
0N/A mul8_extra,
0N/A (void*)mul8table);
0N/A mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(dstBase, dstScan);
0N/A PTR_ADD(srcBase, srcScan);
0N/A }
0N/A }
0N/A
0N/A if (src_buff != buff) {
0N/A mlib_free(src_buff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A/* ##############################################################
0N/A * IntArgbToIntBgrAlphaMaskBlit()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \
0N/A srcA = mul8_extra[srcA]; \
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \
0N/A \
0N/A srcF = mul8_srcF[pathA]; \
0N/A dstA = mul8_tbl[(pathA << 8) + dstF] + (0xff - pathA); \
0N/A \
0N/A pathA = dstA - 0xff - srcF; \
0N/A /* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \
0N/A \
0N/A srcA = MUL8_INT(srcA, srcF); \
0N/A \
0N/A BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA)
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntBgrAlphaMaskBlit_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB, srcARGB;
0N/A mlib_f32 dstARGB0, srcARGB0;
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_s32 srcF, dstF;
0N/A
0N/A#if VIS >= 0x200
0N/A vis_write_bmask(0x03214765, 0);
0N/A#endif
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 ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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 ARGB2ABGR_DB(srcARGB)
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),
0N/A srcA0, vis_read_hi(srcARGB));
0N/A MASK_FILL(res1, pathA1, dstA1, 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 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 srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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, pathA, dstA, dstARGB, srcA, srcARGB) \
0N/A srcA = mul8_extra[srcA]; \
0N/A dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \
0N/A \
0N/A srcA = mul8_srcF[srcA]; \
0N/A \
0N/A pathA = dstA - srcF_255; \
0N/A /* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \
0N/A \
0N/A BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA)
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntArgbToIntBgrAlphaMaskBlit_A1_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB, srcARGB;
0N/A mlib_f32 dstARGB0, srcARGB0;
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_s32 srcF_255 = mul8_srcF[0xff] + 0xff;
0N/A
0N/A#if VIS >= 0x200
0N/A vis_write_bmask(0x03214765, 0);
0N/A#endif
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 ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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 ARGB2ABGR_DB(srcARGB)
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),
0N/A srcA0, vis_read_hi(srcARGB));
0N/A MASK_FILL(res1, pathA1, dstA1, 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 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 srcA0 = *(mlib_u8*)(src_ptr + i);
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntArgbToIntBgrAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_s32 extraA, srcF;
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, *mul8_srcF;
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[3] = DstOpAnd;
0N/A log_val[4] = DstOpXor;
0N/A log_val[5] = DstOpAdd;
0N/A
0N/A srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;
0N/A
0N/A mul8_srcF = mul8table[srcF];
0N/A
0N/A vis_write_gsr(7 << 3);
0N/A
0N/A if (pMask != NULL) {
0N/A if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {
0N/A width *= height;
0N/A height = 1;
0N/A }
0N/A
0N/A pMask += maskOff;
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A IntArgbToIntBgrAlphaMaskBlit_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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 IntArgbToIntBgrAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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/A/* ##############################################################
0N/A * IntRgbToIntRgbAlphaMaskBlit()
0N/A * IntRgbToIntBgrAlphaMaskBlit()
0N/A * IntBgrToIntBgrAlphaMaskBlit()
0N/A */
0N/A
0N/A#undef MASK_FILL
0N/A#define MASK_FILL(rr, pathA, dstA, dstARGB, srcAX, srcARGB) \
0N/A srcF = mul8_srcF[pathA]; \
0N/A dstA = mul8_tbl[(pathA << 8) + dstF] + (0xff - pathA); \
0N/A pathA = dstA - 0xff - srcF; \
0N/A srcAX = mul8_tbl[srcA + (srcF << 8)]; \
0N/A \
0N/A BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcAX)
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbToIntRgbAlphaMaskBlit_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0, srcARGB0, srcARGB1;
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_s32 srcF, dstF;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A srcA = 0xFF;
0N/A srcA = mul8_extra[srcA];
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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 srcARGB0 = src_ptr[i];
0N/A srcARGB1 = src_ptr[i + 1];
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);
0N/A MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);
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 dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbToIntBgrAlphaMaskBlit_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA, srcA0, srcA1, msk;
0N/A mlib_d64 res0, res1, dstARGB, srcARGB;
0N/A mlib_f32 dstARGB0, srcARGB0;
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_s32 srcF, dstF;
0N/A
0N/A#if VIS >= 0x200
0N/A vis_write_bmask(0x03214765, 0);
0N/A#endif
0N/A
0N/A i = i0 = 0;
0N/A
0N/A srcA = 0xFF;
0N/A srcA = mul8_extra[srcA];
0N/A dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A pathA0 = pMask[i];
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
0N/A dst_ptr[i] = vis_fpack16(res0);
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 srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);
0N/A ARGB2ABGR_DB(srcARGB)
0N/A
0N/A MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),
0N/A srcA0, vis_read_hi(srcARGB));
0N/A MASK_FILL(res1, pathA1, dstA1, 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 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 dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);
0N/A if (pathA0) {
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, srcARGB) \
0N/A t0 = vis_fmul8x16al(srcARGB, srcA_mul); \
0N/A t1 = vis_fmul8x16al(dstARGB, dstA_mul); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A rr = vis_fpadd16(vis_fmul8sux16(rr, dstA_div), \
0N/A vis_fmul8ulx16(rr, dstA_div))
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbToIntRgbAlphaMaskBlit_A1_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA, dstA, srcA, msk;
0N/A mlib_d64 res0, res1, dstARGB;
0N/A mlib_f32 dstARGB0, srcARGB0, srcARGB1, srcA_mul, dstA_mul;
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_s32 srcF_255 = mul8_srcF[0xff] + 0xff;
0N/A mlib_d64 t0, t1, dstA_div;
0N/A
0N/A i = i0 = 0;
0N/A
0N/A srcA = 0xFF;
0N/A srcA = mul8_extra[srcA];
0N/A dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A srcA = mul8_srcF[srcA];
0N/A pathA = dstA - srcF_255;
0N/A srcA_mul = ((mlib_f32*)vis_mul8s_tbl)[srcA];
0N/A dstA_mul = ((mlib_f32*)vis_mul8s_tbl)[dstA];
0N/A dstA += srcA;
0N/A dstA_div = ((mlib_d64*)vis_div8_tbl)[dstA];
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, dstARGB0, srcARGB0);
0N/A if (pathA) {
0N/A dst_ptr[i] = vis_fpack16(res0);
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 srcARGB0 = src_ptr[i];
0N/A srcARGB1 = src_ptr[i + 1];
0N/A
0N/A MASK_FILL(res0, vis_read_hi(dstARGB), srcARGB0);
0N/A MASK_FILL(res1, vis_read_lo(dstARGB), srcARGB1);
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A msk = (((pathA) & (1 << 11)) | ((pathA) & (1 << 10))) >> 10;
0N/A vis_pst_32(res0, dst_ptr + i, msk);
0N/A }
0N/A
0N/A if (i < width) {
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A MASK_FILL(res0, dstARGB0, srcARGB0);
0N/A if (pathA) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Astatic void IntRgbToIntBgrAlphaMaskBlit_A1_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_srcF,
0N/A mlib_u8 *mul8_tbl)
0N/A{
0N/A mlib_s32 i, i0;
0N/A mlib_s32 pathA, dstA, srcA, msk;
0N/A mlib_d64 res0, res1, dstARGB, srcARGB;
0N/A mlib_f32 dstARGB0, srcARGB0, srcA_mul, dstA_mul;
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_s32 srcF_255 = mul8_srcF[0xff] + 0xff;
0N/A mlib_d64 t0, t1, dstA_div;
0N/A
0N/A#if VIS >= 0x200
0N/A vis_write_bmask(0x03214765, 0);
0N/A#endif
0N/A
0N/A i = i0 = 0;
0N/A
0N/A srcA = 0xFF;
0N/A srcA = mul8_extra[srcA];
0N/A dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;
0N/A srcA = mul8_srcF[srcA];
0N/A pathA = dstA - srcF_255;
0N/A srcA_mul = ((mlib_f32*)vis_mul8s_tbl)[srcA];
0N/A dstA_mul = ((mlib_f32*)vis_mul8s_tbl)[dstA];
0N/A dstA += srcA;
0N/A dstA_div = ((mlib_d64*)vis_div8_tbl)[dstA];
0N/A
0N/A if ((mlib_s32)dst_ptr & 7) {
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, dstARGB0, srcARGB0);
0N/A if (pathA) {
0N/A dst_ptr[i] = vis_fpack16(res0);
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 srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);
0N/A ARGB2ABGR_DB(srcARGB)
0N/A
0N/A MASK_FILL(res0, vis_read_hi(dstARGB), vis_read_hi(srcARGB));
0N/A MASK_FILL(res1, vis_read_lo(dstARGB), vis_read_lo(srcARGB));
0N/A
0N/A res0 = vis_fpack16_pair(res0, res1);
0N/A
0N/A msk = (((pathA) & (1 << 11)) | ((pathA) & (1 << 10))) >> 10;
0N/A vis_pst_32(res0, dst_ptr + i, msk);
0N/A }
0N/A
0N/A if (i < width) {
0N/A dstARGB0 = dst_ptr[i];
0N/A srcARGB0 = src_ptr[i];
0N/A ARGB2ABGR_FL(srcARGB0)
0N/A MASK_FILL(res0, dstARGB0, srcARGB0);
0N/A if (pathA) {
0N/A dst_ptr[i] = vis_fpack16(res0);
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(IntRgbToIntRgbAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_s32 extraA, srcF;
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, *mul8_srcF;
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[3] = DstOpAnd;
0N/A log_val[4] = DstOpXor;
0N/A log_val[5] = DstOpAdd;
0N/A
0N/A srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;
0N/A
0N/A mul8_srcF = mul8table[srcF];
0N/A
0N/A vis_write_gsr(7 << 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 IntRgbToIntRgbAlphaMaskBlit_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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 IntRgbToIntRgbAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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(IntRgbToIntBgrAlphaMaskBlit)(MASKBLIT_PARAMS)
0N/A{
0N/A mlib_s32 extraA, srcF;
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, *mul8_srcF;
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[3] = DstOpAnd;
0N/A log_val[4] = DstOpXor;
0N/A log_val[5] = DstOpAdd;
0N/A
0N/A srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;
0N/A
0N/A mul8_srcF = mul8table[srcF];
0N/A
0N/A vis_write_gsr(7 << 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 IntRgbToIntBgrAlphaMaskBlit_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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 IntRgbToIntBgrAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,
0N/A width, log_val, mul8_extra,
0N/A mul8_srcF, (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/A#ifdef MLIB_ADD_SUFF
0N/A#pragma weak IntBgrToIntBgrAlphaMaskBlit_F = IntRgbToIntRgbAlphaMaskBlit_F
0N/A#else
0N/A#pragma weak IntBgrToIntBgrAlphaMaskBlit = IntRgbToIntRgbAlphaMaskBlit
0N/A#endif
0N/A
0N/A/***************************************************************/
0N/A
0N/A/*
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff;
0N/A
0N/A if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A
0N/A ADD_SUFF(ThreeByteBgrToIntArgbConvert)(rasBase, pbuff, width, 1,
0N/A pRasInfo, pRasInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A ADD_SUFF(IntArgbToThreeByteBgrConvert)(pbuff, rasBase, width, 1,
0N/A pRasInfo, pRasInfo,
0N/A pPrim, pCompInfo);
0N/A
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A*/
0N/A
0N/A#endif