Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/java2d/loops/vis_AlphaMaskBlit.c
32288 views
/*1* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425#if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF)2627#include "vis_AlphaMacros.h"2829/***************************************************************/3031/* ##############################################################32* IntArgbToIntArgbAlphaMaskBlit()33* IntArgbToFourByteAbgrAlphaMaskBlit()34*/3536#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \37{ \38mlib_s32 srcF, dstF; \39\40srcA = mul8_extra[srcA]; \41\42srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \43dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \44\45srcF = MUL8_INT(pathA, srcF); \46dstF = MUL8_INT(pathA, dstF) + (0xff - pathA); \47\48srcA = MUL8_INT(srcF, srcA); \49dstA = MUL8_INT(dstF, dstA); \50\51BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA); \52}5354/***************************************************************/5556static void IntArgbToIntArgbAlphaMaskBlit_line(mlib_f32 *dst_ptr,57mlib_f32 *src_ptr,58mlib_u8 *pMask,59mlib_s32 width,60mlib_s32 *log_val,61mlib_u8 *mul8_extra,62mlib_u8 *mul8_tbl)63{64mlib_s32 i, i0;65mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;66mlib_d64 res0, res1, dstARGB;67mlib_f32 dstARGB0, srcARGB0, srcARGB1;68mlib_s32 SrcOpAnd = log_val[0];69mlib_s32 SrcOpXor = log_val[1];70mlib_s32 SrcOpAdd = log_val[2];71mlib_s32 DstOpAnd = log_val[3];72mlib_s32 DstOpXor = log_val[4];73mlib_s32 DstOpAdd = log_val[5];7475i = i0 = 0;7677if ((mlib_s32)dst_ptr & 7) {78pathA0 = pMask[i];79if (pathA0) {80dstA0 = *(mlib_u8*)(dst_ptr + i);81srcA0 = *(mlib_u8*)(src_ptr + i);82dstARGB0 = dst_ptr[i];83srcARGB0 = src_ptr[i];84MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);85dst_ptr[i] = vis_fpack16(res0);86*(mlib_u8*)(dst_ptr + i) = dstA0;87}8889i0 = 1;90}9192#pragma pipeloop(0)93for (i = i0; i <= width - 2; i += 2) {94pathA0 = pMask[i];95pathA1 = pMask[i + 1];96dstA0 = *(mlib_u8*)(dst_ptr + i);97dstA1 = *(mlib_u8*)(dst_ptr + i + 1);98dstARGB = *(mlib_d64*)(dst_ptr + i);99srcA0 = *(mlib_u8*)(src_ptr + i);100srcA1 = *(mlib_u8*)(src_ptr + i + 1);101srcARGB0 = src_ptr[i];102srcARGB1 = src_ptr[i + 1];103104MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);105MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);106107res0 = vis_fpack16_pair(res0, res1);108109msk = (((-pathA0) & (1 << 11)) | ((-pathA1) & (1 << 10))) >> 10;110vis_pst_32(res0, dst_ptr + i, msk);111112*(mlib_u8*)(dst_ptr + i ) = dstA0;113*(mlib_u8*)(dst_ptr + i + 1) = dstA1;114}115116if (i < width) {117pathA0 = pMask[i];118if (pathA0) {119dstA0 = *(mlib_u8*)(dst_ptr + i);120srcA0 = *(mlib_u8*)(src_ptr + i);121dstARGB0 = dst_ptr[i];122srcARGB0 = src_ptr[i];123MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);124dst_ptr[i] = vis_fpack16(res0);125*(mlib_u8*)(dst_ptr + i) = dstA0;126}127}128}129130/***************************************************************/131132#undef MASK_FILL133#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \134{ \135mlib_s32 srcF, dstF; \136\137srcA = mul8_extra[srcA]; \138\139srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \140dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \141\142srcA = MUL8_INT(srcF, srcA); \143dstA = MUL8_INT(dstF, dstA); \144\145BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA); \146}147148/***************************************************************/149150static void IntArgbToIntArgbAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,151mlib_f32 *src_ptr,152mlib_u8 *pMask,153mlib_s32 width,154mlib_s32 *log_val,155mlib_u8 *mul8_extra,156mlib_u8 *mul8_tbl)157{158mlib_s32 i;159mlib_s32 dstA0, srcA0;160mlib_d64 res0;161mlib_f32 dstARGB0, srcARGB0;162mlib_s32 SrcOpAnd = log_val[0];163mlib_s32 SrcOpXor = log_val[1];164mlib_s32 SrcOpAdd = log_val[2];165mlib_s32 DstOpAnd = log_val[3];166mlib_s32 DstOpXor = log_val[4];167mlib_s32 DstOpAdd = log_val[5];168169#pragma pipeloop(0)170for (i = 0; i < width; i++) {171dstA0 = *(mlib_u8*)(dst_ptr + i);172srcA0 = *(mlib_u8*)(src_ptr + i);173dstARGB0 = dst_ptr[i];174srcARGB0 = src_ptr[i];175MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);176dst_ptr[i] = vis_fpack16(res0);177*(mlib_u8*)(dst_ptr + i) = dstA0;178}179}180181/***************************************************************/182183void ADD_SUFF(IntArgbToIntArgbAlphaMaskBlit)(MASKBLIT_PARAMS)184{185mlib_s32 extraA;186mlib_s32 dstScan = pDstInfo->scanStride;187mlib_s32 srcScan = pSrcInfo->scanStride;188mlib_s32 log_val[6];189mlib_s32 j;190mlib_s32 SrcOpAnd;191mlib_s32 SrcOpXor;192mlib_s32 SrcOpAdd;193mlib_s32 DstOpAnd;194mlib_s32 DstOpXor;195mlib_s32 DstOpAdd;196mlib_u8 *mul8_extra;197198extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);199200mul8_extra = mul8table[extraA];201202SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;203SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;204SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;205SrcOpAdd -= SrcOpXor;206207DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;208DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;209DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;210DstOpAdd -= DstOpXor;211212log_val[0] = SrcOpAnd;213log_val[1] = SrcOpXor;214log_val[2] = SrcOpAdd;215log_val[3] = DstOpAnd;216log_val[4] = DstOpXor;217log_val[5] = DstOpAdd;218219vis_write_gsr(7 << 3);220221if (pMask != NULL) {222pMask += maskOff;223224if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {225width *= height;226height = 1;227}228229for (j = 0; j < height; j++) {230IntArgbToIntArgbAlphaMaskBlit_line(dstBase, srcBase, pMask,231width, log_val, mul8_extra,232(void*)mul8table);233234PTR_ADD(dstBase, dstScan);235PTR_ADD(srcBase, srcScan);236PTR_ADD(pMask, maskScan);237}238} else {239if (dstScan == 4*width && srcScan == dstScan) {240width *= height;241height = 1;242}243244for (j = 0; j < height; j++) {245IntArgbToIntArgbAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,246width, log_val, mul8_extra,247(void*)mul8table);248249PTR_ADD(dstBase, dstScan);250PTR_ADD(srcBase, srcScan);251}252}253}254255/***************************************************************/256257void ADD_SUFF(IntArgbToFourByteAbgrAlphaMaskBlit)(MASKBLIT_PARAMS)258{259mlib_d64 buff[BUFF_SIZE/2];260void *src_buff = buff, *dst_buff;261mlib_s32 extraA;262mlib_s32 dstScan = pDstInfo->scanStride;263mlib_s32 srcScan = pSrcInfo->scanStride;264mlib_s32 log_val[6];265mlib_s32 j;266mlib_s32 SrcOpAnd;267mlib_s32 SrcOpXor;268mlib_s32 SrcOpAdd;269mlib_s32 DstOpAnd;270mlib_s32 DstOpXor;271mlib_s32 DstOpAdd;272mlib_u8 *mul8_extra;273274extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);275276mul8_extra = mul8table[extraA];277278SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;279SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;280SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;281SrcOpAdd -= SrcOpXor;282283DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;284DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;285DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;286DstOpAdd -= DstOpXor;287288log_val[0] = SrcOpAnd;289log_val[1] = SrcOpXor;290log_val[2] = SrcOpAdd;291log_val[3] = DstOpAnd;292log_val[4] = DstOpXor;293log_val[5] = DstOpAdd;294295vis_write_gsr(7 << 3);296297if (2*width > BUFF_SIZE) src_buff = mlib_malloc(2*width*sizeof(mlib_s32));298dst_buff = (mlib_s32*)src_buff + width;299300if (pMask != NULL) {301pMask += maskOff;302303for (j = 0; j < height; j++) {304IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);305if (!((mlib_s32)dstBase & 3)) {306IntArgbToIntArgbAlphaMaskBlit_line(dstBase, src_buff, pMask,307width, log_val, mul8_extra,308(void*)mul8table);309} else {310mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));311IntArgbToIntArgbAlphaMaskBlit_line(dst_buff, src_buff, pMask,312width, log_val, mul8_extra,313(void*)mul8table);314mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));315}316317PTR_ADD(dstBase, dstScan);318PTR_ADD(srcBase, srcScan);319PTR_ADD(pMask, maskScan);320}321} else {322for (j = 0; j < height; j++) {323IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);324if (!((mlib_s32)dstBase & 3)) {325IntArgbToIntArgbAlphaMaskBlit_A1_line(dstBase, src_buff,326pMask, width, log_val,327mul8_extra,328(void*)mul8table);329} else {330mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));331IntArgbToIntArgbAlphaMaskBlit_A1_line(dst_buff, src_buff,332pMask, width, log_val,333mul8_extra,334(void*)mul8table);335mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));336}337338PTR_ADD(dstBase, dstScan);339PTR_ADD(srcBase, srcScan);340}341}342343if (src_buff != buff) {344mlib_free(src_buff);345}346}347348/***************************************************************/349350/* ##############################################################351* IntArgbToIntRgbAlphaMaskBlit()352*/353354#undef MASK_FILL355#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \356{ \357mlib_s32 srcF, dstF; \358\359srcA = mul8_extra[srcA]; \360dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \361\362srcF = mul8_srcF[pathA]; \363dstA = MUL8_INT(dstF, pathA) + (0xff - pathA); \364\365pathA = dstA - 0xff - srcF; \366/* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \367\368srcA = MUL8_INT(srcA, srcF); \369\370BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA); \371}372373/***************************************************************/374375static void IntArgbToIntRgbAlphaMaskBlit_line(mlib_f32 *dst_ptr,376mlib_f32 *src_ptr,377mlib_u8 *pMask,378mlib_s32 width,379mlib_s32 *log_val,380mlib_u8 *mul8_extra,381mlib_u8 *mul8_srcF,382mlib_u8 *mul8_tbl)383{384mlib_s32 i, i0;385mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;386mlib_d64 res0, res1, dstARGB;387mlib_f32 dstARGB0, srcARGB0, srcARGB1;388mlib_s32 DstOpAnd = log_val[3];389mlib_s32 DstOpXor = log_val[4];390mlib_s32 DstOpAdd = log_val[5];391392i = i0 = 0;393394if ((mlib_s32)dst_ptr & 7) {395pathA0 = pMask[i];396srcA0 = *(mlib_u8*)(src_ptr + i);397dstARGB0 = dst_ptr[i];398srcARGB0 = src_ptr[i];399MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);400if (pathA0) {401dst_ptr[i] = vis_fpack16(res0);402}403404i0 = 1;405}406407#pragma pipeloop(0)408for (i = i0; i <= width - 2; i += 2) {409pathA0 = pMask[i];410pathA1 = pMask[i + 1];411dstARGB = *(mlib_d64*)(dst_ptr + i);412srcA0 = *(mlib_u8*)(src_ptr + i);413srcA1 = *(mlib_u8*)(src_ptr + i + 1);414srcARGB0 = src_ptr[i];415srcARGB1 = src_ptr[i + 1];416417MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);418MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);419420res0 = vis_fpack16_pair(res0, res1);421422msk = (((pathA0) & (1 << 11)) | ((pathA1) & (1 << 10))) >> 10;423vis_pst_32(res0, dst_ptr + i, msk);424}425426if (i < width) {427pathA0 = pMask[i];428srcA0 = *(mlib_u8*)(src_ptr + i);429dstARGB0 = dst_ptr[i];430srcARGB0 = src_ptr[i];431MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);432if (pathA0) {433dst_ptr[i] = vis_fpack16(res0);434}435}436}437438/***************************************************************/439440#undef MASK_FILL441#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \442{ \443srcA = mul8_extra[srcA]; \444dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \445\446srcA = mul8_srcF[srcA]; \447\448pathA = dstA - srcF_255; \449/* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \450\451BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA); \452}453454/***************************************************************/455456static void IntArgbToIntRgbAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,457mlib_f32 *src_ptr,458mlib_u8 *pMask,459mlib_s32 width,460mlib_s32 *log_val,461mlib_u8 *mul8_extra,462mlib_u8 *mul8_srcF,463mlib_u8 *mul8_tbl)464{465mlib_s32 i, i0;466mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;467mlib_d64 res0, res1, dstARGB;468mlib_f32 dstARGB0, srcARGB0, srcARGB1;469mlib_s32 DstOpAnd = log_val[3];470mlib_s32 DstOpXor = log_val[4];471mlib_s32 DstOpAdd = log_val[5];472mlib_s32 srcF_255 = mul8_srcF[0xff] + 0xff;473474i = i0 = 0;475476if ((mlib_s32)dst_ptr & 7) {477srcA0 = *(mlib_u8*)(src_ptr + i);478dstARGB0 = dst_ptr[i];479srcARGB0 = src_ptr[i];480MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);481if (pathA0) {482dst_ptr[i] = vis_fpack16(res0);483}484485i0 = 1;486}487488#pragma pipeloop(0)489for (i = i0; i <= width - 2; i += 2) {490dstARGB = *(mlib_d64*)(dst_ptr + i);491srcA0 = *(mlib_u8*)(src_ptr + i);492srcA1 = *(mlib_u8*)(src_ptr + i + 1);493srcARGB0 = src_ptr[i];494srcARGB1 = src_ptr[i + 1];495496MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);497MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);498499res0 = vis_fpack16_pair(res0, res1);500501msk = (((pathA0) & (1 << 11)) | ((pathA1) & (1 << 10))) >> 10;502vis_pst_32(res0, dst_ptr + i, msk);503}504505if (i < width) {506srcA0 = *(mlib_u8*)(src_ptr + i);507dstARGB0 = dst_ptr[i];508srcARGB0 = src_ptr[i];509MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);510if (pathA0) {511dst_ptr[i] = vis_fpack16(res0);512}513}514}515516/***************************************************************/517518void ADD_SUFF(IntArgbToIntRgbAlphaMaskBlit)(MASKBLIT_PARAMS)519{520mlib_s32 extraA, srcF;521mlib_s32 dstScan = pDstInfo->scanStride;522mlib_s32 srcScan = pSrcInfo->scanStride;523mlib_s32 log_val[6];524mlib_s32 j;525mlib_s32 SrcOpAnd;526mlib_s32 SrcOpXor;527mlib_s32 SrcOpAdd;528mlib_s32 DstOpAnd;529mlib_s32 DstOpXor;530mlib_s32 DstOpAdd;531mlib_u8 *mul8_extra, *mul8_srcF;532533extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);534535mul8_extra = mul8table[extraA];536537SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;538SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;539SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;540SrcOpAdd -= SrcOpXor;541542DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;543DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;544DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;545DstOpAdd -= DstOpXor;546547log_val[3] = DstOpAnd;548log_val[4] = DstOpXor;549log_val[5] = DstOpAdd;550551srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;552553mul8_srcF = mul8table[srcF];554555vis_write_gsr(7 << 3);556557if (pMask != NULL) {558pMask += maskOff;559560if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {561width *= height;562height = 1;563}564565for (j = 0; j < height; j++) {566IntArgbToIntRgbAlphaMaskBlit_line(dstBase, srcBase, pMask,567width, log_val, mul8_extra,568mul8_srcF, (void*)mul8table);569570PTR_ADD(dstBase, dstScan);571PTR_ADD(srcBase, srcScan);572PTR_ADD(pMask, maskScan);573}574} else {575if (dstScan == 4*width && srcScan == dstScan) {576width *= height;577height = 1;578}579580for (j = 0; j < height; j++) {581IntArgbToIntRgbAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,582width, log_val, mul8_extra,583mul8_srcF, (void*)mul8table);584585PTR_ADD(dstBase, dstScan);586PTR_ADD(srcBase, srcScan);587}588}589}590591/***************************************************************/592593/* ##############################################################594* IntRgbToIntArgbAlphaMaskBlit()595*/596597#undef MASK_FILL598#define MASK_FILL(rr, pathA, dstA, dstARGB, srcAX, srcARGB) \599{ \600mlib_s32 pathAx256 = pathA << 8; \601srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \602\603srcF = mul8_tbl[pathAx256 + srcF]; \604dstFX = mul8_tbl[pathAx256 + dstF] + (0xff - pathA); \605\606srcAX = mul8_tbl[srcF + srcAx256]; \607dstA = mul8_tbl[dstFX + (dstA << 8)]; \608\609BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcAX); \610}611612/***************************************************************/613614static void IntRgbToIntArgbAlphaMaskBlit_line(mlib_f32 *dst_ptr,615mlib_f32 *src_ptr,616mlib_u8 *pMask,617mlib_s32 width,618mlib_s32 *log_val,619mlib_u8 *mul8_extra,620mlib_u8 *mul8_tbl)621{622mlib_s32 i, i0;623mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA, srcA0, srcA1, msk;624mlib_d64 res0, res1, dstARGB;625mlib_f32 dstARGB0, srcARGB0, srcARGB1;626mlib_s32 SrcOpAnd = log_val[0];627mlib_s32 SrcOpXor = log_val[1];628mlib_s32 SrcOpAdd = log_val[2];629mlib_s32 DstOpAnd = log_val[3];630mlib_s32 DstOpXor = log_val[4];631mlib_s32 DstOpAdd = log_val[5];632mlib_s32 srcF, dstF, dstFX, srcAx256;633634i = i0 = 0;635636srcA = 0xFF;637srcA = mul8_extra[srcA];638srcAx256 = srcA << 8;639dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;640641if ((mlib_s32)dst_ptr & 7) {642pathA0 = pMask[i];643if (pathA0) {644dstA0 = *(mlib_u8*)(dst_ptr + i);645dstARGB0 = dst_ptr[i];646srcARGB0 = src_ptr[i];647MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);648dst_ptr[i] = vis_fpack16(res0);649*(mlib_u8*)(dst_ptr + i) = dstA0;650}651i0 = 1;652}653654#pragma pipeloop(0)655for (i = i0; i <= width - 2; i += 2) {656pathA0 = pMask[i];657pathA1 = pMask[i + 1];658dstA0 = *(mlib_u8*)(dst_ptr + i);659dstA1 = *(mlib_u8*)(dst_ptr + i + 1);660dstARGB = *(mlib_d64*)(dst_ptr + i);661srcARGB0 = src_ptr[i];662srcARGB1 = src_ptr[i + 1];663664MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);665MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);666667res0 = vis_fpack16_pair(res0, res1);668669msk = (((-pathA0) & (1 << 11)) | ((-pathA1) & (1 << 10))) >> 10;670vis_pst_32(res0, dst_ptr + i, msk);671672*(mlib_u8*)(dst_ptr + i ) = dstA0;673*(mlib_u8*)(dst_ptr + i + 1) = dstA1;674}675676if (i < width) {677pathA0 = pMask[i];678if (pathA0) {679dstA0 = *(mlib_u8*)(dst_ptr + i);680dstARGB0 = dst_ptr[i];681srcARGB0 = src_ptr[i];682MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);683dst_ptr[i] = vis_fpack16(res0);684*(mlib_u8*)(dst_ptr + i) = dstA0;685}686}687}688689/***************************************************************/690691#undef MASK_FILL692#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \693{ \694srcF = ((dstA & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd; \695\696srcA = mul8_tbl[srcF + srcAx256]; \697dstA = mul8_tbl[dstF + (dstA << 8)]; \698\699BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA); \700}701702/***************************************************************/703704static void IntRgbToIntArgbAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,705mlib_f32 *src_ptr,706mlib_u8 *pMask,707mlib_s32 width,708mlib_s32 *log_val,709mlib_u8 *mul8_extra,710mlib_u8 *mul8_tbl)711{712mlib_s32 i;713mlib_s32 dstA0, srcA, srcA0;714mlib_d64 res0;715mlib_f32 dstARGB0, srcARGB0;716mlib_s32 SrcOpAnd = log_val[0];717mlib_s32 SrcOpXor = log_val[1];718mlib_s32 SrcOpAdd = log_val[2];719mlib_s32 DstOpAnd = log_val[3];720mlib_s32 DstOpXor = log_val[4];721mlib_s32 DstOpAdd = log_val[5];722mlib_s32 srcF, dstF, srcAx256;723724srcA = 0xFF;725srcA = mul8_extra[srcA];726srcAx256 = srcA << 8;727dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;728729#pragma pipeloop(0)730for (i = 0; i < width; i++) {731dstA0 = *(mlib_u8*)(dst_ptr + i);732dstARGB0 = dst_ptr[i];733srcARGB0 = src_ptr[i];734MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);735dst_ptr[i] = vis_fpack16(res0);736*(mlib_u8*)(dst_ptr + i) = dstA0;737}738}739740/***************************************************************/741742void ADD_SUFF(IntRgbToIntArgbAlphaMaskBlit)(MASKBLIT_PARAMS)743{744mlib_s32 extraA;745mlib_s32 dstScan = pDstInfo->scanStride;746mlib_s32 srcScan = pSrcInfo->scanStride;747mlib_s32 log_val[6];748mlib_s32 j;749mlib_s32 SrcOpAnd;750mlib_s32 SrcOpXor;751mlib_s32 SrcOpAdd;752mlib_s32 DstOpAnd;753mlib_s32 DstOpXor;754mlib_s32 DstOpAdd;755mlib_u8 *mul8_extra;756757extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);758759mul8_extra = mul8table[extraA];760761SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;762SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;763SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;764SrcOpAdd -= SrcOpXor;765766DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;767DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;768DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;769DstOpAdd -= DstOpXor;770771log_val[0] = SrcOpAnd;772log_val[1] = SrcOpXor;773log_val[2] = SrcOpAdd;774log_val[3] = DstOpAnd;775log_val[4] = DstOpXor;776log_val[5] = DstOpAdd;777778vis_write_gsr(7 << 3);779780if (pMask != NULL) {781pMask += maskOff;782783if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {784width *= height;785height = 1;786}787788for (j = 0; j < height; j++) {789IntRgbToIntArgbAlphaMaskBlit_line(dstBase, srcBase, pMask,790width, log_val, mul8_extra,791(void*)mul8table);792793PTR_ADD(dstBase, dstScan);794PTR_ADD(srcBase, srcScan);795PTR_ADD(pMask, maskScan);796}797} else {798if (dstScan == 4*width && srcScan == dstScan) {799width *= height;800height = 1;801}802803for (j = 0; j < height; j++) {804IntRgbToIntArgbAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,805width, log_val, mul8_extra,806(void*)mul8table);807808PTR_ADD(dstBase, dstScan);809PTR_ADD(srcBase, srcScan);810}811}812}813814815/***************************************************************/816817void ADD_SUFF(IntRgbToFourByteAbgrAlphaMaskBlit)(MASKBLIT_PARAMS)818{819mlib_d64 buff[BUFF_SIZE/2];820void *src_buff = buff, *dst_buff;821mlib_s32 extraA;822mlib_s32 dstScan = pDstInfo->scanStride;823mlib_s32 srcScan = pSrcInfo->scanStride;824mlib_s32 log_val[6];825mlib_s32 j;826mlib_s32 SrcOpAnd;827mlib_s32 SrcOpXor;828mlib_s32 SrcOpAdd;829mlib_s32 DstOpAnd;830mlib_s32 DstOpXor;831mlib_s32 DstOpAdd;832mlib_u8 *mul8_extra;833834extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);835836mul8_extra = mul8table[extraA];837838SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;839SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;840SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;841SrcOpAdd -= SrcOpXor;842843DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;844DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;845DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;846DstOpAdd -= DstOpXor;847848log_val[0] = SrcOpAnd;849log_val[1] = SrcOpXor;850log_val[2] = SrcOpAdd;851log_val[3] = DstOpAnd;852log_val[4] = DstOpXor;853log_val[5] = DstOpAdd;854855vis_write_gsr(7 << 3);856857if (2*width > BUFF_SIZE) src_buff = mlib_malloc(2*width*sizeof(mlib_s32));858dst_buff = (mlib_s32*)src_buff + width;859860if (pMask != NULL) {861pMask += maskOff;862863for (j = 0; j < height; j++) {864IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);865if (!((mlib_s32)dstBase & 3)) {866IntRgbToIntArgbAlphaMaskBlit_line(dstBase, src_buff, pMask,867width, log_val, mul8_extra,868(void*)mul8table);869} else {870mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));871IntRgbToIntArgbAlphaMaskBlit_line(dst_buff, src_buff, pMask,872width, log_val, mul8_extra,873(void*)mul8table);874mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));875}876877PTR_ADD(dstBase, dstScan);878PTR_ADD(srcBase, srcScan);879PTR_ADD(pMask, maskScan);880}881} else {882for (j = 0; j < height; j++) {883IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);884if (!((mlib_s32)dstBase & 3)) {885IntRgbToIntArgbAlphaMaskBlit_A1_line(dstBase, src_buff, pMask,886width, log_val,887mul8_extra,888(void*)mul8table);889} else {890mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));891IntRgbToIntArgbAlphaMaskBlit_A1_line(dst_buff, src_buff, pMask,892width, log_val,893mul8_extra,894(void*)mul8table);895mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));896}897898PTR_ADD(dstBase, dstScan);899PTR_ADD(srcBase, srcScan);900}901}902903if (src_buff != buff) {904mlib_free(src_buff);905}906}907908/***************************************************************/909910/* ##############################################################911* IntArgbToIntBgrAlphaMaskBlit()912*/913914#undef MASK_FILL915#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \916srcA = mul8_extra[srcA]; \917dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \918\919srcF = mul8_srcF[pathA]; \920dstA = mul8_tbl[(pathA << 8) + dstF] + (0xff - pathA); \921\922pathA = dstA - 0xff - srcF; \923/* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \924\925srcA = MUL8_INT(srcA, srcF); \926\927BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA)928929/***************************************************************/930931static void IntArgbToIntBgrAlphaMaskBlit_line(mlib_f32 *dst_ptr,932mlib_f32 *src_ptr,933mlib_u8 *pMask,934mlib_s32 width,935mlib_s32 *log_val,936mlib_u8 *mul8_extra,937mlib_u8 *mul8_srcF,938mlib_u8 *mul8_tbl)939{940mlib_s32 i, i0;941mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;942mlib_d64 res0, res1, dstARGB, srcARGB;943mlib_f32 dstARGB0, srcARGB0;944mlib_s32 DstOpAnd = log_val[3];945mlib_s32 DstOpXor = log_val[4];946mlib_s32 DstOpAdd = log_val[5];947mlib_s32 srcF, dstF;948949#if VIS >= 0x200950vis_write_bmask(0x03214765, 0);951#endif952953i = i0 = 0;954955if ((mlib_s32)dst_ptr & 7) {956pathA0 = pMask[i];957srcA0 = *(mlib_u8*)(src_ptr + i);958dstARGB0 = dst_ptr[i];959srcARGB0 = src_ptr[i];960ARGB2ABGR_FL(srcARGB0)961MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);962if (pathA0) {963dst_ptr[i] = vis_fpack16(res0);964}965966i0 = 1;967}968969#pragma pipeloop(0)970for (i = i0; i <= width - 2; i += 2) {971pathA0 = pMask[i];972pathA1 = pMask[i + 1];973dstARGB = *(mlib_d64*)(dst_ptr + i);974srcA0 = *(mlib_u8*)(src_ptr + i);975srcA1 = *(mlib_u8*)(src_ptr + i + 1);976srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);977ARGB2ABGR_DB(srcARGB)978979MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),980srcA0, vis_read_hi(srcARGB));981MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB),982srcA1, vis_read_lo(srcARGB));983984res0 = vis_fpack16_pair(res0, res1);985986msk = (((pathA0) & (1 << 11)) | ((pathA1) & (1 << 10))) >> 10;987vis_pst_32(res0, dst_ptr + i, msk);988}989990if (i < width) {991pathA0 = pMask[i];992srcA0 = *(mlib_u8*)(src_ptr + i);993dstARGB0 = dst_ptr[i];994srcARGB0 = src_ptr[i];995ARGB2ABGR_FL(srcARGB0)996MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);997if (pathA0) {998dst_ptr[i] = vis_fpack16(res0);999}1000}1001}10021003/***************************************************************/10041005#undef MASK_FILL1006#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \1007srcA = mul8_extra[srcA]; \1008dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd; \1009\1010srcA = mul8_srcF[srcA]; \1011\1012pathA = dstA - srcF_255; \1013/* (pathA == 0) if (dstA == 0xFF && srcF == 0) */ \1014\1015BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA)10161017/***************************************************************/10181019static void IntArgbToIntBgrAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,1020mlib_f32 *src_ptr,1021mlib_u8 *pMask,1022mlib_s32 width,1023mlib_s32 *log_val,1024mlib_u8 *mul8_extra,1025mlib_u8 *mul8_srcF,1026mlib_u8 *mul8_tbl)1027{1028mlib_s32 i, i0;1029mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;1030mlib_d64 res0, res1, dstARGB, srcARGB;1031mlib_f32 dstARGB0, srcARGB0;1032mlib_s32 DstOpAnd = log_val[3];1033mlib_s32 DstOpXor = log_val[4];1034mlib_s32 DstOpAdd = log_val[5];1035mlib_s32 srcF_255 = mul8_srcF[0xff] + 0xff;10361037#if VIS >= 0x2001038vis_write_bmask(0x03214765, 0);1039#endif10401041i = i0 = 0;10421043if ((mlib_s32)dst_ptr & 7) {1044srcA0 = *(mlib_u8*)(src_ptr + i);1045dstARGB0 = dst_ptr[i];1046srcARGB0 = src_ptr[i];1047ARGB2ABGR_FL(srcARGB0)1048MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);1049if (pathA0) {1050dst_ptr[i] = vis_fpack16(res0);1051}10521053i0 = 1;1054}10551056#pragma pipeloop(0)1057for (i = i0; i <= width - 2; i += 2) {1058dstARGB = *(mlib_d64*)(dst_ptr + i);1059srcA0 = *(mlib_u8*)(src_ptr + i);1060srcA1 = *(mlib_u8*)(src_ptr + i + 1);1061srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);1062ARGB2ABGR_DB(srcARGB)10631064MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),1065srcA0, vis_read_hi(srcARGB));1066MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB),1067srcA1, vis_read_lo(srcARGB));10681069res0 = vis_fpack16_pair(res0, res1);10701071msk = (((pathA0) & (1 << 11)) | ((pathA1) & (1 << 10))) >> 10;1072vis_pst_32(res0, dst_ptr + i, msk);1073}10741075if (i < width) {1076srcA0 = *(mlib_u8*)(src_ptr + i);1077dstARGB0 = dst_ptr[i];1078srcARGB0 = src_ptr[i];1079ARGB2ABGR_FL(srcARGB0)1080MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);1081if (pathA0) {1082dst_ptr[i] = vis_fpack16(res0);1083}1084}1085}10861087/***************************************************************/10881089void ADD_SUFF(IntArgbToIntBgrAlphaMaskBlit)(MASKBLIT_PARAMS)1090{1091mlib_s32 extraA, srcF;1092mlib_s32 dstScan = pDstInfo->scanStride;1093mlib_s32 srcScan = pSrcInfo->scanStride;1094mlib_s32 log_val[6];1095mlib_s32 j;1096mlib_s32 SrcOpAnd;1097mlib_s32 SrcOpXor;1098mlib_s32 SrcOpAdd;1099mlib_s32 DstOpAnd;1100mlib_s32 DstOpXor;1101mlib_s32 DstOpAdd;1102mlib_u8 *mul8_extra, *mul8_srcF;11031104extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);11051106mul8_extra = mul8table[extraA];11071108SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;1109SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;1110SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;1111SrcOpAdd -= SrcOpXor;11121113DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;1114DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;1115DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;1116DstOpAdd -= DstOpXor;11171118log_val[3] = DstOpAnd;1119log_val[4] = DstOpXor;1120log_val[5] = DstOpAdd;11211122srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;11231124mul8_srcF = mul8table[srcF];11251126vis_write_gsr(7 << 3);11271128if (pMask != NULL) {1129if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {1130width *= height;1131height = 1;1132}11331134pMask += maskOff;11351136for (j = 0; j < height; j++) {1137IntArgbToIntBgrAlphaMaskBlit_line(dstBase, srcBase, pMask,1138width, log_val, mul8_extra,1139mul8_srcF, (void*)mul8table);11401141PTR_ADD(dstBase, dstScan);1142PTR_ADD(srcBase, srcScan);1143PTR_ADD(pMask, maskScan);1144}1145} else {1146if (dstScan == 4*width && srcScan == dstScan) {1147width *= height;1148height = 1;1149}11501151for (j = 0; j < height; j++) {1152IntArgbToIntBgrAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,1153width, log_val, mul8_extra,1154mul8_srcF, (void*)mul8table);11551156PTR_ADD(dstBase, dstScan);1157PTR_ADD(srcBase, srcScan);1158}1159}1160}11611162/***************************************************************/11631164/* ##############################################################1165* IntRgbToIntRgbAlphaMaskBlit()1166* IntRgbToIntBgrAlphaMaskBlit()1167* IntBgrToIntBgrAlphaMaskBlit()1168*/11691170#undef MASK_FILL1171#define MASK_FILL(rr, pathA, dstA, dstARGB, srcAX, srcARGB) \1172srcF = mul8_srcF[pathA]; \1173dstA = mul8_tbl[(pathA << 8) + dstF] + (0xff - pathA); \1174pathA = dstA - 0xff - srcF; \1175srcAX = mul8_tbl[srcA + (srcF << 8)]; \1176\1177BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcAX)11781179/***************************************************************/11801181static void IntRgbToIntRgbAlphaMaskBlit_line(mlib_f32 *dst_ptr,1182mlib_f32 *src_ptr,1183mlib_u8 *pMask,1184mlib_s32 width,1185mlib_s32 *log_val,1186mlib_u8 *mul8_extra,1187mlib_u8 *mul8_srcF,1188mlib_u8 *mul8_tbl)1189{1190mlib_s32 i, i0;1191mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA, srcA0, srcA1, msk;1192mlib_d64 res0, res1, dstARGB;1193mlib_f32 dstARGB0, srcARGB0, srcARGB1;1194mlib_s32 DstOpAnd = log_val[3];1195mlib_s32 DstOpXor = log_val[4];1196mlib_s32 DstOpAdd = log_val[5];1197mlib_s32 srcF, dstF;11981199i = i0 = 0;12001201srcA = 0xFF;1202srcA = mul8_extra[srcA];1203dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;12041205if ((mlib_s32)dst_ptr & 7) {1206pathA0 = pMask[i];1207dstARGB0 = dst_ptr[i];1208srcARGB0 = src_ptr[i];1209MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);1210if (pathA0) {1211dst_ptr[i] = vis_fpack16(res0);1212}12131214i0 = 1;1215}12161217#pragma pipeloop(0)1218for (i = i0; i <= width - 2; i += 2) {1219pathA0 = pMask[i];1220pathA1 = pMask[i + 1];1221dstARGB = *(mlib_d64*)(dst_ptr + i);1222srcARGB0 = src_ptr[i];1223srcARGB1 = src_ptr[i + 1];12241225MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);1226MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);12271228res0 = vis_fpack16_pair(res0, res1);12291230msk = (((pathA0) & (1 << 11)) | ((pathA1) & (1 << 10))) >> 10;1231vis_pst_32(res0, dst_ptr + i, msk);1232}12331234if (i < width) {1235pathA0 = pMask[i];1236dstARGB0 = dst_ptr[i];1237srcARGB0 = src_ptr[i];1238MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);1239if (pathA0) {1240dst_ptr[i] = vis_fpack16(res0);1241}1242}1243}12441245/***************************************************************/12461247static void IntRgbToIntBgrAlphaMaskBlit_line(mlib_f32 *dst_ptr,1248mlib_f32 *src_ptr,1249mlib_u8 *pMask,1250mlib_s32 width,1251mlib_s32 *log_val,1252mlib_u8 *mul8_extra,1253mlib_u8 *mul8_srcF,1254mlib_u8 *mul8_tbl)1255{1256mlib_s32 i, i0;1257mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA, srcA0, srcA1, msk;1258mlib_d64 res0, res1, dstARGB, srcARGB;1259mlib_f32 dstARGB0, srcARGB0;1260mlib_s32 DstOpAnd = log_val[3];1261mlib_s32 DstOpXor = log_val[4];1262mlib_s32 DstOpAdd = log_val[5];1263mlib_s32 srcF, dstF;12641265#if VIS >= 0x2001266vis_write_bmask(0x03214765, 0);1267#endif12681269i = i0 = 0;12701271srcA = 0xFF;1272srcA = mul8_extra[srcA];1273dstF = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;12741275if ((mlib_s32)dst_ptr & 7) {1276pathA0 = pMask[i];1277dstARGB0 = dst_ptr[i];1278srcARGB0 = src_ptr[i];1279ARGB2ABGR_FL(srcARGB0)1280MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);1281if (pathA0) {1282dst_ptr[i] = vis_fpack16(res0);1283}1284i0 = 1;1285}12861287#pragma pipeloop(0)1288for (i = i0; i <= width - 2; i += 2) {1289pathA0 = pMask[i];1290pathA1 = pMask[i + 1];1291dstARGB = *(mlib_d64*)(dst_ptr + i);1292srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);1293ARGB2ABGR_DB(srcARGB)12941295MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),1296srcA0, vis_read_hi(srcARGB));1297MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB),1298srcA1, vis_read_lo(srcARGB));12991300res0 = vis_fpack16_pair(res0, res1);13011302msk = (((pathA0) & (1 << 11)) | ((pathA1) & (1 << 10))) >> 10;1303vis_pst_32(res0, dst_ptr + i, msk);1304}13051306if (i < width) {1307pathA0 = pMask[i];1308dstARGB0 = dst_ptr[i];1309srcARGB0 = src_ptr[i];1310ARGB2ABGR_FL(srcARGB0)1311MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);1312if (pathA0) {1313dst_ptr[i] = vis_fpack16(res0);1314}1315}1316}13171318/***************************************************************/13191320#undef MASK_FILL1321#define MASK_FILL(rr, dstARGB, srcARGB) \1322t0 = vis_fmul8x16al(srcARGB, srcA_mul); \1323t1 = vis_fmul8x16al(dstARGB, dstA_mul); \1324rr = vis_fpadd16(t0, t1); \1325rr = vis_fpadd16(vis_fmul8sux16(rr, dstA_div), \1326vis_fmul8ulx16(rr, dstA_div))13271328/***************************************************************/13291330static void IntRgbToIntRgbAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,1331mlib_f32 *src_ptr,1332mlib_u8 *pMask,1333mlib_s32 width,1334mlib_s32 *log_val,1335mlib_u8 *mul8_extra,1336mlib_u8 *mul8_srcF,1337mlib_u8 *mul8_tbl)1338{1339mlib_s32 i, i0;1340mlib_s32 pathA, dstA, srcA, msk;1341mlib_d64 res0, res1, dstARGB;1342mlib_f32 dstARGB0, srcARGB0, srcARGB1, srcA_mul, dstA_mul;1343mlib_s32 DstOpAnd = log_val[3];1344mlib_s32 DstOpXor = log_val[4];1345mlib_s32 DstOpAdd = log_val[5];1346mlib_s32 srcF_255 = mul8_srcF[0xff] + 0xff;1347mlib_d64 t0, t1, dstA_div;13481349i = i0 = 0;13501351srcA = 0xFF;1352srcA = mul8_extra[srcA];1353dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;1354srcA = mul8_srcF[srcA];1355pathA = dstA - srcF_255;1356srcA_mul = ((mlib_f32*)vis_mul8s_tbl)[srcA];1357dstA_mul = ((mlib_f32*)vis_mul8s_tbl)[dstA];1358dstA += srcA;1359dstA_div = ((mlib_d64*)vis_div8_tbl)[dstA];13601361if ((mlib_s32)dst_ptr & 7) {1362dstARGB0 = dst_ptr[i];1363srcARGB0 = src_ptr[i];1364MASK_FILL(res0, dstARGB0, srcARGB0);1365if (pathA) {1366dst_ptr[i] = vis_fpack16(res0);1367}1368i0 = 1;1369}13701371#pragma pipeloop(0)1372for (i = i0; i <= width - 2; i += 2) {1373dstARGB = *(mlib_d64*)(dst_ptr + i);1374srcARGB0 = src_ptr[i];1375srcARGB1 = src_ptr[i + 1];13761377MASK_FILL(res0, vis_read_hi(dstARGB), srcARGB0);1378MASK_FILL(res1, vis_read_lo(dstARGB), srcARGB1);13791380res0 = vis_fpack16_pair(res0, res1);13811382msk = (((pathA) & (1 << 11)) | ((pathA) & (1 << 10))) >> 10;1383vis_pst_32(res0, dst_ptr + i, msk);1384}13851386if (i < width) {1387dstARGB0 = dst_ptr[i];1388srcARGB0 = src_ptr[i];1389MASK_FILL(res0, dstARGB0, srcARGB0);1390if (pathA) {1391dst_ptr[i] = vis_fpack16(res0);1392}1393}1394}13951396/***************************************************************/13971398static void IntRgbToIntBgrAlphaMaskBlit_A1_line(mlib_f32 *dst_ptr,1399mlib_f32 *src_ptr,1400mlib_u8 *pMask,1401mlib_s32 width,1402mlib_s32 *log_val,1403mlib_u8 *mul8_extra,1404mlib_u8 *mul8_srcF,1405mlib_u8 *mul8_tbl)1406{1407mlib_s32 i, i0;1408mlib_s32 pathA, dstA, srcA, msk;1409mlib_d64 res0, res1, dstARGB, srcARGB;1410mlib_f32 dstARGB0, srcARGB0, srcA_mul, dstA_mul;1411mlib_s32 DstOpAnd = log_val[3];1412mlib_s32 DstOpXor = log_val[4];1413mlib_s32 DstOpAdd = log_val[5];1414mlib_s32 srcF_255 = mul8_srcF[0xff] + 0xff;1415mlib_d64 t0, t1, dstA_div;14161417#if VIS >= 0x2001418vis_write_bmask(0x03214765, 0);1419#endif14201421i = i0 = 0;14221423srcA = 0xFF;1424srcA = mul8_extra[srcA];1425dstA = ((srcA & DstOpAnd) ^ DstOpXor) + DstOpAdd;1426srcA = mul8_srcF[srcA];1427pathA = dstA - srcF_255;1428srcA_mul = ((mlib_f32*)vis_mul8s_tbl)[srcA];1429dstA_mul = ((mlib_f32*)vis_mul8s_tbl)[dstA];1430dstA += srcA;1431dstA_div = ((mlib_d64*)vis_div8_tbl)[dstA];14321433if ((mlib_s32)dst_ptr & 7) {1434dstARGB0 = dst_ptr[i];1435srcARGB0 = src_ptr[i];1436ARGB2ABGR_FL(srcARGB0)1437MASK_FILL(res0, dstARGB0, srcARGB0);1438if (pathA) {1439dst_ptr[i] = vis_fpack16(res0);1440}1441i0 = 1;1442}14431444#pragma pipeloop(0)1445for (i = i0; i <= width - 2; i += 2) {1446dstARGB = *(mlib_d64*)(dst_ptr + i);1447srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);1448ARGB2ABGR_DB(srcARGB)14491450MASK_FILL(res0, vis_read_hi(dstARGB), vis_read_hi(srcARGB));1451MASK_FILL(res1, vis_read_lo(dstARGB), vis_read_lo(srcARGB));14521453res0 = vis_fpack16_pair(res0, res1);14541455msk = (((pathA) & (1 << 11)) | ((pathA) & (1 << 10))) >> 10;1456vis_pst_32(res0, dst_ptr + i, msk);1457}14581459if (i < width) {1460dstARGB0 = dst_ptr[i];1461srcARGB0 = src_ptr[i];1462ARGB2ABGR_FL(srcARGB0)1463MASK_FILL(res0, dstARGB0, srcARGB0);1464if (pathA) {1465dst_ptr[i] = vis_fpack16(res0);1466}1467}1468}14691470/***************************************************************/14711472void ADD_SUFF(IntRgbToIntRgbAlphaMaskBlit)(MASKBLIT_PARAMS)1473{1474mlib_s32 extraA, srcF;1475mlib_s32 dstScan = pDstInfo->scanStride;1476mlib_s32 srcScan = pSrcInfo->scanStride;1477mlib_s32 log_val[6];1478mlib_s32 j;1479mlib_s32 SrcOpAnd;1480mlib_s32 SrcOpXor;1481mlib_s32 SrcOpAdd;1482mlib_s32 DstOpAnd;1483mlib_s32 DstOpXor;1484mlib_s32 DstOpAdd;1485mlib_u8 *mul8_extra, *mul8_srcF;14861487extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);14881489mul8_extra = mul8table[extraA];14901491SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;1492SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;1493SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;1494SrcOpAdd -= SrcOpXor;14951496DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;1497DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;1498DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;1499DstOpAdd -= DstOpXor;15001501log_val[3] = DstOpAnd;1502log_val[4] = DstOpXor;1503log_val[5] = DstOpAdd;15041505srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;15061507mul8_srcF = mul8table[srcF];15081509vis_write_gsr(7 << 3);15101511if (pMask != NULL) {1512pMask += maskOff;15131514if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {1515width *= height;1516height = 1;1517}15181519for (j = 0; j < height; j++) {1520IntRgbToIntRgbAlphaMaskBlit_line(dstBase, srcBase, pMask,1521width, log_val, mul8_extra,1522mul8_srcF, (void*)mul8table);15231524PTR_ADD(dstBase, dstScan);1525PTR_ADD(srcBase, srcScan);1526PTR_ADD(pMask, maskScan);1527}1528} else {1529if (dstScan == 4*width && srcScan == dstScan) {1530width *= height;1531height = 1;1532}15331534for (j = 0; j < height; j++) {1535IntRgbToIntRgbAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,1536width, log_val, mul8_extra,1537mul8_srcF, (void*)mul8table);15381539PTR_ADD(dstBase, dstScan);1540PTR_ADD(srcBase, srcScan);1541}1542}1543}15441545/***************************************************************/15461547void ADD_SUFF(IntRgbToIntBgrAlphaMaskBlit)(MASKBLIT_PARAMS)1548{1549mlib_s32 extraA, srcF;1550mlib_s32 dstScan = pDstInfo->scanStride;1551mlib_s32 srcScan = pSrcInfo->scanStride;1552mlib_s32 log_val[6];1553mlib_s32 j;1554mlib_s32 SrcOpAnd;1555mlib_s32 SrcOpXor;1556mlib_s32 SrcOpAdd;1557mlib_s32 DstOpAnd;1558mlib_s32 DstOpXor;1559mlib_s32 DstOpAdd;1560mlib_u8 *mul8_extra, *mul8_srcF;15611562extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);15631564mul8_extra = mul8table[extraA];15651566SrcOpAnd = (AlphaRules[pCompInfo->rule].srcOps).andval;1567SrcOpXor = (AlphaRules[pCompInfo->rule].srcOps).xorval;1568SrcOpAdd = (AlphaRules[pCompInfo->rule].srcOps).addval;1569SrcOpAdd -= SrcOpXor;15701571DstOpAnd = (AlphaRules[pCompInfo->rule].dstOps).andval;1572DstOpXor = (AlphaRules[pCompInfo->rule].dstOps).xorval;1573DstOpAdd = (AlphaRules[pCompInfo->rule].dstOps).addval;1574DstOpAdd -= DstOpXor;15751576log_val[3] = DstOpAnd;1577log_val[4] = DstOpXor;1578log_val[5] = DstOpAdd;15791580srcF = ((0xff & SrcOpAnd) ^ SrcOpXor) + SrcOpAdd;15811582mul8_srcF = mul8table[srcF];15831584vis_write_gsr(7 << 3);15851586if (pMask != NULL) {1587pMask += maskOff;15881589if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {1590width *= height;1591height = 1;1592}15931594for (j = 0; j < height; j++) {1595IntRgbToIntBgrAlphaMaskBlit_line(dstBase, srcBase, pMask,1596width, log_val, mul8_extra,1597mul8_srcF, (void*)mul8table);15981599PTR_ADD(dstBase, dstScan);1600PTR_ADD(srcBase, srcScan);1601PTR_ADD(pMask, maskScan);1602}1603} else {1604if (dstScan == 4*width && srcScan == dstScan) {1605width *= height;1606height = 1;1607}16081609for (j = 0; j < height; j++) {1610IntRgbToIntBgrAlphaMaskBlit_A1_line(dstBase, srcBase, pMask,1611width, log_val, mul8_extra,1612mul8_srcF, (void*)mul8table);16131614PTR_ADD(dstBase, dstScan);1615PTR_ADD(srcBase, srcScan);1616}1617}1618}16191620/***************************************************************/16211622#ifdef MLIB_ADD_SUFF1623#pragma weak IntBgrToIntBgrAlphaMaskBlit_F = IntRgbToIntRgbAlphaMaskBlit_F1624#else1625#pragma weak IntBgrToIntBgrAlphaMaskBlit = IntRgbToIntRgbAlphaMaskBlit1626#endif16271628/***************************************************************/16291630/*1631mlib_d64 buff[BUFF_SIZE/2];1632void *pbuff = buff;16331634if (width > BUFF_SIZE) pbuff = mlib_malloc(width*sizeof(mlib_s32));16351636ADD_SUFF(ThreeByteBgrToIntArgbConvert)(rasBase, pbuff, width, 1,1637pRasInfo, pRasInfo,1638pPrim, pCompInfo);16391640ADD_SUFF(IntArgbToThreeByteBgrConvert)(pbuff, rasBase, width, 1,1641pRasInfo, pRasInfo,1642pPrim, pCompInfo);164316441645if (pbuff != buff) {1646mlib_free(pbuff);1647}1648*/16491650#endif165116521653