Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/java2d/loops/vis_SrcOverMaskBlit.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* IntArgbToIntArgbSrcOverMaskBlit()33* IntArgbToFourByteAbgrSrcOverMaskBlit()34*/3536#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \37{ \38mlib_d64 t0, t1; \39\40srcA = MUL8_INT(srcA, mul8_extra[pathA]); \41dstA = MUL8_INT(dstA, 0xff - srcA); \42\43t0 = MUL8_VIS(srcARGB, srcA); \44t1 = MUL8_VIS(dstARGB, dstA); \45rr = vis_fpadd16(t0, t1); \46\47dstA += srcA; \48DIV_ALPHA(rr, dstA); \49}5051/***************************************************************/5253static void IntArgbToIntArgbSrcOverMaskBlit_line(mlib_f32 *dst_ptr,54mlib_f32 *src_ptr,55mlib_u8 *pMask,56mlib_s32 width,57mlib_u8 *mul8_extra,58mlib_u8 *mul8_tbl)59{60mlib_s32 i, i0;61mlib_s32 pathA0, pathA1, dstA0, dstA1, srcA0, srcA1, msk;62mlib_d64 res0, res1, dstARGB;63mlib_f32 dstARGB0, srcARGB0, srcARGB1;6465i = i0 = 0;6667if ((mlib_s32)dst_ptr & 7) {68pathA0 = pMask[i];69dstA0 = *(mlib_u8*)(dst_ptr + i);70srcA0 = *(mlib_u8*)(src_ptr + i);71dstARGB0 = dst_ptr[i];72srcARGB0 = src_ptr[i];73MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);74if (srcA0) {75dst_ptr[i] = vis_fpack16(res0);76*(mlib_u8*)(dst_ptr + i) = dstA0;77}7879i0 = 1;80}8182#pragma pipeloop(0)83for (i = i0; i <= width - 2; i += 2) {84pathA0 = pMask[i];85pathA1 = pMask[i + 1];86dstA0 = *(mlib_u8*)(dst_ptr + i);87dstA1 = *(mlib_u8*)(dst_ptr + i + 1);88dstARGB = *(mlib_d64*)(dst_ptr + i);89srcA0 = *(mlib_u8*)(src_ptr + i);90srcA1 = *(mlib_u8*)(src_ptr + i + 1);91srcARGB0 = src_ptr[i];92srcARGB1 = src_ptr[i + 1];9394MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);95MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);9697res0 = vis_fpack16_pair(res0, res1);9899msk = (((-srcA0) & (1 << 11)) | ((-srcA1) & (1 << 10))) >> 10;100vis_pst_32(res0, dst_ptr + i, msk);101102*(mlib_u8*)(dst_ptr + i ) = dstA0;103*(mlib_u8*)(dst_ptr + i + 1) = dstA1;104}105106if (i < width) {107pathA0 = pMask[i];108dstA0 = *(mlib_u8*)(dst_ptr + i);109srcA0 = *(mlib_u8*)(src_ptr + i);110dstARGB0 = dst_ptr[i];111srcARGB0 = src_ptr[i];112MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);113if (srcA0) {114dst_ptr[i] = vis_fpack16(res0);115*(mlib_u8*)(dst_ptr + i) = dstA0;116}117}118}119120/***************************************************************/121122#undef MASK_FILL123#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \124{ \125mlib_d64 t0, t1; \126\127srcA = mul8_extra[srcA]; \128dstA = MUL8_INT(dstA, 0xff - srcA); \129\130t0 = MUL8_VIS(srcARGB, srcA); \131t1 = MUL8_VIS(dstARGB, dstA); \132rr = vis_fpadd16(t0, t1); \133\134dstA += srcA; \135DIV_ALPHA(rr, dstA); \136}137138/***************************************************************/139140static void IntArgbToIntArgbSrcOverMaskBlit_A1_line(mlib_f32 *dst_ptr,141mlib_f32 *src_ptr,142mlib_u8 *pMask,143mlib_s32 width,144mlib_u8 *mul8_extra,145mlib_u8 *mul8_tbl)146{147mlib_s32 i, i0;148mlib_s32 dstA0, dstA1, srcA0, srcA1, msk;149mlib_d64 res0, res1, dstARGB;150mlib_f32 dstARGB0, srcARGB0, srcARGB1;151152i = i0 = 0;153154if ((mlib_s32)dst_ptr & 7) {155dstA0 = *(mlib_u8*)(dst_ptr + i);156srcA0 = *(mlib_u8*)(src_ptr + i);157dstARGB0 = dst_ptr[i];158srcARGB0 = src_ptr[i];159MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);160if (srcA0) {161dst_ptr[i] = vis_fpack16(res0);162*(mlib_u8*)(dst_ptr + i) = dstA0;163}164165i0 = 1;166}167168#pragma pipeloop(0)169for (i = i0; i <= width - 2; i += 2) {170dstA0 = *(mlib_u8*)(dst_ptr + i);171dstA1 = *(mlib_u8*)(dst_ptr + i + 1);172dstARGB = *(mlib_d64*)(dst_ptr + i);173srcA0 = *(mlib_u8*)(src_ptr + i);174srcA1 = *(mlib_u8*)(src_ptr + i + 1);175srcARGB0 = src_ptr[i];176srcARGB1 = src_ptr[i + 1];177178MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);179MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);180181res0 = vis_fpack16_pair(res0, res1);182183msk = (((-srcA0) & (1 << 11)) | ((-srcA1) & (1 << 10))) >> 10;184vis_pst_32(res0, dst_ptr + i, msk);185186*(mlib_u8*)(dst_ptr + i ) = dstA0;187*(mlib_u8*)(dst_ptr + i + 1) = dstA1;188}189190if (i < width) {191dstA0 = *(mlib_u8*)(dst_ptr + i);192srcA0 = *(mlib_u8*)(src_ptr + i);193dstARGB0 = dst_ptr[i];194srcARGB0 = src_ptr[i];195MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);196if (srcA0) {197dst_ptr[i] = vis_fpack16(res0);198*(mlib_u8*)(dst_ptr + i) = dstA0;199}200}201}202203/***************************************************************/204205void ADD_SUFF(IntArgbToIntArgbSrcOverMaskBlit)(MASKBLIT_PARAMS)206{207mlib_s32 extraA;208mlib_s32 dstScan = pDstInfo->scanStride;209mlib_s32 srcScan = pSrcInfo->scanStride;210mlib_u8 *mul8_extra;211mlib_s32 j;212213extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);214215mul8_extra = mul8table[extraA];216217vis_write_gsr(7 << 3);218219if (pMask != NULL) {220pMask += maskOff;221222if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {223width *= height;224height = 1;225}226227for (j = 0; j < height; j++) {228IntArgbToIntArgbSrcOverMaskBlit_line(dstBase, srcBase, pMask,229width, mul8_extra,230(void*)mul8table);231232PTR_ADD(dstBase, dstScan);233PTR_ADD(srcBase, srcScan);234PTR_ADD(pMask, maskScan);235}236} else {237if (dstScan == 4*width && srcScan == dstScan) {238width *= height;239height = 1;240}241242for (j = 0; j < height; j++) {243IntArgbToIntArgbSrcOverMaskBlit_A1_line(dstBase, srcBase, pMask,244width, mul8_extra,245(void*)mul8table);246247PTR_ADD(dstBase, dstScan);248PTR_ADD(srcBase, srcScan);249}250}251}252253/***************************************************************/254255void ADD_SUFF(IntArgbToFourByteAbgrSrcOverMaskBlit)(MASKBLIT_PARAMS)256{257mlib_d64 buff[BUFF_SIZE/2];258void *src_buff = buff, *dst_buff;259mlib_s32 extraA;260mlib_s32 dstScan = pDstInfo->scanStride;261mlib_s32 srcScan = pSrcInfo->scanStride;262mlib_u8 *mul8_extra;263mlib_s32 j;264265extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);266267mul8_extra = mul8table[extraA];268269vis_write_gsr(7 << 3);270271if (2*width > BUFF_SIZE) src_buff = mlib_malloc(2*width*sizeof(mlib_s32));272dst_buff = (mlib_s32*)src_buff + width;273274if (pMask != NULL) {275pMask += maskOff;276277for (j = 0; j < height; j++) {278IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);279if (!((mlib_s32)dstBase & 3)) {280IntArgbToIntArgbSrcOverMaskBlit_line(dstBase, src_buff, pMask,281width, mul8_extra,282(void*)mul8table);283} else {284mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));285IntArgbToIntArgbSrcOverMaskBlit_line(dst_buff, src_buff, pMask,286width, mul8_extra,287(void*)mul8table);288mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));289}290291PTR_ADD(dstBase, dstScan);292PTR_ADD(srcBase, srcScan);293PTR_ADD(pMask, maskScan);294}295} else {296for (j = 0; j < height; j++) {297IntArgbToIntAbgrConvert_line(srcBase, src_buff, width);298if (!((mlib_s32)dstBase & 3)) {299IntArgbToIntArgbSrcOverMaskBlit_A1_line(dstBase, src_buff,300pMask, width,301mul8_extra,302(void*)mul8table);303} else {304mlib_ImageCopy_na(dstBase, dst_buff, width*sizeof(mlib_s32));305IntArgbToIntArgbSrcOverMaskBlit_A1_line(dst_buff, src_buff,306pMask, width,307mul8_extra,308(void*)mul8table);309mlib_ImageCopy_na(dst_buff, dstBase, width*sizeof(mlib_s32));310}311312PTR_ADD(dstBase, dstScan);313PTR_ADD(srcBase, srcScan);314}315}316317if (src_buff != buff) {318mlib_free(src_buff);319}320}321322/***************************************************************/323324/* ##############################################################325* IntArgbToIntRgbSrcOverMaskBlit()326* IntArgbToIntBgrSrcOverMaskBlit()327*/328329#undef MASK_FILL330#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \331{ \332mlib_d64 t0, t1; \333mlib_f32 srcAf, dstAf; \334\335srcA = MUL8_INT(srcA, mul8_extra[pathA]); \336srcAf = ((mlib_f32 *)vis_mul8s_tbl)[srcA]; \337dstAf = vis_fpsub16s(cnst1, srcAf); \338\339t0 = vis_fmul8x16al(srcARGB, srcAf); \340t1 = vis_fmul8x16al(dstARGB, dstAf); \341rr = vis_fpadd16(t0, t1); \342}343344/***************************************************************/345346static void IntArgbToIntRgbSrcOverMaskBlit_line(mlib_f32 *dst_ptr,347mlib_f32 *src_ptr,348mlib_u8 *pMask,349mlib_s32 width,350mlib_u8 *mul8_extra,351mlib_u8 *mul8_tbl)352{353mlib_s32 i, i0;354mlib_s32 pathA0, pathA1, srcA0, srcA1, msk;355mlib_d64 res0, res1, dstARGB;356mlib_f32 dstARGB0, srcARGB0, srcARGB1;357mlib_d64 maskRGB = vis_to_double_dup(0x00FFFFFF);358mlib_f32 cnst1 = vis_to_float(0x8000);359360i = i0 = 0;361362if ((mlib_s32)dst_ptr & 7) {363pathA0 = pMask[i];364srcA0 = *(mlib_u8*)(src_ptr + i);365dstARGB0 = dst_ptr[i];366srcARGB0 = src_ptr[i];367MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);368if (srcA0) {369dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));370}371372i0 = 1;373}374375#pragma pipeloop(0)376for (i = i0; i <= width - 2; i += 2) {377pathA0 = pMask[i];378pathA1 = pMask[i + 1];379dstARGB = *(mlib_d64*)(dst_ptr + i);380srcA0 = *(mlib_u8*)(src_ptr + i);381srcA1 = *(mlib_u8*)(src_ptr + i + 1);382srcARGB0 = src_ptr[i];383srcARGB1 = src_ptr[i + 1];384385MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);386MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);387388res0 = vis_fpack16_pair(res0, res1);389res0 = vis_fand(res0, maskRGB);390391msk = (((-srcA0) & (1 << 11)) | ((-srcA1) & (1 << 10))) >> 10;392vis_pst_32(res0, dst_ptr + i, msk);393}394395if (i < width) {396pathA0 = pMask[i];397srcA0 = *(mlib_u8*)(src_ptr + i);398dstARGB0 = dst_ptr[i];399srcARGB0 = src_ptr[i];400MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);401if (srcA0) {402dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));403}404}405}406407/***************************************************************/408409static void IntArgbToIntBgrSrcOverMaskBlit_line(mlib_f32 *dst_ptr,410mlib_f32 *src_ptr,411mlib_u8 *pMask,412mlib_s32 width,413mlib_u8 *mul8_extra,414mlib_u8 *mul8_tbl)415{416mlib_s32 i, i0;417mlib_s32 pathA0, pathA1, srcA0, srcA1, msk;418mlib_d64 res0, res1, dstARGB, srcARGB;419mlib_f32 dstARGB0, srcARGB0;420mlib_d64 maskRGB = vis_to_double_dup(0x00FFFFFF);421mlib_f32 cnst1 = vis_to_float(0x8000);422423#if VIS >= 0x200424vis_write_bmask(0x03214765, 0);425#endif426427i = i0 = 0;428429if ((mlib_s32)dst_ptr & 7) {430pathA0 = pMask[i];431srcA0 = *(mlib_u8*)(src_ptr + i);432dstARGB0 = dst_ptr[i];433srcARGB0 = src_ptr[i];434ARGB2ABGR_FL(srcARGB0)435MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);436if (srcA0) {437dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));438}439440i0 = 1;441}442443#pragma pipeloop(0)444for (i = i0; i <= width - 2; i += 2) {445pathA0 = pMask[i];446pathA1 = pMask[i + 1];447dstARGB = *(mlib_d64*)(dst_ptr + i);448srcA0 = *(mlib_u8*)(src_ptr + i);449srcA1 = *(mlib_u8*)(src_ptr + i + 1);450srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);451ARGB2ABGR_DB(srcARGB)452453MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),454srcA0, vis_read_hi(srcARGB));455MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB),456srcA1, vis_read_lo(srcARGB));457458res0 = vis_fpack16_pair(res0, res1);459res0 = vis_fand(res0, maskRGB);460461msk = (((-srcA0) & (1 << 11)) | ((-srcA1) & (1 << 10))) >> 10;462vis_pst_32(res0, dst_ptr + i, msk);463}464465if (i < width) {466pathA0 = pMask[i];467srcA0 = *(mlib_u8*)(src_ptr + i);468dstARGB0 = dst_ptr[i];469srcARGB0 = src_ptr[i];470ARGB2ABGR_FL(srcARGB0)471MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);472if (srcA0) {473dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));474}475}476}477478/***************************************************************/479480#undef MASK_FILL481#define MASK_FILL(rr, pathA, dstA, dstARGB, srcA, srcARGB) \482{ \483mlib_d64 t0, t1; \484mlib_f32 srcAf, dstAf; \485\486srcA = mul8_extra[srcA]; \487srcAf = ((mlib_f32 *)vis_mul8s_tbl)[srcA]; \488dstAf = vis_fpsub16s(cnst1, srcAf); \489\490t0 = vis_fmul8x16al(srcARGB, srcAf); \491t1 = vis_fmul8x16al(dstARGB, dstAf); \492rr = vis_fpadd16(t0, t1); \493}494495/***************************************************************/496497static void IntArgbToIntRgbSrcOverMaskBlit_A1_line(mlib_f32 *dst_ptr,498mlib_f32 *src_ptr,499mlib_u8 *pMask,500mlib_s32 width,501mlib_u8 *mul8_extra,502mlib_u8 *mul8_tbl)503{504mlib_s32 i, i0;505mlib_s32 srcA0, srcA1, msk;506mlib_d64 res0, res1, dstARGB;507mlib_f32 dstARGB0, srcARGB0, srcARGB1;508mlib_d64 maskRGB = vis_to_double_dup(0x00FFFFFF);509mlib_f32 cnst1 = vis_to_float(0x8000);510511i = i0 = 0;512513if ((mlib_s32)dst_ptr & 7) {514srcA0 = *(mlib_u8*)(src_ptr + i);515dstARGB0 = dst_ptr[i];516srcARGB0 = src_ptr[i];517MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);518if (srcA0) {519dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));520}521522i0 = 1;523}524525#pragma pipeloop(0)526for (i = i0; i <= width - 2; i += 2) {527dstARGB = *(mlib_d64*)(dst_ptr + i);528srcA0 = *(mlib_u8*)(src_ptr + i);529srcA1 = *(mlib_u8*)(src_ptr + i + 1);530srcARGB0 = src_ptr[i];531srcARGB1 = src_ptr[i + 1];532533MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB), srcA0, srcARGB0);534MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB), srcA1, srcARGB1);535536res0 = vis_fpack16_pair(res0, res1);537res0 = vis_fand(res0, maskRGB);538539msk = (((-srcA0) & (1 << 11)) | ((-srcA1) & (1 << 10))) >> 10;540vis_pst_32(res0, dst_ptr + i, msk);541}542543if (i < width) {544srcA0 = *(mlib_u8*)(src_ptr + i);545dstARGB0 = dst_ptr[i];546srcARGB0 = src_ptr[i];547MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);548if (srcA0) {549dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));550}551}552}553554/***************************************************************/555556static void IntArgbToIntBgrSrcOverMaskBlit_A1_line(mlib_f32 *dst_ptr,557mlib_f32 *src_ptr,558mlib_u8 *pMask,559mlib_s32 width,560mlib_u8 *mul8_extra,561mlib_u8 *mul8_tbl)562{563mlib_s32 i, i0;564mlib_s32 srcA0, srcA1, msk;565mlib_d64 res0, res1, dstARGB, srcARGB;566mlib_f32 dstARGB0, srcARGB0;567mlib_d64 maskRGB = vis_to_double_dup(0x00FFFFFF);568mlib_f32 cnst1 = vis_to_float(0x8000);569570#if VIS >= 0x200571vis_write_bmask(0x03214765, 0);572#endif573574i = i0 = 0;575576if ((mlib_s32)dst_ptr & 7) {577srcA0 = *(mlib_u8*)(src_ptr + i);578dstARGB0 = dst_ptr[i];579srcARGB0 = src_ptr[i];580ARGB2ABGR_FL(srcARGB0)581MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);582if (srcA0) {583dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));584}585586i0 = 1;587}588589#pragma pipeloop(0)590for (i = i0; i <= width - 2; i += 2) {591dstARGB = *(mlib_d64*)(dst_ptr + i);592srcA0 = *(mlib_u8*)(src_ptr + i);593srcA1 = *(mlib_u8*)(src_ptr + i + 1);594srcARGB = vis_freg_pair(src_ptr[i], src_ptr[i + 1]);595ARGB2ABGR_DB(srcARGB)596597MASK_FILL(res0, pathA0, dstA0, vis_read_hi(dstARGB),598srcA0, vis_read_hi(srcARGB));599MASK_FILL(res1, pathA1, dstA1, vis_read_lo(dstARGB),600srcA1, vis_read_lo(srcARGB));601602res0 = vis_fpack16_pair(res0, res1);603res0 = vis_fand(res0, maskRGB);604605msk = (((-srcA0) & (1 << 11)) | ((-srcA1) & (1 << 10))) >> 10;606vis_pst_32(res0, dst_ptr + i, msk);607}608609if (i < width) {610srcA0 = *(mlib_u8*)(src_ptr + i);611dstARGB0 = dst_ptr[i];612srcARGB0 = src_ptr[i];613ARGB2ABGR_FL(srcARGB0)614MASK_FILL(res0, pathA0, dstA0, dstARGB0, srcA0, srcARGB0);615if (srcA0) {616dst_ptr[i] = vis_fands(vis_fpack16(res0), vis_read_hi(maskRGB));617}618}619}620621/***************************************************************/622623void ADD_SUFF(IntArgbToIntRgbSrcOverMaskBlit)(MASKBLIT_PARAMS)624{625mlib_s32 extraA;626mlib_s32 dstScan = pDstInfo->scanStride;627mlib_s32 srcScan = pSrcInfo->scanStride;628mlib_u8 *mul8_extra;629mlib_s32 j;630631extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);632633mul8_extra = mul8table[extraA];634635vis_write_gsr(0 << 3);636637if (pMask != NULL) {638pMask += maskOff;639640if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {641width *= height;642height = 1;643}644645for (j = 0; j < height; j++) {646IntArgbToIntRgbSrcOverMaskBlit_line(dstBase, srcBase, pMask,647width, mul8_extra,648(void*)mul8table);649650PTR_ADD(dstBase, dstScan);651PTR_ADD(srcBase, srcScan);652PTR_ADD(pMask, maskScan);653}654} else {655if (dstScan == 4*width && srcScan == dstScan) {656width *= height;657height = 1;658}659660for (j = 0; j < height; j++) {661IntArgbToIntRgbSrcOverMaskBlit_A1_line(dstBase, srcBase, pMask,662width, mul8_extra,663(void*)mul8table);664665PTR_ADD(dstBase, dstScan);666PTR_ADD(srcBase, srcScan);667}668}669}670671/***************************************************************/672673void ADD_SUFF(IntArgbToIntBgrSrcOverMaskBlit)(MASKBLIT_PARAMS)674{675mlib_s32 extraA;676mlib_s32 dstScan = pDstInfo->scanStride;677mlib_s32 srcScan = pSrcInfo->scanStride;678mlib_u8 *mul8_extra;679mlib_s32 j;680681extraA = (mlib_s32)(pCompInfo->details.extraAlpha * 255.0 + 0.5);682683mul8_extra = mul8table[extraA];684685vis_write_gsr(0 << 3);686687if (pMask != NULL) {688pMask += maskOff;689690if (dstScan == 4*width && srcScan == dstScan && maskScan == width) {691width *= height;692height = 1;693}694695for (j = 0; j < height; j++) {696IntArgbToIntBgrSrcOverMaskBlit_line(dstBase, srcBase, pMask,697width, mul8_extra,698(void*)mul8table);699700PTR_ADD(dstBase, dstScan);701PTR_ADD(srcBase, srcScan);702PTR_ADD(pMask, maskScan);703}704} else {705if (dstScan == 4*width && srcScan == dstScan) {706width *= height;707height = 1;708}709710for (j = 0; j < height; j++) {711IntArgbToIntBgrSrcOverMaskBlit_A1_line(dstBase, srcBase, pMask,712width, mul8_extra,713(void*)mul8table);714715PTR_ADD(dstBase, dstScan);716PTR_ADD(srcBase, srcScan);717}718}719}720721/***************************************************************/722723#endif724725726