| /* |
| * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| #if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF) |
| |
| #include "vis_AlphaMacros.h" |
| |
| /***************************************************************/ |
| |
| /* ############################################################## |
| * IntArgbPreAlphaMaskFill() |
| */ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, pathA, dstA, dstARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 srcF, dstF; \ |
| \ |
| srcF = ((dstA & ConstAnd) ^ ConstXor) + ConstAdd; \ |
| srcF = MUL8_INT(srcF, pathA); \ |
| dstF = mul8_cnstF[pathA] + (255 - pathA); \ |
| \ |
| t0 = MUL8_VIS(cnstARGB0, srcF); \ |
| t1 = MUL8_VIS(dstARGB, dstF); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| void IntArgbPreAlphaMaskFill_line(mlib_f32 *dst_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_f32 cnstARGB0, |
| mlib_s32 *log_val, |
| mlib_u8 *mul8_cnstF, |
| mlib_u8 *mul8_tbl); |
| |
| #pragma no_inline(IntArgbPreAlphaMaskFill_line) |
| |
| void IntArgbPreAlphaMaskFill_line(mlib_f32 *dst_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_f32 cnstARGB0, |
| mlib_s32 *log_val, |
| mlib_u8 *mul8_cnstF, |
| mlib_u8 *mul8_tbl) |
| { |
| mlib_s32 i, i0; |
| mlib_s32 pathA0, pathA1, dstA0, dstA1, msk; |
| mlib_d64 res0, res1, dstARGB; |
| mlib_f32 dstARGB0; |
| mlib_s32 ConstAnd, ConstXor, ConstAdd; |
| |
| ConstAnd = log_val[0]; |
| ConstXor = log_val[1]; |
| ConstAdd = log_val[2]; |
| |
| i = i0 = 0; |
| |
| if ((mlib_s32)dst_ptr & 7) { |
| pathA0 = pMask[i]; |
| |
| if (pathA0) { |
| dstA0 = *(mlib_u8*)(dst_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, pathA0, dstA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| |
| i0 = 1; |
| } |
| |
| #pragma pipeloop(0) |
| for (i = i0; i <= width - 2; i += 2) { |
| pathA0 = pMask[i]; |
| pathA1 = pMask[i + 1]; |
| dstA0 = *(mlib_u8*)(dst_ptr + i); |
| dstA1 = *(mlib_u8*)(dst_ptr + i + 1); |
| dstARGB = *(mlib_d64*)(dst_ptr + i); |
| |
| MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB)); |
| MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB)); |
| |
| res0 = vis_fpack16_pair(res0, res1); |
| |
| msk = (((-pathA0) & (1 << 11)) | ((-pathA1) & (1 << 10))) >> 10; |
| vis_pst_32(res0, dst_ptr + i, msk); |
| } |
| |
| if (i < width) { |
| pathA0 = pMask[i]; |
| |
| if (pathA0) { |
| dstA0 = *(mlib_u8*)(dst_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, pathA0, dstA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, cnstF, dstA, dstARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 srcF, dstF; \ |
| \ |
| srcF = ((dstA & ConstAnd) ^ ConstXor) + ConstAdd; \ |
| dstF = cnstF; \ |
| \ |
| t0 = MUL8_VIS(cnstARGB0, srcF); \ |
| t1 = MUL8_VIS(dstARGB, dstF); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| void IntArgPrebAlphaMaskFill_A1_line(mlib_f32 *dst_ptr, |
| mlib_s32 width, |
| mlib_f32 cnstARGB0, |
| mlib_s32 *log_val, |
| mlib_s32 cnstF); |
| |
| #pragma no_inline(IntArgPrebAlphaMaskFill_A1_line) |
| |
| void IntArgPrebAlphaMaskFill_A1_line(mlib_f32 *dst_ptr, |
| mlib_s32 width, |
| mlib_f32 cnstARGB0, |
| mlib_s32 *log_val, |
| mlib_s32 cnstF) |
| { |
| mlib_s32 i, i0; |
| mlib_s32 dstA0, dstA1; |
| mlib_d64 res0, res1, dstARGB; |
| mlib_f32 dstARGB0; |
| mlib_s32 ConstAnd, ConstXor, ConstAdd; |
| |
| ConstAnd = log_val[0]; |
| ConstXor = log_val[1]; |
| ConstAdd = log_val[2]; |
| |
| i = i0 = 0; |
| |
| if ((mlib_s32)dst_ptr & 7) { |
| { |
| dstA0 = *(mlib_u8*)(dst_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, cnstF, dstA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| |
| i0 = 1; |
| } |
| |
| #pragma pipeloop(0) |
| for (i = i0; i <= width - 2; i += 2) { |
| dstA0 = *(mlib_u8*)(dst_ptr + i); |
| dstA1 = *(mlib_u8*)(dst_ptr + i + 1); |
| dstARGB = *(mlib_d64*)(dst_ptr + i); |
| |
| MASK_FILL(res0, cnstF, dstA0, vis_read_hi(dstARGB)); |
| MASK_FILL(res1, cnstF, dstA1, vis_read_lo(dstARGB)); |
| |
| res0 = vis_fpack16_pair(res0, res1); |
| |
| *(mlib_d64*)(dst_ptr + i) = res0; |
| } |
| |
| if (i < width) { |
| { |
| dstA0 = *(mlib_u8*)(dst_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, cnstF, dstA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntArgbPreAlphaMaskFill)(void *rasBase, |
| jubyte *pMask, |
| jint maskOff, |
| jint maskScan, |
| jint width, |
| jint height, |
| jint fgColor, |
| SurfaceDataRasInfo *pRasInfo, |
| NativePrimitive *pPrim, |
| CompositeInfo *pCompInfo) |
| { |
| mlib_s32 cnstA, cnstR, cnstG, cnstB; |
| mlib_s32 rasScan = pRasInfo->scanStride; |
| mlib_f32 cnstARGB0; |
| mlib_u8 *mul8_cnstF; |
| mlib_s32 SrcOpAnd, SrcOpXor, SrcOpAdd; |
| mlib_s32 DstOpAnd, DstOpXor, DstOpAdd; |
| mlib_s32 dstFbase; |
| mlib_s32 log_val[3]; |
| mlib_s32 j; |
| |
| cnstA = (fgColor >> 24) & 0xff; |
| cnstR = (fgColor >> 16) & 0xff; |
| cnstG = (fgColor >> 8) & 0xff; |
| cnstB = (fgColor ) & 0xff; |
| |
| if (cnstA != 0xff) { |
| cnstR = mul8table[cnstA][cnstR]; |
| cnstG = mul8table[cnstA][cnstG]; |
| cnstB = mul8table[cnstA][cnstB]; |
| } |
| |
| cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB); |
| |
| SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval; |
| SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval; |
| SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval; |
| SrcOpAdd -= SrcOpXor; |
| |
| log_val[0] = SrcOpAnd; |
| log_val[1] = SrcOpXor; |
| log_val[2] = SrcOpAdd; |
| |
| DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval; |
| DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval; |
| DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval; |
| DstOpAdd -= DstOpXor; |
| |
| dstFbase = (((cnstA) & DstOpAnd) ^ DstOpXor) + DstOpAdd; |
| |
| mul8_cnstF = mul8table[dstFbase]; |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| if (rasScan == 4*width && maskScan == width) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntArgbPreAlphaMaskFill_line(rasBase, pMask, width, cnstARGB0, |
| log_val, mul8_cnstF, |
| (void*)mul8table); |
| |
| PTR_ADD(rasBase, rasScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| if (rasScan == 4*width) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntArgPrebAlphaMaskFill_A1_line(rasBase, width, cnstARGB0, |
| log_val, dstFbase); |
| |
| PTR_ADD(rasBase, rasScan); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(FourByteAbgrPreAlphaMaskFill)(void *rasBase, |
| jubyte *pMask, |
| jint maskOff, |
| jint maskScan, |
| jint width, |
| jint height, |
| jint fgColor, |
| SurfaceDataRasInfo *pRasInfo, |
| NativePrimitive *pPrim, |
| CompositeInfo *pCompInfo) |
| { |
| mlib_d64 buff[BUFF_SIZE/2]; |
| void *pbuff = buff, *p_dst; |
| mlib_s32 cnstA, cnstR, cnstG, cnstB; |
| mlib_s32 rasScan = pRasInfo->scanStride; |
| mlib_f32 cnstARGB0; |
| mlib_u8 *mul8_cnstF; |
| mlib_s32 SrcOpAnd, SrcOpXor, SrcOpAdd; |
| mlib_s32 DstOpAnd, DstOpXor, DstOpAdd; |
| mlib_s32 dstFbase; |
| mlib_s32 log_val[3]; |
| mlib_s32 j; |
| |
| if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32)); |
| |
| cnstA = (fgColor >> 24) & 0xff; |
| cnstR = (fgColor >> 16) & 0xff; |
| cnstG = (fgColor >> 8) & 0xff; |
| cnstB = (fgColor ) & 0xff; |
| |
| if (cnstA != 0xff) { |
| cnstR = mul8table[cnstA][cnstR]; |
| cnstG = mul8table[cnstA][cnstG]; |
| cnstB = mul8table[cnstA][cnstB]; |
| } |
| |
| cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR); |
| |
| SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval; |
| SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval; |
| SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval; |
| SrcOpAdd -= SrcOpXor; |
| |
| log_val[0] = SrcOpAnd; |
| log_val[1] = SrcOpXor; |
| log_val[2] = SrcOpAdd; |
| |
| DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval; |
| DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval; |
| DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval; |
| DstOpAdd -= DstOpXor; |
| |
| dstFbase = (((cnstA) & DstOpAnd) ^ DstOpXor) + DstOpAdd; |
| |
| mul8_cnstF = mul8table[dstFbase]; |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| for (j = 0; j < height; j++) { |
| if ((mlib_s32)rasBase & 3) { |
| mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32)); |
| p_dst = pbuff; |
| } else { |
| p_dst = rasBase; |
| } |
| |
| IntArgbPreAlphaMaskFill_line(p_dst, pMask, width, cnstARGB0, |
| log_val, mul8_cnstF, |
| (void*)mul8table); |
| |
| if (p_dst != rasBase) { |
| mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32)); |
| } |
| |
| PTR_ADD(rasBase, rasScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| for (j = 0; j < height; j++) { |
| if ((mlib_s32)rasBase & 3) { |
| mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32)); |
| p_dst = pbuff; |
| } else { |
| p_dst = rasBase; |
| } |
| |
| IntArgPrebAlphaMaskFill_A1_line(p_dst, width, cnstARGB0, |
| log_val, dstFbase); |
| |
| if (p_dst != rasBase) { |
| mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32)); |
| } |
| |
| PTR_ADD(rasBase, rasScan); |
| } |
| } |
| |
| if (pbuff != buff) { |
| mlib_free(pbuff); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| /* ############################################################## |
| * IntArgbPreSrcMaskFill() |
| */ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, pathA, dstARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| \ |
| t0 = MUL8_VIS(cnstARGB0, pathA); \ |
| t1 = MUL8_VIS(dstARGB, (0xff - pathA)); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| void IntArgbPreSrcMaskFill_line(mlib_f32 *dst_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_d64 fgARGB, |
| mlib_f32 cnstARGB0); |
| |
| #pragma no_inline(IntArgbPreSrcMaskFill_line) |
| |
| void IntArgbPreSrcMaskFill_line(mlib_f32 *dst_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_d64 fgARGB, |
| mlib_f32 cnstARGB0) |
| { |
| mlib_s32 i, i0; |
| mlib_s32 pathA0, pathA1, msk; |
| mlib_d64 res0, res1, dstARGB; |
| mlib_f32 dstARGB0; |
| |
| i = i0 = 0; |
| |
| if ((mlib_s32)dst_ptr & 7) { |
| pathA0 = pMask[i]; |
| if (pathA0 == 0xff) { |
| dst_ptr[i] = vis_read_hi(fgARGB); |
| } else if (pathA0) { |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, pathA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| |
| i0 = 1; |
| } |
| |
| #pragma pipeloop(0) |
| for (i = i0; i <= width - 2; i += 2) { |
| pathA0 = pMask[i]; |
| pathA1 = pMask[i + 1]; |
| |
| dstARGB = *(mlib_d64*)(dst_ptr + i); |
| |
| msk = (((254 - pathA0) & (1 << 11)) | |
| ((254 - pathA1) & (1 << 10))) >> 10; |
| |
| MASK_FILL(res0, pathA0, vis_read_hi(dstARGB)); |
| MASK_FILL(res1, pathA1, vis_read_lo(dstARGB)); |
| |
| res0 = vis_fpack16_pair(res0, res1); |
| |
| *(mlib_d64*)(dst_ptr + i) = res0; |
| |
| vis_pst_32(fgARGB, dst_ptr + i, msk); |
| } |
| |
| if (i < width) { |
| pathA0 = pMask[i]; |
| if (pathA0 == 0xff) { |
| dst_ptr[i] = vis_read_hi(fgARGB); |
| } else if (pathA0) { |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, pathA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntArgbPreSrcMaskFill)(void *rasBase, |
| jubyte *pMask, |
| jint maskOff, |
| jint maskScan, |
| jint width, |
| jint height, |
| jint fgColor, |
| SurfaceDataRasInfo *pRasInfo, |
| NativePrimitive *pPrim, |
| CompositeInfo *pCompInfo) |
| { |
| mlib_s32 cnstA, cnstR, cnstG, cnstB; |
| mlib_s32 rasScan = pRasInfo->scanStride; |
| mlib_f32 cnstARGB0; |
| mlib_d64 fgARGB; |
| mlib_s32 j; |
| |
| cnstA = (fgColor >> 24) & 0xff; |
| cnstR = (fgColor >> 16) & 0xff; |
| cnstG = (fgColor >> 8) & 0xff; |
| cnstB = (fgColor ) & 0xff; |
| |
| if (cnstA != 0xff) { |
| #ifdef LOOPS_OLD_VERSION |
| if (cnstA == 0) return; |
| #endif |
| cnstR = mul8table[cnstA][cnstR]; |
| cnstG = mul8table[cnstA][cnstG]; |
| cnstB = mul8table[cnstA][cnstB]; |
| } |
| |
| if (pMask == NULL) { |
| #ifdef LOOPS_OLD_VERSION |
| ADD_SUFF(AnyIntSetRect)(pRasInfo, 0, 0, width, height, |
| fgColor, pPrim, pCompInfo); |
| #else |
| void *pBase = pRasInfo->rasBase; |
| pRasInfo->rasBase = rasBase; |
| if (cnstA != 0xff) { |
| fgColor = (cnstA << 24) | (cnstR << 16) | (cnstG << 8) | cnstB; |
| } |
| ADD_SUFF(AnyIntSetRect)(pRasInfo, |
| 0, 0, width, height, |
| fgColor, pPrim, pCompInfo); |
| pRasInfo->rasBase = pBase; |
| #endif |
| return; |
| } |
| |
| cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB); |
| |
| fgARGB = vis_to_double_dup(fgColor); |
| |
| pMask += maskOff; |
| |
| if (rasScan == 4*width && maskScan == width) { |
| width *= height; |
| height = 1; |
| } |
| |
| vis_write_gsr(0 << 3); |
| |
| for (j = 0; j < height; j++) { |
| IntArgbPreSrcMaskFill_line(rasBase, pMask, width, fgARGB, cnstARGB0); |
| |
| PTR_ADD(rasBase, rasScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(FourByteAbgrPreSrcMaskFill)(void *rasBase, |
| jubyte *pMask, |
| jint maskOff, |
| jint maskScan, |
| jint width, |
| jint height, |
| jint fgColor, |
| SurfaceDataRasInfo *pRasInfo, |
| NativePrimitive *pPrim, |
| CompositeInfo *pCompInfo) |
| { |
| mlib_d64 buff[BUFF_SIZE/2]; |
| void *pbuff = buff, *p_dst; |
| mlib_s32 cnstA, cnstR, cnstG, cnstB; |
| mlib_s32 rasScan = pRasInfo->scanStride; |
| mlib_f32 cnstARGB0; |
| mlib_d64 fgARGB; |
| mlib_s32 j; |
| |
| cnstA = (fgColor >> 24) & 0xff; |
| cnstR = (fgColor >> 16) & 0xff; |
| cnstG = (fgColor >> 8) & 0xff; |
| cnstB = (fgColor ) & 0xff; |
| |
| if (cnstA != 0xff) { |
| cnstR = mul8table[cnstA][cnstR]; |
| cnstG = mul8table[cnstA][cnstG]; |
| cnstB = mul8table[cnstA][cnstB]; |
| } |
| |
| if (pMask == NULL) { |
| void *pBase = pRasInfo->rasBase; |
| pRasInfo->rasBase = rasBase; |
| fgColor = (cnstR << 24) | (cnstG << 16) | (cnstB << 8) | cnstA; |
| ADD_SUFF(Any4ByteSetRect)(pRasInfo, |
| 0, 0, width, height, |
| fgColor, pPrim, pCompInfo); |
| pRasInfo->rasBase = pBase; |
| return; |
| } |
| |
| fgColor = (cnstA << 24) | (cnstB << 16) | (cnstG << 8) | cnstR; |
| cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR); |
| |
| fgARGB = vis_to_double_dup(fgColor); |
| |
| pMask += maskOff; |
| |
| vis_write_gsr(0 << 3); |
| |
| if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32)); |
| |
| for (j = 0; j < height; j++) { |
| if ((mlib_s32)rasBase & 3) { |
| mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32)); |
| p_dst = pbuff; |
| } else { |
| p_dst = rasBase; |
| } |
| |
| IntArgbPreSrcMaskFill_line(p_dst, pMask, width, fgARGB, cnstARGB0); |
| |
| if (p_dst != rasBase) { |
| mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32)); |
| } |
| |
| PTR_ADD(rasBase, rasScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| |
| if (pbuff != buff) { |
| mlib_free(pbuff); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| /* ############################################################## |
| * IntArgbPreSrcOverMaskFill() |
| */ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, pathA, dstARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 dstA; \ |
| \ |
| dstA = 0xff - mul8_cnstA[pathA]; \ |
| \ |
| t0 = MUL8_VIS(cnstARGB0, pathA); \ |
| t1 = MUL8_VIS(dstARGB, dstA); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| static void IntArgbPreSrcOverMaskFill_line(mlib_f32 *dst_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_f32 cnstARGB0, |
| mlib_u8 *mul8_cnstA); |
| |
| #pragma no_inline(IntArgbPreSrcOverMaskFill_line) |
| |
| static void IntArgbPreSrcOverMaskFill_line(mlib_f32 *dst_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_f32 cnstARGB0, |
| mlib_u8 *mul8_cnstA) |
| { |
| mlib_s32 i, i0; |
| mlib_s32 pathA0, pathA1; |
| mlib_d64 res0, res1, dstARGB; |
| mlib_f32 dstARGB0; |
| |
| i = i0 = 0; |
| |
| if ((mlib_s32)dst_ptr & 7) { |
| pathA0 = pMask[i]; |
| |
| if (pathA0) { |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, pathA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| |
| i0 = 1; |
| } |
| |
| #pragma pipeloop(0) |
| for (i = i0; i <= width - 2; i += 2) { |
| pathA0 = pMask[i]; |
| pathA1 = pMask[i + 1]; |
| dstARGB = *(mlib_d64*)(dst_ptr + i); |
| |
| MASK_FILL(res0, pathA0, vis_read_hi(dstARGB)); |
| MASK_FILL(res1, pathA1, vis_read_lo(dstARGB)); |
| |
| res0 = vis_fpack16_pair(res0, res1); |
| |
| *(mlib_d64 *)(dst_ptr + i) = res0; |
| } |
| |
| if (i < width) { |
| pathA0 = pMask[i]; |
| |
| if (pathA0) { |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, pathA0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, dstARGB) \ |
| { \ |
| rr = MUL8_VIS(dstARGB, cnstA); \ |
| rr = vis_fpadd16(rr, cnstARGB); \ |
| } |
| |
| /***************************************************************/ |
| |
| static void IntArgbPreSrcOverMaskFill_A1_line(mlib_f32 *dst_ptr, |
| mlib_s32 width, |
| mlib_d64 cnstARGB, |
| mlib_s32 cnstA); |
| |
| #pragma no_inline(IntArgbPreSrcOverMaskFill_A1_line) |
| |
| static void IntArgbPreSrcOverMaskFill_A1_line(mlib_f32 *dst_ptr, |
| mlib_s32 width, |
| mlib_d64 cnstARGB, |
| mlib_s32 cnstA) |
| { |
| mlib_s32 i, i0; |
| mlib_d64 res0, res1, dstARGB; |
| mlib_f32 dstARGB0; |
| |
| cnstA = 0xff - cnstA; |
| |
| i = i0 = 0; |
| |
| if ((mlib_s32)dst_ptr & 7) { |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| i0 = 1; |
| } |
| |
| #pragma pipeloop(0) |
| for (i = i0; i <= width - 2; i += 2) { |
| dstARGB = *(mlib_d64*)(dst_ptr + i); |
| |
| MASK_FILL(res0, vis_read_hi(dstARGB)); |
| MASK_FILL(res1, vis_read_lo(dstARGB)); |
| |
| res0 = vis_fpack16_pair(res0, res1); |
| |
| *(mlib_d64*)(dst_ptr + i) = res0; |
| } |
| |
| if (i < width) { |
| dstARGB0 = dst_ptr[i]; |
| MASK_FILL(res0, dstARGB0); |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntArgbPreSrcOverMaskFill)(void *rasBase, |
| jubyte *pMask, |
| jint maskOff, |
| jint maskScan, |
| jint width, |
| jint height, |
| jint fgColor, |
| SurfaceDataRasInfo *pRasInfo, |
| NativePrimitive *pPrim, |
| CompositeInfo *pCompInfo) |
| { |
| mlib_s32 cnstA, cnstR, cnstG, cnstB; |
| mlib_s32 rasScan = pRasInfo->scanStride; |
| mlib_f32 cnstARGB0; |
| mlib_d64 cnstARGB; |
| mlib_u8 *mul8_cnstA; |
| mlib_s32 j; |
| |
| cnstA = (fgColor >> 24) & 0xff; |
| cnstR = (fgColor >> 16) & 0xff; |
| cnstG = (fgColor >> 8) & 0xff; |
| cnstB = (fgColor ) & 0xff; |
| |
| if (cnstA != 0xff) { |
| if (cnstA == 0) return; |
| |
| cnstR = mul8table[cnstA][cnstR]; |
| cnstG = mul8table[cnstA][cnstG]; |
| cnstB = mul8table[cnstA][cnstB]; |
| } |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| if (rasScan == 4*width && maskScan == width) { |
| width *= height; |
| height = 1; |
| } |
| |
| mul8_cnstA = mul8table[cnstA]; |
| |
| cnstARGB0 = F32_FROM_U8x4(cnstA, cnstR, cnstG, cnstB); |
| |
| for (j = 0; j < height; j++) { |
| IntArgbPreSrcOverMaskFill_line(rasBase, pMask, width, cnstARGB0, |
| mul8_cnstA); |
| |
| PTR_ADD(rasBase, rasScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| if (rasScan == 4*width) { |
| width *= height; |
| height = 1; |
| } |
| |
| cnstARGB = vis_to_double((cnstA << 23) | (cnstR << 7), |
| (cnstG << 23) | (cnstB << 7)); |
| |
| for (j = 0; j < height; j++) { |
| IntArgbPreSrcOverMaskFill_A1_line(rasBase, width, cnstARGB, cnstA); |
| |
| PTR_ADD(rasBase, rasScan); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(FourByteAbgrPreSrcOverMaskFill)(void *rasBase, |
| jubyte *pMask, |
| jint maskOff, |
| jint maskScan, |
| jint width, |
| jint height, |
| jint fgColor, |
| SurfaceDataRasInfo *pRasInfo, |
| NativePrimitive *pPrim, |
| CompositeInfo *pCompInfo) |
| { |
| mlib_d64 buff[BUFF_SIZE/2]; |
| void *pbuff = buff, *p_dst; |
| mlib_s32 cnstA, cnstR, cnstG, cnstB; |
| mlib_s32 rasScan = pRasInfo->scanStride; |
| mlib_f32 cnstARGB0; |
| mlib_d64 cnstARGB; |
| mlib_u8 *mul8_cnstA; |
| mlib_s32 j; |
| |
| if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32)); |
| |
| cnstA = (fgColor >> 24) & 0xff; |
| cnstR = (fgColor >> 16) & 0xff; |
| cnstG = (fgColor >> 8) & 0xff; |
| cnstB = (fgColor ) & 0xff; |
| |
| if (cnstA != 0xff) { |
| if (cnstA == 0) return; |
| |
| cnstR = mul8table[cnstA][cnstR]; |
| cnstG = mul8table[cnstA][cnstG]; |
| cnstB = mul8table[cnstA][cnstB]; |
| } |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| mul8_cnstA = mul8table[cnstA]; |
| |
| cnstARGB0 = F32_FROM_U8x4(cnstA, cnstB, cnstG, cnstR); |
| |
| for (j = 0; j < height; j++) { |
| if ((mlib_s32)rasBase & 3) { |
| mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32)); |
| p_dst = pbuff; |
| } else { |
| p_dst = rasBase; |
| } |
| |
| IntArgbPreSrcOverMaskFill_line(p_dst, pMask, width, cnstARGB0, |
| mul8_cnstA); |
| |
| if (p_dst != rasBase) { |
| mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32)); |
| } |
| |
| PTR_ADD(rasBase, rasScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| cnstARGB = vis_to_double((cnstA << 23) | (cnstB << 7), |
| (cnstG << 23) | (cnstR << 7)); |
| |
| for (j = 0; j < height; j++) { |
| if ((mlib_s32)rasBase & 3) { |
| mlib_ImageCopy_na(rasBase, pbuff, width*sizeof(mlib_s32)); |
| p_dst = pbuff; |
| } else { |
| p_dst = rasBase; |
| } |
| |
| IntArgbPreSrcOverMaskFill_A1_line(p_dst, width, cnstARGB, cnstA); |
| |
| if (p_dst != rasBase) { |
| mlib_ImageCopy_na(p_dst, rasBase, width*sizeof(mlib_s32)); |
| } |
| |
| PTR_ADD(rasBase, rasScan); |
| } |
| } |
| |
| if (pbuff != buff) { |
| mlib_free(pbuff); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| /* ############################################################## |
| * IntArgbToIntArgbPreSrcOverMaskBlit() |
| */ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, pathA, dstARGB, srcA, srcARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 dstF; \ |
| \ |
| srcA = MUL8_INT(mul8_extra[pathA], srcA); \ |
| dstF = 0xff - srcA; \ |
| \ |
| t0 = MUL8_VIS(srcARGB, srcA); \ |
| t1 = MUL8_VIS(dstARGB, dstF); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| static void IntArgbToIntArgbPreSrcOverMaskBlit_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_u8 *mul8_extra, |
| mlib_u8 *mul8_tbl); |
| |
| #pragma no_inline(IntArgbToIntArgbPreSrcOverMaskBlit_line) |
| |
| static void IntArgbToIntArgbPreSrcOverMaskBlit_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_u8 *mul8_extra, |
| mlib_u8 *mul8_tbl) |
| { |
| mlib_s32 i, i0; |
| mlib_s32 pathA0, pathA1, srcA0, srcA1; |
| mlib_d64 res0, res1, dstARGB, srcARGB; |
| mlib_f32 dstARGB0, srcARGB0; |
| mlib_d64 or_alpha = vis_to_double_dup(0xff000000); |
| |
| i = i0 = 0; |
| |
| if ((mlib_s32)dst_ptr & 7) { |
| pathA0 = pMask[i]; |
| srcA0 = *(mlib_u8*)(src_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| srcARGB0 = src_ptr[i]; |
| srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0); |
| MASK_FILL(res0, pathA0, dstARGB0, srcA0, srcARGB0); |
| if (srcA0) { |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| |
| i0 = 1; |
| } |
| |
| #pragma pipeloop(0) |
| for (i = i0; i <= width - 2; i += 2) { |
| pathA0 = pMask[i]; |
| pathA1 = pMask[i + 1]; |
| dstARGB = *(mlib_d64*)(dst_ptr + i); |
| srcA0 = *(mlib_u8*)(src_ptr + i); |
| srcA1 = *(mlib_u8*)(src_ptr + i + 1); |
| srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]); |
| srcARGB = vis_for(or_alpha, srcARGB); |
| |
| MASK_FILL(res0, pathA0, vis_read_hi(dstARGB), |
| srcA0, vis_read_hi(srcARGB)); |
| MASK_FILL(res1, pathA1, vis_read_lo(dstARGB), |
| srcA1, vis_read_lo(srcARGB)); |
| |
| res0 = vis_fpack16_pair(res0, res1); |
| |
| *(mlib_d64*)(dst_ptr + i) = res0; |
| } |
| |
| if (i < width) { |
| pathA0 = pMask[i]; |
| srcA0 = *(mlib_u8*)(src_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| srcARGB0 = src_ptr[i]; |
| srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0); |
| MASK_FILL(res0, pathA0, dstARGB0, srcA0, srcARGB0); |
| if (srcA0) { |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, dstARGB, srcA, srcARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 dstF; \ |
| \ |
| srcA = mul8_extra[srcA]; \ |
| dstF = 0xff - srcA; \ |
| \ |
| t0 = MUL8_VIS(srcARGB, srcA); \ |
| t1 = MUL8_VIS(dstARGB, dstF); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| static void IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_s32 width, |
| mlib_u8 *mul8_extra); |
| |
| #pragma no_inline(IntArgbToIntArgbPreSrcOverMaskBlit_A1_line) |
| |
| static void IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_s32 width, |
| mlib_u8 *mul8_extra) |
| { |
| mlib_s32 i, i0; |
| mlib_s32 srcA0, srcA1; |
| mlib_d64 res0, res1, dstARGB, srcARGB; |
| mlib_f32 dstARGB0, srcARGB0; |
| mlib_d64 or_alpha = vis_to_double_dup(0xff000000); |
| |
| i = i0 = 0; |
| |
| if ((mlib_s32)dst_ptr & 7) { |
| srcA0 = *(mlib_u8*)(src_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| srcARGB0 = src_ptr[i]; |
| srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0); |
| MASK_FILL(res0, dstARGB0, srcA0, srcARGB0); |
| if (srcA0) { |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| |
| i0 = 1; |
| } |
| |
| #pragma pipeloop(0) |
| for (i = i0; i <= width - 2; i += 2) { |
| dstARGB = *(mlib_d64*)(dst_ptr + i); |
| srcA0 = *(mlib_u8*)(src_ptr + i); |
| srcA1 = *(mlib_u8*)(src_ptr + i + 1); |
| srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]); |
| srcARGB = vis_for(or_alpha, srcARGB); |
| |
| MASK_FILL(res0, vis_read_hi(dstARGB), srcA0, vis_read_hi(srcARGB)); |
| MASK_FILL(res1, vis_read_lo(dstARGB), srcA1, vis_read_lo(srcARGB)); |
| |
| res0 = vis_fpack16_pair(res0, res1); |
| *(mlib_d64*)(dst_ptr + i) = res0; |
| } |
| |
| if (i < width) { |
| srcA0 = *(mlib_u8*)(src_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| srcARGB0 = src_ptr[i]; |
| srcARGB0 = vis_fors(vis_read_hi(or_alpha), srcARGB0); |
| MASK_FILL(res0, dstARGB0, srcA0, srcARGB0); |
| if (srcA0) { |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntArgbToIntArgbPreSrcOverMaskBlit)(MASKBLIT_PARAMS) |
| { |
| mlib_s32 extraA; |
| mlib_s32 dstScan = pDstInfo->scanStride; |
| mlib_s32 srcScan = pSrcInfo->scanStride; |
| mlib_u8 *mul8_extra; |
| mlib_s32 j; |
| |
| extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5); |
| |
| mul8_extra = mul8table[extraA]; |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| if (dstScan == 4*width && srcScan == dstScan && maskScan == width) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntArgbToIntArgbPreSrcOverMaskBlit_line(dstBase, srcBase, pMask, |
| width, mul8_extra, |
| (void*)mul8table); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| if (dstScan == 4*width && srcScan == dstScan) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(dstBase, srcBase, width, |
| mul8_extra); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntArgbToFourByteAbgrPreSrcOverMaskBlit)(MASKBLIT_PARAMS) |
| { |
| mlib_d64 buff[BUFF_SIZE/2]; |
| void *pbuff = buff; |
| mlib_s32 extraA; |
| mlib_s32 dstScan = pDstInfo->scanStride; |
| mlib_s32 srcScan = pSrcInfo->scanStride; |
| mlib_u8 *mul8_extra; |
| mlib_s32 j; |
| |
| if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32)); |
| |
| extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5); |
| |
| mul8_extra = mul8table[extraA]; |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| for (j = 0; j < height; j++) { |
| ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| IntArgbToIntArgbPreSrcOverMaskBlit_line(pbuff, srcBase, pMask, |
| width, mul8_extra, |
| (void*)mul8table); |
| |
| ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| for (j = 0; j < height; j++) { |
| ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| IntArgbToIntArgbPreSrcOverMaskBlit_A1_line(pbuff, srcBase, width, |
| mul8_extra); |
| |
| ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| } |
| } |
| |
| if (pbuff != buff) { |
| mlib_free(pbuff); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| /* ############################################################## |
| * IntArgbToIntArgbPreAlphaMaskBlit() |
| */ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 srcF, dstF; \ |
| \ |
| srcA = mul8_extra[srcA]; \ |
| \ |
| srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \ |
| dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \ |
| \ |
| srcF = MUL8_INT(pathA, srcF); \ |
| dstF = MUL8_INT(pathA, dstF) + (0xff - pathA); \ |
| \ |
| srcA = MUL8_INT(srcF, srcA); \ |
| \ |
| t0 = MUL8_VIS(srcARGB, srcA); \ |
| t1 = MUL8_VIS(dstARGB, dstF); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /**************************************************************/ |
| |
| static void IntArgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_u8 *mul8_extra, |
| mlib_u8 *mul8_tbl); |
| |
| #pragma no_inline(IntArgbToIntArgbPreAlphaMaskBlit_line) |
| |
| static void IntArgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_u8 *mul8_extra, |
| mlib_u8 *mul8_tbl) |
| { |
| mlib_s32 i; |
| mlib_s32 pathA0, dstA0, srcA0; |
| mlib_d64 res0; |
| mlib_f32 dstARGB0, srcARGB0; |
| mlib_s32 SrcOpAnd = log_val[0]; |
| mlib_s32 SrcOpXor = log_val[1]; |
| mlib_s32 SrcOpAdd = log_val[2]; |
| mlib_s32 DstOpAnd = log_val[3]; |
| mlib_s32 DstOpXor = log_val[4]; |
| mlib_s32 DstOpAdd = log_val[5]; |
| mlib_f32 or_alpha = vis_to_float(0xff000000); |
| |
| #pragma pipeloop(0) |
| for (i = 0; i < width; i++) { |
| |
| pathA0 = pMask[i]; |
| |
| dstA0 = *(mlib_u8*)dst_ptr; |
| |
| dstARGB0 = *dst_ptr; |
| srcA0 = *(mlib_u8*)src_ptr; |
| srcARGB0 = *src_ptr; |
| srcARGB0 = vis_fors(or_alpha, srcARGB0); |
| |
| MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0); |
| |
| *dst_ptr = vis_fpack16(res0); |
| dst_ptr++; |
| src_ptr++; |
| } |
| |
| } |
| |
| /***************************************************************/ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, dstA, dstARGB, srcA, srcARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 srcF, dstF; \ |
| \ |
| srcA = mul8_extra[srcA]; \ |
| \ |
| srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \ |
| dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \ |
| \ |
| srcA = MUL8_INT(srcF, srcA); \ |
| \ |
| t0 = MUL8_VIS(srcARGB, srcA); \ |
| t1 = MUL8_VIS(dstARGB, dstF); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| static void IntArgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_u8 *mul8_extra, |
| mlib_u8 *mul8_tbl); |
| |
| #pragma no_inline(IntArgbToIntArgbPreAlphaMaskBlit_A1_line) |
| |
| static void IntArgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_u8 *mul8_extra, |
| mlib_u8 *mul8_tbl) |
| { |
| mlib_s32 i; |
| mlib_s32 dstA0, srcA0; |
| mlib_d64 res0; |
| mlib_f32 dstARGB0, srcARGB0; |
| mlib_s32 SrcOpAnd = log_val[0]; |
| mlib_s32 SrcOpXor = log_val[1]; |
| mlib_s32 SrcOpAdd = log_val[2]; |
| mlib_s32 DstOpAnd = log_val[3]; |
| mlib_s32 DstOpXor = log_val[4]; |
| mlib_s32 DstOpAdd = log_val[5]; |
| mlib_f32 or_alpha = vis_to_float(0xff000000); |
| |
| #pragma pipeloop(0) |
| for (i = 0; i < width; i++) { |
| dstA0 = *(mlib_u8*)(dst_ptr + i); |
| srcA0 = *(mlib_u8*)(src_ptr + i); |
| dstARGB0 = dst_ptr[i]; |
| srcARGB0 = src_ptr[i]; |
| srcARGB0 = vis_fors(or_alpha, srcARGB0); |
| |
| MASK_FILL(res0, dstA0, dstARGB0, srcA0, srcARGB0); |
| |
| dst_ptr[i] = vis_fpack16(res0); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntArgbToIntArgbPreAlphaMaskBlit)(MASKBLIT_PARAMS) |
| { |
| mlib_s32 extraA; |
| mlib_s32 dstScan = pDstInfo->scanStride; |
| mlib_s32 srcScan = pSrcInfo->scanStride; |
| mlib_s32 log_val[6]; |
| mlib_s32 j; |
| mlib_s32 SrcOpAnd; |
| mlib_s32 SrcOpXor; |
| mlib_s32 SrcOpAdd; |
| mlib_s32 DstOpAnd; |
| mlib_s32 DstOpXor; |
| mlib_s32 DstOpAdd; |
| mlib_u8 *mul8_extra; |
| |
| extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5); |
| |
| mul8_extra = mul8table[extraA]; |
| |
| SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval; |
| SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval; |
| SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval; |
| SrcOpAdd -= SrcOpXor; |
| |
| DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval; |
| DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval; |
| DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval; |
| DstOpAdd -= DstOpXor; |
| |
| log_val[0] = SrcOpAnd; |
| log_val[1] = SrcOpXor; |
| log_val[2] = SrcOpAdd; |
| log_val[3] = DstOpAnd; |
| log_val[4] = DstOpXor; |
| log_val[5] = DstOpAdd; |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| if (dstScan == 4*width && srcScan == dstScan && maskScan == width) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntArgbToIntArgbPreAlphaMaskBlit_line(dstBase, srcBase, pMask, |
| width, log_val, mul8_extra, |
| (void*)mul8table); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| if (dstScan == 4*width && srcScan == dstScan) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntArgbToIntArgbPreAlphaMaskBlit_A1_line(dstBase, srcBase, |
| width, log_val, mul8_extra, |
| (void*)mul8table); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntArgbToFourByteAbgrPreAlphaMaskBlit)(MASKBLIT_PARAMS) |
| { |
| mlib_d64 buff[BUFF_SIZE/2]; |
| void *pbuff = buff; |
| mlib_s32 extraA; |
| mlib_s32 dstScan = pDstInfo->scanStride; |
| mlib_s32 srcScan = pSrcInfo->scanStride; |
| mlib_s32 log_val[6]; |
| mlib_s32 j; |
| mlib_s32 SrcOpAnd; |
| mlib_s32 SrcOpXor; |
| mlib_s32 SrcOpAdd; |
| mlib_s32 DstOpAnd; |
| mlib_s32 DstOpXor; |
| mlib_s32 DstOpAdd; |
| mlib_u8 *mul8_extra; |
| |
| if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32)); |
| |
| extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5); |
| |
| mul8_extra = mul8table[extraA]; |
| |
| SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval; |
| SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval; |
| SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval; |
| SrcOpAdd -= SrcOpXor; |
| |
| DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval; |
| DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval; |
| DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval; |
| DstOpAdd -= DstOpXor; |
| |
| log_val[0] = SrcOpAnd; |
| log_val[1] = SrcOpXor; |
| log_val[2] = SrcOpAdd; |
| log_val[3] = DstOpAnd; |
| log_val[4] = DstOpXor; |
| log_val[5] = DstOpAdd; |
| |
| vis_write_gsr(0 << 3); |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| for (j = 0; j < height; j++) { |
| ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| IntArgbToIntArgbPreAlphaMaskBlit_line(pbuff, srcBase, pMask, |
| width, log_val, mul8_extra, |
| (void*)mul8table); |
| |
| ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| for (j = 0; j < height; j++) { |
| ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| IntArgbToIntArgbPreAlphaMaskBlit_A1_line(pbuff, srcBase, |
| width, log_val, mul8_extra, |
| (void*)mul8table); |
| |
| ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| } |
| } |
| |
| if (pbuff != buff) { |
| mlib_free(pbuff); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| /* ############################################################## |
| * IntRgbToIntArgbPreAlphaMaskBlit() |
| */ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 srcF, dstF; \ |
| \ |
| srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \ |
| \ |
| srcF = MUL8_INT(pathA, srcF); \ |
| dstF = mul8_tbl[pathA + dstF_0] + (0xff - pathA); \ |
| \ |
| srcF = mul8_tbl[srcF + srcA]; \ |
| \ |
| t0 = MUL8_VIS(srcARGB, srcF); \ |
| t1 = MUL8_VIS(dstARGB, dstF); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /**************************************************************/ |
| |
| static void IntRgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_s32 extraA, |
| mlib_s32 dstF_0, |
| mlib_u8 *mul8_tbl); |
| |
| #pragma no_inline(IntRgbToIntArgbPreAlphaMaskBlit_line) |
| |
| static void IntRgbToIntArgbPreAlphaMaskBlit_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_u8 *pMask, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_s32 extraA, |
| mlib_s32 dstF_0, |
| mlib_u8 *mul8_tbl) |
| { |
| mlib_s32 i; |
| mlib_s32 pathA0, dstA0, srcA0; |
| mlib_d64 res0; |
| mlib_f32 dstARGB0, srcARGB0; |
| mlib_s32 SrcOpAnd = log_val[0]; |
| mlib_s32 SrcOpXor = log_val[1]; |
| mlib_s32 SrcOpAdd = log_val[2]; |
| mlib_f32 or_alpha = vis_to_float(0xff000000); |
| |
| srcA0 = extraA*256; |
| dstF_0 *= 256; |
| |
| #pragma pipeloop(0) |
| for (i = 0; i < width; i++) { |
| pathA0 = pMask[i]; |
| |
| dstA0 = *(mlib_u8*)dst_ptr; |
| dstARGB0 = *dst_ptr; |
| srcARGB0 = *src_ptr; |
| |
| srcARGB0 = vis_fors(or_alpha, srcARGB0); |
| |
| MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0); |
| |
| *dst_ptr = vis_fpack16(res0); |
| dst_ptr++; |
| src_ptr++; |
| } |
| } |
| |
| /***************************************************************/ |
| |
| #undef MASK_FILL |
| #define MASK_FILL(rr, dstA, dstARGB, srcA, srcARGB) \ |
| { \ |
| mlib_d64 t0, t1; \ |
| mlib_s32 srcF; \ |
| \ |
| srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \ |
| \ |
| srcF = mul8_tbl[srcF + srcA]; \ |
| \ |
| t0 = MUL8_VIS(srcARGB, srcF); \ |
| t1 = MUL8_VIS(dstARGB, dstF_0); \ |
| rr = vis_fpadd16(t0, t1); \ |
| } |
| |
| /***************************************************************/ |
| |
| static void IntRgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_s32 extraA, |
| mlib_s32 dstF_0, |
| mlib_u8 *mul8_tbl); |
| |
| #pragma no_inline(IntRgbToIntArgbPreAlphaMaskBlit_A1_line) |
| |
| static void IntRgbToIntArgbPreAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr, |
| mlib_f32 *src_ptr, |
| mlib_s32 width, |
| mlib_s32 *log_val, |
| mlib_s32 extraA, |
| mlib_s32 dstF_0, |
| mlib_u8 *mul8_tbl) |
| { |
| mlib_s32 i; |
| mlib_s32 dstA0, srcA0; |
| mlib_d64 res0; |
| mlib_f32 dstARGB0, srcARGB0; |
| mlib_s32 SrcOpAnd = log_val[0]; |
| mlib_s32 SrcOpXor = log_val[1]; |
| mlib_s32 SrcOpAdd = log_val[2]; |
| mlib_f32 or_alpha = vis_to_float(0xff000000); |
| |
| srcA0 = extraA*256; |
| |
| #pragma pipeloop(0) |
| for (i = 0; i < width; i++) { |
| dstA0 = *(mlib_u8*)dst_ptr; |
| |
| dstARGB0 = *dst_ptr; |
| srcARGB0 = *src_ptr; |
| srcARGB0 = vis_fors(or_alpha, srcARGB0); |
| |
| MASK_FILL(res0, dstA0, dstARGB0, srcA0, srcARGB0); |
| |
| *dst_ptr = vis_fpack16(res0); |
| |
| dst_ptr++; |
| src_ptr++; |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntRgbToIntArgbPreAlphaMaskBlit)(MASKBLIT_PARAMS) |
| { |
| mlib_s32 extraA; |
| mlib_s32 dstScan = pDstInfo->scanStride; |
| mlib_s32 srcScan = pSrcInfo->scanStride; |
| mlib_s32 log_val[3]; |
| mlib_s32 j; |
| mlib_s32 SrcOpAnd; |
| mlib_s32 SrcOpXor; |
| mlib_s32 SrcOpAdd; |
| mlib_s32 DstOpAnd; |
| mlib_s32 DstOpXor; |
| mlib_s32 DstOpAdd; |
| mlib_s32 dstF_0; |
| |
| extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5); |
| |
| SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval; |
| SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval; |
| SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval; |
| SrcOpAdd -= SrcOpXor; |
| |
| DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval; |
| DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval; |
| DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval; |
| DstOpAdd -= DstOpXor; |
| |
| log_val[0] = SrcOpAnd; |
| log_val[1] = SrcOpXor; |
| log_val[2] = SrcOpAdd; |
| |
| vis_write_gsr(0 << 3); |
| |
| dstF_0 = ((extraA & DstOpAnd) ^ DstOpXor) + DstOpAdd; |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| if (dstScan == 4*width && srcScan == dstScan && maskScan == width) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntRgbToIntArgbPreAlphaMaskBlit_line(dstBase, srcBase, pMask, |
| width, log_val, extraA, dstF_0, |
| (void*)mul8table); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| if (dstScan == 4*width && srcScan == dstScan) { |
| width *= height; |
| height = 1; |
| } |
| |
| for (j = 0; j < height; j++) { |
| IntRgbToIntArgbPreAlphaMaskBlit_A1_line(dstBase, srcBase, width, |
| log_val, extraA, dstF_0, |
| (void*)mul8table); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void ADD_SUFF(IntRgbToFourByteAbgrPreAlphaMaskBlit)(MASKBLIT_PARAMS) |
| { |
| mlib_d64 buff[BUFF_SIZE/2]; |
| void *pbuff = buff; |
| mlib_s32 extraA; |
| mlib_s32 dstScan = pDstInfo->scanStride; |
| mlib_s32 srcScan = pSrcInfo->scanStride; |
| mlib_s32 log_val[3]; |
| mlib_s32 j; |
| mlib_s32 SrcOpAnd; |
| mlib_s32 SrcOpXor; |
| mlib_s32 SrcOpAdd; |
| mlib_s32 DstOpAnd; |
| mlib_s32 DstOpXor; |
| mlib_s32 DstOpAdd; |
| mlib_s32 dstF_0; |
| |
| if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32)); |
| |
| extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5); |
| |
| SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval; |
| SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval; |
| SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval; |
| SrcOpAdd -= SrcOpXor; |
| |
| DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval; |
| DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval; |
| DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval; |
| DstOpAdd -= DstOpXor; |
| |
| log_val[0] = SrcOpAnd; |
| log_val[1] = SrcOpXor; |
| log_val[2] = SrcOpAdd; |
| |
| vis_write_gsr(0 << 3); |
| |
| dstF_0 = ((extraA & DstOpAnd) ^ DstOpXor) + DstOpAdd; |
| |
| if (pMask != NULL) { |
| pMask += maskOff; |
| |
| for (j = 0; j < height; j++) { |
| ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| IntRgbToIntArgbPreAlphaMaskBlit_line(pbuff, srcBase, pMask, width, |
| log_val, extraA, dstF_0, |
| (void*)mul8table); |
| |
| ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| PTR_ADD(pMask, maskScan); |
| } |
| } else { |
| for (j = 0; j < height; j++) { |
| ADD_SUFF(FourByteAbgrToIntArgbConvert)(dstBase, pbuff, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| IntRgbToIntArgbPreAlphaMaskBlit_A1_line(pbuff, srcBase, width, |
| log_val, extraA, dstF_0, |
| (void*)mul8table); |
| |
| ADD_SUFF(IntArgbToFourByteAbgrConvert)(pbuff, dstBase, width, 1, |
| pSrcInfo, pDstInfo, |
| pPrim, pCompInfo); |
| |
| PTR_ADD(dstBase, dstScan); |
| PTR_ADD(srcBase, srcScan); |
| } |
| } |
| |
| if (pbuff != buff) { |
| mlib_free(pbuff); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| #endif /* JAVA2D_NO_MLIB */ |