Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/java2d/loops/vis_IntArgbPre.c
32288 views
/*1* Copyright (c) 2003, 2008, 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#define GET_ARGBPRE(i) \320xFF000000 | (src[3*i + 2] << 16) | (src[3*i + 1] << 8) | src[3*i]3334/***************************************************************/3536#define CONVERT_PRE(rr, dstA, dstARGB) \37rr = vis_fmul8x16(dstARGB, ((mlib_d64*)vis_div8pre_tbl)[dstA])3839/***************************************************************/4041void ADD_SUFF(IntArgbPreToIntArgbConvert)(BLIT_PARAMS)42{43mlib_s32 dstScan = pDstInfo->scanStride;44mlib_s32 srcScan = pSrcInfo->scanStride;45mlib_s32 dstA0, dstA1;46mlib_d64 res0, res1, dstARGB;47mlib_f32 dstARGB0;48mlib_s32 i, i0, j;4950vis_write_gsr(7 << 3);5152if (dstScan == 4*width && srcScan == 4*width) {53width *= height;54height = 1;55}5657for (j = 0; j < height; j++) {58mlib_f32 *src = srcBase;59mlib_f32 *dst = dstBase;6061i = i0 = 0;6263if ((mlib_s32)dst & 7) {64dstA0 = *(mlib_u8*)(src + i);65dstARGB0 = src[i];66CONVERT_PRE(res0, dstA0, dstARGB0);67dst[i] = vis_fpack16(res0);6869i0 = 1;70}7172#pragma pipeloop(0)73for (i = i0; i <= (mlib_s32)width - 2; i += 2) {74dstA0 = *(mlib_u8*)(src + i);75dstA1 = *(mlib_u8*)(src + i + 1);76dstARGB = vis_freg_pair(src[i], src[i + 1]);7778CONVERT_PRE(res0, dstA0, vis_read_hi(dstARGB));79CONVERT_PRE(res1, dstA1, vis_read_lo(dstARGB));8081res0 = vis_fpack16_pair(res0, res1);8283*(mlib_d64*)(dst + i) = res0;84}8586if (i < width) {87dstA0 = *(mlib_u8*)(src + i);88dstARGB0 = src[i];89CONVERT_PRE(res0, dstA0, dstARGB0);90dst[i] = vis_fpack16(res0);91}9293PTR_ADD(dstBase, dstScan);94PTR_ADD(srcBase, srcScan);95}96}9798/***************************************************************/99100void ADD_SUFF(IntArgbPreToIntArgbScaleConvert)(SCALE_PARAMS)101{102mlib_s32 dstScan = pDstInfo->scanStride;103mlib_s32 srcScan = pSrcInfo->scanStride;104mlib_s32 dstA0, dstA1;105mlib_d64 res0, res1, dstARGB;106mlib_f32 dstARGB0;107mlib_s32 i, i0, j, ind0, ind1;108109if (width < 16) {110for (j = 0; j < height; j++) {111mlib_s32 *src = srcBase;112mlib_u8 *dst = dstBase;113mlib_s32 tmpsxloc = sxloc;114115PTR_ADD(src, (syloc >> shift) * srcScan);116117for (i = 0; i < width; i++) {118mlib_u32 argb = src[tmpsxloc >> shift];119mlib_u32 a, r, g, b;120b = argb & 0xff;121g = (argb >> 8) & 0xff;122r = (argb >> 16) & 0xff;123a = argb >> 24;124dst[4*i] = a;125if (a == 0) a = 255; /* a |= (a - 1) >> 24; */126dst[4*i + 1] = div8table[a][r];127dst[4*i + 2] = div8table[a][g];128dst[4*i + 3] = div8table[a][b];129tmpsxloc += sxinc;130}131132PTR_ADD(dstBase, dstScan);133syloc += syinc;134}135return;136}137138vis_write_gsr(7 << 3);139140for (j = 0; j < height; j++) {141mlib_f32 *src = srcBase;142mlib_f32 *dst = dstBase;143mlib_s32 tmpsxloc = sxloc;144145PTR_ADD(src, (syloc >> shift) * srcScan);146147i = i0 = 0;148149if ((mlib_s32)dst & 7) {150ind0 = tmpsxloc >> shift;151tmpsxloc += sxinc;152dstA0 = *(mlib_u8*)(src + ind0);153dstARGB0 = src[ind0];154CONVERT_PRE(res0, dstA0, dstARGB0);155dst[i] = vis_fpack16(res0);156157i0 = 1;158}159160#pragma pipeloop(0)161for (i = i0; i <= (mlib_s32)width - 2; i += 2) {162ind0 = tmpsxloc >> shift;163tmpsxloc += sxinc;164ind1 = tmpsxloc >> shift;165tmpsxloc += sxinc;166dstA0 = *(mlib_u8*)(src + ind0);167dstA1 = *(mlib_u8*)(src + ind1);168169dstARGB = vis_freg_pair(src[ind0], src[ind1]);170171CONVERT_PRE(res0, dstA0, vis_read_hi(dstARGB));172CONVERT_PRE(res1, dstA1, vis_read_lo(dstARGB));173174res0 = vis_fpack16_pair(res0, res1);175176*(mlib_d64*)(dst + i) = res0;177}178179if (i < width) {180ind0 = tmpsxloc >> shift;181tmpsxloc += sxinc;182dstA0 = *(mlib_u8*)(src + ind0);183dstARGB0 = src[ind0];184CONVERT_PRE(res0, dstA0, dstARGB0);185dst[i] = vis_fpack16(res0);186}187188PTR_ADD(dstBase, dstScan);189syloc += syinc;190}191}192193/***************************************************************/194195#undef CONVERT_PRE196#define CONVERT_PRE(rr, dstA, dstARGB) \197rr = MUL8_VIS(dstARGB, dstA)198199void ADD_SUFF(IntArgbToIntArgbPreConvert)(BLIT_PARAMS)200{201mlib_s32 dstScan = pDstInfo->scanStride;202mlib_s32 srcScan = pSrcInfo->scanStride;203mlib_s32 dstA0, dstA1;204mlib_d64 res0, res1, dstARGB;205mlib_f32 dstARGB0;206mlib_s32 i, i0, j;207208vis_write_gsr(0 << 3);209210if (dstScan == 4*width && srcScan == 4*width) {211width *= height;212height = 1;213}214215for (j = 0; j < height; j++) {216mlib_f32 *src = srcBase;217mlib_f32 *dst = dstBase;218219i = i0 = 0;220221if ((mlib_s32)dst & 7) {222dstA0 = *(mlib_u8*)(src + i);223dstARGB0 = src[i];224CONVERT_PRE(res0, dstA0, dstARGB0);225dst[i] = vis_fpack16(res0);226*(mlib_u8*)(dst + i) = dstA0;227228i0 = 1;229}230231#pragma pipeloop(0)232for (i = i0; i <= (mlib_s32)width - 2; i += 2) {233dstA0 = *(mlib_u8*)(src + i);234dstA1 = *(mlib_u8*)(src + i + 1);235dstARGB = vis_freg_pair(src[i], src[i + 1]);236237CONVERT_PRE(res0, dstA0, vis_read_hi(dstARGB));238CONVERT_PRE(res1, dstA1, vis_read_lo(dstARGB));239240res0 = vis_fpack16_pair(res0, res1);241242*(mlib_d64*)(dst + i) = res0;243vis_pst_8(dstARGB, dst + i, 0x88);244}245246if (i < width) {247dstA0 = *(mlib_u8*)(src + i);248dstARGB0 = src[i];249CONVERT_PRE(res0, dstA0, dstARGB0);250dst[i] = vis_fpack16(res0);251*(mlib_u8*)(dst + i) = dstA0;252}253254PTR_ADD(dstBase, dstScan);255PTR_ADD(srcBase, srcScan);256}257}258259/***************************************************************/260261void ADD_SUFF(IntArgbToIntArgbPreScaleConvert)(SCALE_PARAMS)262{263mlib_s32 dstScan = pDstInfo->scanStride;264mlib_s32 srcScan = pSrcInfo->scanStride;265mlib_s32 dstA0, dstA1;266mlib_d64 res0, res1, dstARGB;267mlib_f32 dstARGB0;268mlib_s32 i, i0, j, ind0, ind1;269270if (width < 16) {271for (j = 0; j < height; j++) {272mlib_s32 *src = srcBase;273mlib_u8 *dst = dstBase;274mlib_s32 tmpsxloc = sxloc;275276PTR_ADD(src, (syloc >> shift) * srcScan);277278for (i = 0; i < width; i++) {279mlib_u32 argb = src[tmpsxloc >> shift];280mlib_u32 a, r, g, b;281b = argb & 0xff;282g = (argb >> 8) & 0xff;283r = (argb >> 16) & 0xff;284a = argb >> 24;285dst[4*i] = a;286dst[4*i + 1] = mul8table[a][r];287dst[4*i + 2] = mul8table[a][g];288dst[4*i + 3] = mul8table[a][b];289tmpsxloc += sxinc;290}291292PTR_ADD(dstBase, dstScan);293syloc += syinc;294}295return;296}297298vis_write_gsr(0 << 3);299300for (j = 0; j < height; j++) {301mlib_f32 *src = srcBase;302mlib_f32 *dst = dstBase;303mlib_s32 tmpsxloc = sxloc;304305PTR_ADD(src, (syloc >> shift) * srcScan);306307i = i0 = 0;308309if ((mlib_s32)dst & 7) {310ind0 = tmpsxloc >> shift;311tmpsxloc += sxinc;312dstA0 = *(mlib_u8*)(src + ind0);313dstARGB0 = src[ind0];314CONVERT_PRE(res0, dstA0, dstARGB0);315dst[i] = vis_fpack16(res0);316*(mlib_u8*)(dst + i) = dstA0;317318i0 = 1;319}320321#pragma pipeloop(0)322for (i = i0; i <= (mlib_s32)width - 2; i += 2) {323ind0 = tmpsxloc >> shift;324tmpsxloc += sxinc;325ind1 = tmpsxloc >> shift;326tmpsxloc += sxinc;327dstA0 = *(mlib_u8*)(src + ind0);328dstA1 = *(mlib_u8*)(src + ind1);329330dstARGB = vis_freg_pair(src[ind0], src[ind1]);331332CONVERT_PRE(res0, dstA0, vis_read_hi(dstARGB));333CONVERT_PRE(res1, dstA1, vis_read_lo(dstARGB));334335res0 = vis_fpack16_pair(res0, res1);336337*(mlib_d64*)(dst + i) = res0;338vis_pst_8(dstARGB, dst + i, 0x88);339}340341if (i < width) {342ind0 = tmpsxloc >> shift;343tmpsxloc += sxinc;344dstA0 = *(mlib_u8*)(src + ind0);345dstARGB0 = src[ind0];346CONVERT_PRE(res0, dstA0, dstARGB0);347dst[i] = vis_fpack16(res0);348*(mlib_u8*)(dst + i) = dstA0;349}350351PTR_ADD(dstBase, dstScan);352syloc += syinc;353}354}355356/***************************************************************/357358void ADD_SUFF(IntArgbToIntArgbPreXorBlit)(BLIT_PARAMS)359{360mlib_s32 dstScan = pDstInfo->scanStride;361mlib_s32 srcScan = pSrcInfo->scanStride;362mlib_s32 xorpixel = pCompInfo->details.xorPixel;363mlib_s32 alphamask = pCompInfo->alphaMask;364mlib_s32 dstA0, dstA1;365mlib_d64 res0, res1, dstARGB, dd, d_xorpixel, d_alphamask, maskRGB;366mlib_d64 d_round;367mlib_f32 dstARGB0, ff;368mlib_s32 i, i0, j;369370vis_write_gsr(0 << 3);371372if (dstScan == 4*width && srcScan == 4*width) {373width *= height;374height = 1;375}376377d_xorpixel = vis_to_double_dup(xorpixel);378d_alphamask = vis_to_double_dup(alphamask);379maskRGB = vis_to_double_dup(0xFFFFFF);380d_round = vis_to_double_dup(((1 << 16) | 1) << 6);381382xorpixel >>= 24;383alphamask >>= 24;384385for (j = 0; j < height; j++) {386mlib_f32 *src = srcBase;387mlib_f32 *dst = dstBase;388389i = i0 = 0;390391if ((mlib_s32)dst & 7) {392dstA0 = *(mlib_u8*)(src + i);393dstARGB0 = src[i];394if (dstA0 & 0x80) {395CONVERT_PRE(res0, dstA0, dstARGB0);396res0 = vis_fpadd16(res0, d_round);397ff = vis_fpack16(res0);398ff = vis_fxors(ff, vis_read_hi(d_xorpixel));399ff = vis_fandnots(vis_read_hi(d_alphamask), ff);400ff = vis_fxors(ff, dst[i]);401dstA0 = *(mlib_u8*)(dst + i) ^402((dstA0 ^ xorpixel) &~ alphamask);403dst[i] = ff;404*(mlib_u8*)(dst + i) = dstA0;405}406407i0 = 1;408}409410#pragma pipeloop(0)411for (i = i0; i <= (mlib_s32)width - 2; i += 2) {412dstA0 = *(mlib_u8*)(src + i);413dstA1 = *(mlib_u8*)(src + i + 1);414dstARGB = vis_freg_pair(src[i], src[i + 1]);415416CONVERT_PRE(res0, dstA0, vis_read_hi(dstARGB));417CONVERT_PRE(res1, dstA1, vis_read_lo(dstARGB));418res0 = vis_fpadd16(res0, d_round);419res1 = vis_fpadd16(res1, d_round);420dd = vis_fpack16_pair(res0, res1);421422dd = vis_for(vis_fand(maskRGB, dd), vis_fandnot(maskRGB, dstARGB));423424dd = vis_fxor(dd, d_xorpixel);425dd = vis_fandnot(d_alphamask, dd);426dd = vis_fxor(dd, *(mlib_d64*)(dst + i));427428vis_pst_32(dd, dst + i, ((dstA0 >> 6) & 2) | (dstA1 >> 7));429}430431if (i < width) {432dstA0 = *(mlib_u8*)(src + i);433dstARGB0 = src[i];434if (dstA0 & 0x80) {435CONVERT_PRE(res0, dstA0, dstARGB0);436res0 = vis_fpadd16(res0, d_round);437ff = vis_fpack16(res0);438ff = vis_fxors(ff, vis_read_hi(d_xorpixel));439ff = vis_fandnots(vis_read_hi(d_alphamask), ff);440ff = vis_fxors(ff, dst[i]);441dstA0 = *(mlib_u8*)(dst + i) ^442((dstA0 ^ xorpixel) &~ alphamask);443dst[i] = ff;444*(mlib_u8*)(dst + i) = dstA0;445}446}447448PTR_ADD(dstBase, dstScan);449PTR_ADD(srcBase, srcScan);450}451}452453/***************************************************************/454455void ADD_SUFF(IntRgbToIntArgbPreConvert)(BLIT_PARAMS)456{457mlib_s32 dstScan = pDstInfo->scanStride;458mlib_s32 srcScan = pSrcInfo->scanStride;459mlib_d64 dd, mask;460mlib_s32 i, i0, j;461462if (dstScan == 4*width && srcScan == 4*width) {463width *= height;464height = 1;465}466467mask = vis_to_double_dup(0xFF000000);468469for (j = 0; j < height; j++) {470mlib_f32 *src = srcBase;471mlib_f32 *dst = dstBase;472473i = i0 = 0;474475if ((mlib_s32)dst & 7) {476dst[i] = vis_fors(src[i], vis_read_hi(mask));477i0 = 1;478}479480#pragma pipeloop(0)481for (i = i0; i <= (mlib_s32)width - 2; i += 2) {482dd = vis_freg_pair(src[i], src[i + 1]);483484*(mlib_d64*)(dst + i) = vis_for(dd, mask);485}486487if (i < width) {488dst[i] = vis_fors(src[i], vis_read_hi(mask));489}490491PTR_ADD(dstBase, dstScan);492PTR_ADD(srcBase, srcScan);493}494}495496/***************************************************************/497498void ADD_SUFF(IntRgbToIntArgbPreScaleConvert)(SCALE_PARAMS)499{500mlib_s32 dstScan = pDstInfo->scanStride;501mlib_s32 srcScan = pSrcInfo->scanStride;502mlib_d64 dd, mask;503mlib_s32 j;504505mask = vis_to_double_dup(0xFF000000);506507for (j = 0; j < height; j++) {508mlib_f32 *src = srcBase;509mlib_f32 *dst = dstBase;510mlib_f32 *dst_end = dst + width;511mlib_s32 tmpsxloc = sxloc;512513PTR_ADD(src, (syloc >> shift) * srcScan);514515if ((mlib_s32)dst & 7) {516*dst++ = vis_fors(src[tmpsxloc >> shift], vis_read_hi(mask));517tmpsxloc += sxinc;518}519520#pragma pipeloop(0)521for (; dst <= dst_end - 2; dst += 2) {522dd = vis_freg_pair(src[tmpsxloc >> shift],523src[(tmpsxloc + sxinc) >> shift]);524*(mlib_d64*)dst = vis_for(dd, mask);525tmpsxloc += 2*sxinc;526}527528if (dst < dst_end) {529*dst = vis_fors(src[tmpsxloc >> shift], vis_read_hi(mask));530}531532PTR_ADD(dstBase, dstScan);533syloc += syinc;534}535}536537/***************************************************************/538539#define BGR_TO_ARGB { \540mlib_d64 sda, sdb, sdc, sdd, sde, sdf; \541mlib_d64 s_1, s_2, s_3, a13, b13, a02, b02; \542\543sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \544sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_hi(sd2)); \545sdc = vis_fpmerge(vis_read_hi(sd1), vis_read_lo(sd2)); \546\547sdd = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sdb)); \548sde = vis_fpmerge(vis_read_lo(sda), vis_read_hi(sdc)); \549sdf = vis_fpmerge(vis_read_hi(sdb), vis_read_lo(sdc)); \550\551s_3 = vis_fpmerge(vis_read_hi(sdd), vis_read_lo(sde)); \552s_2 = vis_fpmerge(vis_read_lo(sdd), vis_read_hi(sdf)); \553s_1 = vis_fpmerge(vis_read_hi(sde), vis_read_lo(sdf)); \554\555a13 = vis_fpmerge(vis_read_hi(s_1), vis_read_hi(s_3)); \556b13 = vis_fpmerge(vis_read_lo(s_1), vis_read_lo(s_3)); \557a02 = vis_fpmerge(vis_read_hi(s_0), vis_read_hi(s_2)); \558b02 = vis_fpmerge(vis_read_lo(s_0), vis_read_lo(s_2)); \559\560dd0 = vis_fpmerge(vis_read_hi(a02), vis_read_hi(a13)); \561dd1 = vis_fpmerge(vis_read_lo(a02), vis_read_lo(a13)); \562dd2 = vis_fpmerge(vis_read_hi(b02), vis_read_hi(b13)); \563dd3 = vis_fpmerge(vis_read_lo(b02), vis_read_lo(b13)); \564}565566/***************************************************************/567568void ADD_SUFF(ThreeByteBgrToIntArgbPreConvert)(BLIT_PARAMS)569{570mlib_s32 dstScan = pDstInfo->scanStride;571mlib_s32 srcScan = pSrcInfo->scanStride;572mlib_d64 *sp;573mlib_d64 s_0;574mlib_d64 s0, s1, s2, s3, sd0, sd1, sd2, dd0, dd1, dd2, dd3;575mlib_s32 i, i0, j;576577if (srcScan == 3*width && dstScan == 4*width) {578width *= height;579height = 1;580}581582s_0 = vis_fone();583584for (j = 0; j < height; j++) {585mlib_u8 *src = srcBase;586mlib_f32 *dst = dstBase;587588i = i0 = 0;589590if ((mlib_s32)dst & 7) {591((mlib_s32*)dst)[i] = GET_ARGBPRE(i);592i0 = 1;593}594595sp = vis_alignaddr(src, 3*i0);596s3 = *sp++;597598#pragma pipeloop(0)599for (i = i0; i <= (mlib_s32)width - 8; i += 8) {600s0 = s3;601s1 = *sp++;602s2 = *sp++;603s3 = *sp++;604sd0 = vis_faligndata(s0, s1);605sd1 = vis_faligndata(s1, s2);606sd2 = vis_faligndata(s2, s3);607608BGR_TO_ARGB609610*(mlib_d64*)(dst + i ) = dd0;611*(mlib_d64*)(dst + i + 2) = dd1;612*(mlib_d64*)(dst + i + 4) = dd2;613*(mlib_d64*)(dst + i + 6) = dd3;614}615616for (; i < width; i++) {617((mlib_s32*)dst)[i] = GET_ARGBPRE(i);618}619620PTR_ADD(dstBase, dstScan);621PTR_ADD(srcBase, srcScan);622}623}624625/***************************************************************/626627void ADD_SUFF(ThreeByteBgrToIntArgbPreScaleConvert)(SCALE_PARAMS)628{629mlib_s32 dstScan = pDstInfo->scanStride;630mlib_s32 srcScan = pSrcInfo->scanStride;631mlib_d64 dd, maskFF;632mlib_s32 i, i0, i1, j;633634maskFF = vis_fone();635636vis_alignaddr(NULL, 7);637638for (j = 0; j < height; j++) {639mlib_u8 *src = srcBase;640mlib_f32 *dst = dstBase;641mlib_f32 *dst_end = dst + width;642mlib_s32 tmpsxloc = sxloc;643644PTR_ADD(src, (syloc >> shift) * srcScan);645646if ((mlib_s32)dst & 7) {647i = tmpsxloc >> shift;648tmpsxloc += sxinc;649*(mlib_s32*)dst = GET_ARGBPRE(i);650dst++;651}652653#pragma pipeloop(0)654for (; dst <= dst_end - 2; dst += 2) {655i0 = tmpsxloc >> shift;656i1 = (tmpsxloc + sxinc) >> shift;657tmpsxloc += 2*sxinc;658659dd = vis_faligndata(vis_ld_u8(src + 3*i1 ), dd);660dd = vis_faligndata(vis_ld_u8(src + 3*i1 + 1), dd);661dd = vis_faligndata(vis_ld_u8(src + 3*i1 + 2), dd);662dd = vis_faligndata(maskFF, dd);663dd = vis_faligndata(vis_ld_u8(src + 3*i0 ), dd);664dd = vis_faligndata(vis_ld_u8(src + 3*i0 + 1), dd);665dd = vis_faligndata(vis_ld_u8(src + 3*i0 + 2), dd);666dd = vis_faligndata(maskFF, dd);667668*(mlib_d64*)dst = dd;669}670671for (; dst < dst_end; dst++) {672i = tmpsxloc >> shift;673tmpsxloc += sxinc;674*(mlib_s32*)dst = GET_ARGBPRE(i);675}676677PTR_ADD(dstBase, dstScan);678syloc += syinc;679}680}681682/***************************************************************/683684void ADD_SUFF(ByteIndexedToIntArgbPreConvert)(BLIT_PARAMS)685{686jint *pixLut = pSrcInfo->lutBase;687mlib_s32 buff[256];688mlib_s32 dstScan = pDstInfo->scanStride;689mlib_s32 srcScan = pSrcInfo->scanStride;690mlib_s32 i, i0, j;691692if (width < 16) {693for (j = 0; j < height; j++) {694mlib_u8 *src = srcBase;695mlib_s32 *dst = dstBase;696697for (i = 0; i < width; i++) {698mlib_s32 a, r, g, b;699mlib_u32 x = pixLut[src[i]];700b = x & 0xff;701g = (x >> 8) & 0xff;702r = (x >> 16) & 0xff;703a = x >> 24;704r = mul8table[a][r];705g = mul8table[a][g];706b = mul8table[a][b];707dst[i] = (a << 24) | (r << 16) | (g << 8) | b;708}709710PTR_ADD(dstBase, dstScan);711PTR_ADD(srcBase, srcScan);712}713return;714}715716if (srcScan == width && dstScan == 4*width) {717width *= height;718height = 1;719}720721ADD_SUFF(IntArgbToIntArgbPreConvert)(pixLut, buff, 256, 1,722pSrcInfo, pDstInfo, pPrim, pCompInfo);723724for (j = 0; j < height; j++) {725mlib_u8 *src = srcBase;726mlib_s32 *dst = dstBase;727728i = i0 = 0;729730if ((mlib_s32)dst & 7) {731dst[i] = buff[src[i]];732i0 = 1;733}734735#pragma pipeloop(0)736for (i = i0; i <= (mlib_s32)width - 2; i += 2) {737*(mlib_d64*)(dst + i) = LOAD_2F32(buff, src[i], src[i + 1]);738}739740for (; i < width; i++) {741dst[i] = buff[src[i]];742}743744PTR_ADD(dstBase, dstScan);745PTR_ADD(srcBase, srcScan);746}747}748749/***************************************************************/750751void ADD_SUFF(ByteIndexedToIntArgbPreScaleConvert)(SCALE_PARAMS)752{753jint *pixLut = pSrcInfo->lutBase;754mlib_s32 buff[256];755mlib_s32 dstScan = pDstInfo->scanStride;756mlib_s32 srcScan = pSrcInfo->scanStride;757mlib_s32 i, j;758759if (width < 16) {760for (j = 0; j < height; j++) {761mlib_u8 *src = srcBase;762mlib_s32 *dst = dstBase;763mlib_s32 tmpsxloc = sxloc;764765PTR_ADD(src, (syloc >> shift) * srcScan);766767for (i = 0; i < width; i++) {768mlib_s32 a, r, g, b;769mlib_u32 x = pixLut[src[tmpsxloc >> shift]];770tmpsxloc += sxinc;771b = x & 0xff;772g = (x >> 8) & 0xff;773r = (x >> 16) & 0xff;774a = x >> 24;775r = mul8table[a][r];776g = mul8table[a][g];777b = mul8table[a][b];778dst[i] = (a << 24) | (r << 16) | (g << 8) | b;779}780781PTR_ADD(dstBase, dstScan);782syloc += syinc;783}784return;785}786787ADD_SUFF(IntArgbToIntArgbPreConvert)(pixLut, buff, 256, 1,788pSrcInfo, pDstInfo, pPrim, pCompInfo);789790for (j = 0; j < height; j++) {791mlib_u8 *src = srcBase;792mlib_s32 *dst = dstBase;793mlib_s32 *dst_end = dst + width;794mlib_s32 tmpsxloc = sxloc;795796PTR_ADD(src, (syloc >> shift) * srcScan);797798if ((mlib_s32)dst & 7) {799*dst++ = buff[src[tmpsxloc >> shift]];800tmpsxloc += sxinc;801}802803#pragma pipeloop(0)804for (; dst <= dst_end - 2; dst += 2) {805*(mlib_d64*)dst = LOAD_2F32(buff, src[tmpsxloc >> shift],806src[(tmpsxloc + sxinc) >> shift]);807tmpsxloc += 2*sxinc;808}809810for (; dst < dst_end; dst++) {811*dst = buff[src[tmpsxloc >> shift]];812tmpsxloc += sxinc;813}814815PTR_ADD(dstBase, dstScan);816syloc += syinc;817}818}819820/***************************************************************/821822void ADD_SUFF(ByteIndexedBmToIntArgbPreXparOver)(BLIT_PARAMS)823{824jint *pixLut = pSrcInfo->lutBase;825mlib_s32 buff[256];826mlib_s32 dstScan = pDstInfo->scanStride;827mlib_s32 srcScan = pSrcInfo->scanStride;828mlib_d64 dd, dzero;829mlib_s32 i, i0, j, x, mask;830831if (width < 16) {832for (j = 0; j < height; j++) {833mlib_u8 *src = srcBase;834mlib_s32 *dst = dstBase;835836for (i = 0; i < width; i++) {837mlib_s32 a, r, g, b;838mlib_s32 x = pixLut[src[i]];839if (x < 0) {840b = x & 0xff;841g = (x >> 8) & 0xff;842r = (x >> 16) & 0xff;843a = (mlib_u32)x >> 24;844r = mul8table[a][r];845g = mul8table[a][g];846b = mul8table[a][b];847dst[i] = (a << 24) | (r << 16) | (g << 8) | b;848}849}850851PTR_ADD(dstBase, dstScan);852PTR_ADD(srcBase, srcScan);853}854return;855}856857if (srcScan == width && dstScan == 4*width) {858width *= height;859height = 1;860}861862ADD_SUFF(IntArgbToIntArgbPreConvert)(pixLut, buff, 256, 1,863pSrcInfo, pDstInfo, pPrim, pCompInfo);864865dzero = vis_fzero();866867for (j = 0; j < height; j++) {868mlib_u8 *src = srcBase;869mlib_s32 *dst = dstBase;870871i = i0 = 0;872873if ((mlib_s32)dst & 7) {874x = buff[src[i]];875if (x < 0) {876dst[i] = x;877}878i0 = 1;879}880881#pragma pipeloop(0)882for (i = i0; i <= (mlib_s32)width - 2; i += 2) {883dd = vis_freg_pair(((mlib_f32*)buff)[src[i]],884((mlib_f32*)buff)[src[i + 1]]);885mask = vis_fcmplt32(dd, dzero);886vis_pst_32(dd, dst + i, mask);887}888889for (; i < width; i++) {890x = buff[src[i]];891if (x < 0) {892dst[i] = x;893}894}895896PTR_ADD(dstBase, dstScan);897PTR_ADD(srcBase, srcScan);898}899}900901/***************************************************************/902903void ADD_SUFF(ByteIndexedBmToIntArgbPreScaleXparOver)(SCALE_PARAMS)904{905jint *pixLut = pSrcInfo->lutBase;906mlib_s32 buff[256];907mlib_s32 dstScan = pDstInfo->scanStride;908mlib_s32 srcScan = pSrcInfo->scanStride;909mlib_d64 dd, dzero;910mlib_s32 i, j, x, mask;911912if (width < 16) {913for (j = 0; j < height; j++) {914mlib_u8 *src = srcBase;915mlib_s32 *dst = dstBase;916mlib_s32 tmpsxloc = sxloc;917918PTR_ADD(src, (syloc >> shift) * srcScan);919920for (i = 0; i < width; i++) {921mlib_s32 a, r, g, b;922mlib_s32 x = pixLut[src[tmpsxloc >> shift]];923tmpsxloc += sxinc;924if (x < 0) {925b = x & 0xff;926g = (x >> 8) & 0xff;927r = (x >> 16) & 0xff;928a = (mlib_u32)x >> 24;929r = mul8table[a][r];930g = mul8table[a][g];931b = mul8table[a][b];932dst[i] = (a << 24) | (r << 16) | (g << 8) | b;933}934}935936PTR_ADD(dstBase, dstScan);937syloc += syinc;938}939return;940}941942ADD_SUFF(IntArgbToIntArgbPreConvert)(pixLut, buff, 256, 1,943pSrcInfo, pDstInfo, pPrim, pCompInfo);944945dzero = vis_fzero();946947for (j = 0; j < height; j++) {948mlib_u8 *src = srcBase;949mlib_s32 *dst = dstBase;950mlib_s32 *dst_end = dst + width;951mlib_s32 tmpsxloc = sxloc;952953PTR_ADD(src, (syloc >> shift) * srcScan);954955if ((mlib_s32)dst & 7) {956x = buff[src[tmpsxloc >> shift]];957tmpsxloc += sxinc;958if (x < 0) {959*dst = x;960}961dst++;962}963964#pragma pipeloop(0)965for (; dst <= dst_end - 2; dst += 2) {966dd = LOAD_2F32(buff, src[tmpsxloc >> shift],967src[(tmpsxloc + sxinc) >> shift]);968tmpsxloc += 2*sxinc;969mask = vis_fcmplt32(dd, dzero);970vis_pst_32(dd, dst, mask);971}972973for (; dst < dst_end; dst++) {974x = buff[src[tmpsxloc >> shift]];975tmpsxloc += sxinc;976if (x < 0) {977*dst = x;978}979}980981PTR_ADD(dstBase, dstScan);982syloc += syinc;983}984}985986/***************************************************************/987988void ADD_SUFF(ByteIndexedBmToIntArgbPreXparBgCopy)(BCOPY_PARAMS)989{990jint *pixLut = pSrcInfo->lutBase;991mlib_s32 buff[256];992mlib_s32 dstScan = pDstInfo->scanStride;993mlib_s32 srcScan = pSrcInfo->scanStride;994mlib_d64 dd, dzero, d_bgpixel;995mlib_s32 i, j, x, mask;996997if (width < 16) {998for (j = 0; j < height; j++) {999mlib_u8 *src = srcBase;1000mlib_s32 *dst = dstBase;10011002for (i = 0; i < width; i++) {1003x = pixLut[src[i]];1004if (x < 0) {1005mlib_s32 a, r, g, b;1006b = x & 0xff;1007g = (x >> 8) & 0xff;1008r = (x >> 16) & 0xff;1009a = (mlib_u32)x >> 24;1010r = mul8table[a][r];1011g = mul8table[a][g];1012b = mul8table[a][b];1013dst[i] = (a << 24) | (r << 16) | (g << 8) | b;1014} else {1015dst[i] = bgpixel;1016}1017}10181019PTR_ADD(dstBase, dstScan);1020PTR_ADD(srcBase, srcScan);1021}1022return;1023}10241025ADD_SUFF(IntArgbToIntArgbPreConvert)(pixLut, buff, 256, 1,1026pSrcInfo, pDstInfo, pPrim, pCompInfo);10271028if (srcScan == width && dstScan == 4*width) {1029width *= height;1030height = 1;1031}10321033dzero = vis_fzero();1034d_bgpixel = vis_to_double_dup(bgpixel);10351036for (j = 0; j < height; j++) {1037mlib_u8 *src = srcBase;1038mlib_s32 *dst = dstBase;1039mlib_s32 *dst_end;10401041dst_end = dst + width;10421043if ((mlib_s32)dst & 7) {1044x = buff[*src++];1045if (x < 0) {1046*dst = x;1047} else {1048*dst = bgpixel;1049}1050dst++;1051}10521053#pragma pipeloop(0)1054for (; dst <= (dst_end - 2); dst += 2) {1055dd = vis_freg_pair(((mlib_f32*)buff)[src[0]],1056((mlib_f32*)buff)[src[1]]);1057mask = vis_fcmplt32(dd, dzero);1058*(mlib_d64*)dst = d_bgpixel;1059vis_pst_32(dd, dst, mask);1060src += 2;1061}10621063while (dst < dst_end) {1064x = buff[*src++];1065if (x < 0) {1066*dst = x;1067} else {1068*dst = bgpixel;1069}1070dst++;1071}10721073PTR_ADD(dstBase, dstScan);1074PTR_ADD(srcBase, srcScan);1075}1076}10771078/***************************************************************/10791080void ADD_SUFF(IntArgbPreDrawGlyphListAA)(SurfaceDataRasInfo * pRasInfo,1081ImageRef *glyphs,1082jint totalGlyphs,1083jint fgpixel, jint argbcolor,1084jint clipLeft, jint clipTop,1085jint clipRight, jint clipBottom,1086NativePrimitive * pPrim,1087CompositeInfo * pCompInfo)1088{1089mlib_s32 glyphCounter;1090mlib_s32 scan = pRasInfo->scanStride;1091mlib_u8 *dstBase, *dstBase0;1092mlib_s32 i, j;1093mlib_d64 dmix0, dmix1, dd, d0, d1, e0, e1;1094mlib_d64 done, d_half;1095mlib_s32 pix;1096mlib_f32 srcG_f;10971098done = vis_to_double_dup(0x7fff7fff);1099d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6));11001101srcG_f = vis_to_float(argbcolor);11021103for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {1104const jubyte *pixels, *pixels0;1105unsigned int rowBytes;1106int left, top;1107int width, height;1108int right, bottom;11091110pixels = (const jubyte *) glyphs[glyphCounter].pixels;11111112if (!pixels) continue;11131114left = glyphs[glyphCounter].x;1115top = glyphs[glyphCounter].y;1116width = glyphs[glyphCounter].width;1117height = glyphs[glyphCounter].height;1118rowBytes = width;1119right = left + width;1120bottom = top + height;1121if (left < clipLeft) {1122pixels += clipLeft - left;1123left = clipLeft;1124}1125if (top < clipTop) {1126pixels += (clipTop - top) * rowBytes;1127top = clipTop;1128}1129if (right > clipRight) {1130right = clipRight;1131}1132if (bottom > clipBottom) {1133bottom = clipBottom;1134}1135if (right <= left || bottom <= top) {1136continue;1137}1138width = right - left;1139height = bottom - top;11401141dstBase = pRasInfo->rasBase;1142PTR_ADD(dstBase, top*scan + 4*left);11431144pixels0 = pixels;1145dstBase0 = dstBase;11461147for (j = 0; j < height; j++) {1148mlib_u8 *src = (void*)pixels;1149mlib_s32 *dst, *dst_end;11501151dst = (void*)dstBase;1152dst_end = dst + width;11531154ADD_SUFF(IntArgbPreToIntArgbConvert)(dstBase, dstBase, width, 1,1155pRasInfo, pRasInfo,1156pPrim, pCompInfo);11571158vis_write_gsr(0 << 3);11591160if ((mlib_s32)dst & 7) {1161pix = *src++;1162dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);1163dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);1164*(mlib_f32*)dst = vis_fpack16(dd);1165dst++;1166}11671168#pragma pipeloop(0)1169for (; dst <= (dst_end - 2); dst += 2) {1170dmix0 = vis_freg_pair(((mlib_f32 *)vis_mul8s_tbl)[src[0]],1171((mlib_f32 *)vis_mul8s_tbl)[src[1]]);1172dmix1 = vis_fpsub16(done, dmix0);1173src += 2;11741175dd = *(mlib_d64*)dst;1176d0 = vis_fmul8x16al(srcG_f, vis_read_hi(dmix0));1177d1 = vis_fmul8x16al(srcG_f, vis_read_lo(dmix0));1178e0 = vis_fmul8x16al(vis_read_hi(dd), vis_read_hi(dmix1));1179e1 = vis_fmul8x16al(vis_read_lo(dd), vis_read_lo(dmix1));1180d0 = vis_fpadd16(vis_fpadd16(d0, d_half), e0);1181d1 = vis_fpadd16(vis_fpadd16(d1, d_half), e1);1182dd = vis_fpack16_pair(d0, d1);11831184*(mlib_d64*)dst = dd;1185}11861187while (dst < dst_end) {1188pix = *src++;1189dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);1190dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);1191*(mlib_f32*)dst = vis_fpack16(dd);1192dst++;1193}11941195PTR_ADD(dstBase, scan);1196pixels += rowBytes;1197}11981199pixels = pixels0;1200dstBase = dstBase0;12011202for (j = 0; j < height; j++) {1203mlib_u8 *src = (void*)pixels;1204mlib_s32 *dst = (void*)dstBase;12051206for (i = 0; i < width; i++) {1207if (src[i] == 255) dst[i] = fgpixel;1208}1209PTR_ADD(dstBase, scan);1210pixels += rowBytes;1211}1212}1213}12141215/***************************************************************/12161217#endif /* JAVA2D_NO_MLIB */121812191220