Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/java2d/loops/vis_IntRgbx.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#define Gray2RGBx(x) \32(x << 24) | (x << 16) | (x << 8)3334/***************************************************************/3536#define READ_RGBx(i) \37(src[3*i + 2] << 24) | (src[3*i + 1] << 16) | (src[3*i] << 8)3839/***************************************************************/4041void ADD_SUFF(IntRgbxToIntArgbConvert)(BLIT_PARAMS)42{43mlib_s32 dstScan = pDstInfo->scanStride;44mlib_s32 srcScan = pSrcInfo->scanStride;45mlib_d64 dd, mask;46mlib_s32 i, i0, j;4748if (dstScan == 4*width && srcScan == 4*width) {49width *= height;50height = 1;51}5253mask = vis_to_double_dup(0xFF000000);54vis_alignaddr(NULL, 7);5556for (j = 0; j < height; j++) {57mlib_u32 *src = srcBase;58mlib_u32 *dst = dstBase;5960i = i0 = 0;6162if ((mlib_s32)dst & 7) {63dst[i] = 0xff000000 | (src[i] >> 8);64i0 = 1;65}6667#pragma pipeloop(0)68for (i = i0; i <= (mlib_s32)width - 2; i += 2) {69dd = vis_freg_pair(((mlib_f32*)src)[i], ((mlib_f32*)src)[i + 1]);70dd = vis_faligndata(dd, dd);71*(mlib_d64*)(dst + i) = vis_for(dd, mask);72}7374if (i < width) {75dst[i] = 0xff000000 | (src[i] >> 8);76}7778PTR_ADD(dstBase, dstScan);79PTR_ADD(srcBase, srcScan);80}81}8283/***************************************************************/8485void ADD_SUFF(IntRgbxToIntArgbScaleConvert)(SCALE_PARAMS)86{87mlib_s32 dstScan = pDstInfo->scanStride;88mlib_s32 srcScan = pSrcInfo->scanStride;89mlib_d64 dd, mask;90mlib_s32 j;9192mask = vis_to_double_dup(0xFF000000);93vis_alignaddr(NULL, 7);9495for (j = 0; j < height; j++) {96mlib_u32 *src = srcBase;97mlib_u32 *dst = dstBase;98mlib_u32 *dst_end = dst + width;99mlib_s32 tmpsxloc = sxloc;100101PTR_ADD(src, (syloc >> shift) * srcScan);102103if ((mlib_s32)dst & 7) {104*dst++ = 0xff000000 | (src[tmpsxloc >> shift] >> 8);105tmpsxloc += sxinc;106}107108#pragma pipeloop(0)109for (; dst <= dst_end - 2; dst += 2) {110dd = vis_freg_pair(((mlib_f32*)src)[tmpsxloc >> shift],111((mlib_f32*)src)[(tmpsxloc + sxinc) >> shift]);112dd = vis_faligndata(dd, dd);113*(mlib_d64*)dst = vis_for(dd, mask);114tmpsxloc += 2*sxinc;115}116117for (; dst < dst_end; dst++) {118*dst++ = 0xff000000 | (src[tmpsxloc >> shift] >> 8);119tmpsxloc += sxinc;120}121122PTR_ADD(dstBase, dstScan);123syloc += syinc;124}125}126127/***************************************************************/128129void ADD_SUFF(IntArgbToIntRgbxConvert)(BLIT_PARAMS)130{131mlib_s32 dstScan = pDstInfo->scanStride;132mlib_s32 srcScan = pSrcInfo->scanStride;133mlib_d64 dd, mask;134mlib_s32 i, i0, j;135136if (dstScan == 4*width && srcScan == 4*width) {137width *= height;138height = 1;139}140141mask = vis_to_double_dup(0xFFFFFF00);142vis_alignaddr(NULL, 1);143144for (j = 0; j < height; j++) {145mlib_u32 *src = srcBase;146mlib_u32 *dst = dstBase;147148i = i0 = 0;149150if ((mlib_s32)dst & 7) {151dst[i] = src[i] << 8;152i0 = 1;153}154155#pragma pipeloop(0)156for (i = i0; i <= (mlib_s32)width - 2; i += 2) {157dd = vis_freg_pair(((mlib_f32*)src)[i], ((mlib_f32*)src)[i + 1]);158dd = vis_faligndata(dd, dd);159*(mlib_d64*)(dst + i) = vis_fand(dd, mask);160}161162if (i < width) {163dst[i] = src[i] << 8;164}165166PTR_ADD(dstBase, dstScan);167PTR_ADD(srcBase, srcScan);168}169}170171/***************************************************************/172173void ADD_SUFF(IntArgbToIntRgbxScaleConvert)(SCALE_PARAMS)174{175mlib_s32 dstScan = pDstInfo->scanStride;176mlib_s32 srcScan = pSrcInfo->scanStride;177mlib_d64 dd, mask;178mlib_s32 j;179180mask = vis_to_double_dup(0xFFFFFF00);181vis_alignaddr(NULL, 1);182183for (j = 0; j < height; j++) {184mlib_u32 *src = srcBase;185mlib_u32 *dst = dstBase;186mlib_u32 *dst_end = dst + width;187mlib_s32 tmpsxloc = sxloc;188189PTR_ADD(src, (syloc >> shift) * srcScan);190191if ((mlib_s32)dst & 7) {192*dst++ = src[tmpsxloc >> shift] << 8;193tmpsxloc += sxinc;194}195196#pragma pipeloop(0)197for (; dst <= dst_end - 2; dst += 2) {198dd = vis_freg_pair(((mlib_f32*)src)[tmpsxloc >> shift],199((mlib_f32*)src)[(tmpsxloc + sxinc) >> shift]);200dd = vis_faligndata(dd, dd);201*(mlib_d64*)dst = vis_fand(dd, mask);202tmpsxloc += 2*sxinc;203}204205for (; dst < dst_end; dst++) {206*dst++ = src[tmpsxloc >> shift] << 8;207tmpsxloc += sxinc;208}209210PTR_ADD(dstBase, dstScan);211syloc += syinc;212}213}214215/***************************************************************/216217#define BGR_TO_RGBx { \218mlib_d64 sda, sdb, sdc, sdd, sde, sdf; \219mlib_d64 a13, b13, a02, b02; \220\221sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \222sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_hi(sd2)); \223sdc = vis_fpmerge(vis_read_hi(sd1), vis_read_lo(sd2)); \224\225sdd = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sdb)); \226sde = vis_fpmerge(vis_read_lo(sda), vis_read_hi(sdc)); \227sdf = vis_fpmerge(vis_read_hi(sdb), vis_read_lo(sdc)); \228\229s_2 = vis_fpmerge(vis_read_hi(sdd), vis_read_lo(sde)); \230s_1 = vis_fpmerge(vis_read_lo(sdd), vis_read_hi(sdf)); \231s_0 = vis_fpmerge(vis_read_hi(sde), vis_read_lo(sdf)); \232\233a13 = vis_fpmerge(vis_read_hi(s_1), vis_read_hi(s_3)); \234b13 = vis_fpmerge(vis_read_lo(s_1), vis_read_lo(s_3)); \235a02 = vis_fpmerge(vis_read_hi(s_0), vis_read_hi(s_2)); \236b02 = vis_fpmerge(vis_read_lo(s_0), vis_read_lo(s_2)); \237\238dd0 = vis_fpmerge(vis_read_hi(a02), vis_read_hi(a13)); \239dd1 = vis_fpmerge(vis_read_lo(a02), vis_read_lo(a13)); \240dd2 = vis_fpmerge(vis_read_hi(b02), vis_read_hi(b13)); \241dd3 = vis_fpmerge(vis_read_lo(b02), vis_read_lo(b13)); \242}243244/***************************************************************/245246void ADD_SUFF(ThreeByteBgrToIntRgbxConvert)(BLIT_PARAMS)247{248mlib_s32 dstScan = pDstInfo->scanStride;249mlib_s32 srcScan = pSrcInfo->scanStride;250mlib_d64 *sp;251mlib_d64 s_0, s_1, s_2, s_3;252mlib_d64 s0, s1, s2, s3, sd0, sd1, sd2, dd0, dd1, dd2, dd3;253mlib_s32 i, i0, j;254255if (width < 16) {256for (j = 0; j < height; j++) {257mlib_u8 *src = srcBase;258mlib_u32 *dst = dstBase;259260for (i = 0; i < width; i++) {261dst[i] = READ_RGBx(i);262}263264PTR_ADD(dstBase, dstScan);265PTR_ADD(srcBase, srcScan);266}267return;268}269270if (srcScan == 3*width && dstScan == 4*width) {271width *= height;272height = 1;273}274275s_3 = vis_fzero();276277for (j = 0; j < height; j++) {278mlib_u8 *src = srcBase;279mlib_f32 *dst = dstBase;280281i = i0 = 0;282283if ((mlib_s32)dst & 7) {284((mlib_s32*)dst)[i] = READ_RGBx(i);285i0 = 1;286}287288sp = vis_alignaddr(src, 3*i0);289s3 = *sp++;290291#pragma pipeloop(0)292for (i = i0; i <= (mlib_s32)width - 8; i += 8) {293s0 = s3;294s1 = *sp++;295s2 = *sp++;296s3 = *sp++;297sd0 = vis_faligndata(s0, s1);298sd1 = vis_faligndata(s1, s2);299sd2 = vis_faligndata(s2, s3);300301BGR_TO_RGBx302303*(mlib_d64*)(dst + i ) = dd0;304*(mlib_d64*)(dst + i + 2) = dd1;305*(mlib_d64*)(dst + i + 4) = dd2;306*(mlib_d64*)(dst + i + 6) = dd3;307}308309for (; i < width; i++) {310((mlib_s32*)dst)[i] = READ_RGBx(i);311}312313PTR_ADD(dstBase, dstScan);314PTR_ADD(srcBase, srcScan);315}316}317318/***************************************************************/319320void ADD_SUFF(ThreeByteBgrToIntRgbxScaleConvert)(SCALE_PARAMS)321{322mlib_s32 dstScan = pDstInfo->scanStride;323mlib_s32 srcScan = pSrcInfo->scanStride;324mlib_d64 dd, dzero;325mlib_s32 i, i0, i1, j;326327if (width < 16) {328for (j = 0; j < height; j++) {329mlib_u8 *src = srcBase;330mlib_s32 *dst = dstBase;331mlib_s32 *dst_end = dst + width;332mlib_s32 tmpsxloc = sxloc;333334PTR_ADD(src, (syloc >> shift) * srcScan);335336for (; dst < dst_end; dst++) {337i = tmpsxloc >> shift;338tmpsxloc += sxinc;339*(mlib_s32*)dst = READ_RGBx(i);340}341342PTR_ADD(dstBase, dstScan);343syloc += syinc;344}345return;346}347348dzero = vis_fzero();349350vis_alignaddr(NULL, 7);351352for (j = 0; j < height; j++) {353mlib_u8 *src = srcBase;354mlib_f32 *dst = dstBase;355mlib_f32 *dst_end = dst + width;356mlib_s32 tmpsxloc = sxloc;357358PTR_ADD(src, (syloc >> shift) * srcScan);359360if ((mlib_s32)dst & 7) {361i = tmpsxloc >> shift;362tmpsxloc += sxinc;363*(mlib_s32*)dst = READ_RGBx(i);364dst++;365}366367#pragma pipeloop(0)368for (; dst <= dst_end - 2; dst += 2) {369i0 = tmpsxloc >> shift;370i1 = (tmpsxloc + sxinc) >> shift;371tmpsxloc += 2*sxinc;372373dd = vis_faligndata(vis_ld_u8(src + 3*i1 ), dzero);374dd = vis_faligndata(vis_ld_u8(src + 3*i1 + 1), dd);375dd = vis_faligndata(vis_ld_u8(src + 3*i1 + 2), dd);376dd = vis_faligndata(dzero, dd);377dd = vis_faligndata(vis_ld_u8(src + 3*i0 ), dd);378dd = vis_faligndata(vis_ld_u8(src + 3*i0 + 1), dd);379dd = vis_faligndata(vis_ld_u8(src + 3*i0 + 2), dd);380381*(mlib_d64*)dst = dd;382}383384for (; dst < dst_end; dst++) {385i = tmpsxloc >> shift;386tmpsxloc += sxinc;387*(mlib_s32*)dst = READ_RGBx(i);388}389390PTR_ADD(dstBase, dstScan);391syloc += syinc;392}393}394395/***************************************************************/396397void ADD_SUFF(ByteGrayToIntRgbxConvert)(BLIT_PARAMS)398{399mlib_s32 dstScan = pDstInfo->scanStride;400mlib_s32 srcScan = pSrcInfo->scanStride;401mlib_d64 d0, d1, d2, d3;402mlib_f32 ff, aa = vis_fzero();403mlib_s32 i, j, x;404405if (width < 8) {406for (j = 0; j < height; j++) {407mlib_u8 *src = srcBase;408mlib_s32 *dst = dstBase;409410for (i = 0; i < width; i++) {411x = src[i];412dst[i] = Gray2RGBx(x);413}414415PTR_ADD(dstBase, dstScan);416PTR_ADD(srcBase, srcScan);417}418return;419}420421if (srcScan == width && dstScan == 4*width) {422width *= height;423height = 1;424}425426for (j = 0; j < height; j++) {427mlib_u8 *src = srcBase;428mlib_s32 *dst = dstBase;429mlib_s32 *dst_end;430431dst_end = dst + width;432433while (((mlib_s32)src & 3) && dst < dst_end) {434x = *src++;435*dst++ = Gray2RGBx(x);436}437438#pragma pipeloop(0)439for (; dst <= (dst_end - 4); dst += 4) {440ff = *(mlib_f32*)src;441d0 = vis_fpmerge(ff, ff);442d1 = vis_fpmerge(ff, aa);443d2 = vis_fpmerge(vis_read_hi(d0), vis_read_hi(d1));444d3 = vis_fpmerge(vis_read_lo(d0), vis_read_lo(d1));445((mlib_f32*)dst)[0] = vis_read_hi(d2);446((mlib_f32*)dst)[1] = vis_read_lo(d2);447((mlib_f32*)dst)[2] = vis_read_hi(d3);448((mlib_f32*)dst)[3] = vis_read_lo(d3);449src += 4;450}451452while (dst < dst_end) {453x = *src++;454*dst++ = Gray2RGBx(x);455}456457PTR_ADD(dstBase, dstScan);458PTR_ADD(srcBase, srcScan);459}460}461462/***************************************************************/463464void ADD_SUFF(ByteGrayToIntRgbxScaleConvert)(SCALE_PARAMS)465{466mlib_s32 dstScan = pDstInfo->scanStride;467mlib_s32 srcScan = pSrcInfo->scanStride;468mlib_d64 d0, d1, d2, d3, dd;469mlib_f32 ff, aa = vis_fzero();470mlib_s32 i, j, x;471472if (width < 16) {473for (j = 0; j < height; j++) {474mlib_u8 *src = srcBase;475mlib_s32 *dst = dstBase;476mlib_s32 tmpsxloc = sxloc;477478PTR_ADD(src, (syloc >> shift) * srcScan);479480for (i = 0; i < width; i++) {481x = src[tmpsxloc >> shift];482tmpsxloc += sxinc;483dst[i] = Gray2RGBx(x);484}485486PTR_ADD(dstBase, dstScan);487syloc += syinc;488}489return;490}491492vis_alignaddr(NULL, 7);493494for (j = 0; j < height; j++) {495mlib_u8 *src = srcBase;496mlib_s32 *dst = dstBase;497mlib_s32 *dst_end;498mlib_s32 tmpsxloc = sxloc;499500PTR_ADD(src, (syloc >> shift) * srcScan);501502dst_end = dst + width;503504#pragma pipeloop(0)505for (; dst <= (dst_end - 4); dst += 4) {506LOAD_NEXT_U8(dd, src + ((tmpsxloc + 3*sxinc) >> shift));507LOAD_NEXT_U8(dd, src + ((tmpsxloc + 2*sxinc) >> shift));508LOAD_NEXT_U8(dd, src + ((tmpsxloc + sxinc) >> shift));509LOAD_NEXT_U8(dd, src + ((tmpsxloc ) >> shift));510tmpsxloc += 4*sxinc;511ff = vis_read_hi(dd);512d0 = vis_fpmerge(ff, ff);513d1 = vis_fpmerge(ff, aa);514d2 = vis_fpmerge(vis_read_hi(d0), vis_read_hi(d1));515d3 = vis_fpmerge(vis_read_lo(d0), vis_read_lo(d1));516((mlib_f32*)dst)[0] = vis_read_hi(d2);517((mlib_f32*)dst)[1] = vis_read_lo(d2);518((mlib_f32*)dst)[2] = vis_read_hi(d3);519((mlib_f32*)dst)[3] = vis_read_lo(d3);520}521522while (dst < dst_end) {523x = src[tmpsxloc >> shift];524tmpsxloc += sxinc;525*dst++ = Gray2RGBx(x);526}527528PTR_ADD(dstBase, dstScan);529syloc += syinc;530}531}532533/***************************************************************/534535void ADD_SUFF(IntArgbBmToIntRgbxXparOver)(BLIT_PARAMS)536{537mlib_s32 dstScan = pDstInfo->scanStride;538mlib_s32 srcScan = pSrcInfo->scanStride;539mlib_d64 dd, maskRGBx;540mlib_s32 i, i0, j, mask;541542if (dstScan == 4*width && srcScan == 4*width) {543width *= height;544height = 1;545}546547vis_alignaddr(NULL, 1);548maskRGBx = vis_to_double_dup(0xFFFFFF00);549550for (j = 0; j < height; j++) {551mlib_s32 *src = srcBase;552mlib_s32 *dst = dstBase;553554i = i0 = 0;555556if ((mlib_s32)dst & 7) {557if (*(mlib_u8*)(src + i)) {558dst[i] = src[i] << 8;559}560i0 = 1;561}562563#pragma pipeloop(0)564for (i = i0; i <= (mlib_s32)width - 2; i += 2) {565dd = vis_freg_pair(((mlib_s32*)src)[i], ((mlib_s32*)src)[i + 1]);566dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);567mask = (((-*(mlib_u8*)(src + i)) >> 31) & 2) |568(((-*(mlib_u8*)(src + i + 1)) >> 31) & 1);569vis_pst_32(dd, dst + i, mask);570}571572if (i < width) {573if (*(mlib_u8*)(src + i)) {574dst[i] = src[i] << 8;575}576}577578PTR_ADD(dstBase, dstScan);579PTR_ADD(srcBase, srcScan);580}581}582583/***************************************************************/584585void ADD_SUFF(IntArgbBmToIntRgbxScaleXparOver)(SCALE_PARAMS)586{587mlib_s32 dstScan = pDstInfo->scanStride;588mlib_s32 srcScan = pSrcInfo->scanStride;589mlib_d64 dd, maskRGBx;590mlib_s32 j, mask;591592vis_alignaddr(NULL, 1);593maskRGBx = vis_to_double_dup(0xFFFFFF00);594595for (j = 0; j < height; j++) {596mlib_s32 *src = srcBase;597mlib_s32 *dst = dstBase;598mlib_s32 *dst_end = dst + width;599mlib_s32 tmpsxloc = sxloc;600601PTR_ADD(src, (syloc >> shift) * srcScan);602603if ((mlib_s32)dst & 7) {604mlib_s32 *pp = src + (tmpsxloc >> shift);605if (*(mlib_u8*)pp) {606*dst = *pp << 8;607}608dst++;609tmpsxloc += sxinc;610}611612#pragma pipeloop(0)613for (; dst <= dst_end - 2; dst += 2) {614mlib_s32 *pp0 = src + (tmpsxloc >> shift);615mlib_s32 *pp1 = src + ((tmpsxloc + sxinc) >> shift);616dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);617dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);618mask = (((-*(mlib_u8*)pp0) >> 31) & 2) |619((mlib_u32)(-*(mlib_u8*)pp1) >> 31);620vis_pst_32(dd, dst, mask);621tmpsxloc += 2*sxinc;622}623624for (; dst < dst_end; dst++) {625mlib_s32 *pp = src + (tmpsxloc >> shift);626if (*(mlib_u8*)pp) {627*dst = *pp << 8;628}629}630631PTR_ADD(dstBase, dstScan);632syloc += syinc;633}634}635636/***************************************************************/637638void ADD_SUFF(IntArgbBmToIntRgbxXparBgCopy)(BCOPY_PARAMS)639{640mlib_s32 dstScan = pDstInfo->scanStride;641mlib_s32 srcScan = pSrcInfo->scanStride;642mlib_d64 dd, d_bgpixel, maskRGBx;643mlib_s32 i, i0, j, mask;644645if (dstScan == 4*width && srcScan == 4*width) {646width *= height;647height = 1;648}649650vis_alignaddr(NULL, 1);651d_bgpixel = vis_to_double_dup(bgpixel);652maskRGBx = vis_to_double_dup(0xFFFFFF00);653654for (j = 0; j < height; j++) {655mlib_s32 *src = srcBase;656mlib_s32 *dst = dstBase;657658i = i0 = 0;659660if ((mlib_s32)dst & 7) {661if (*(mlib_u8*)(src + i)) {662dst[i] = src[i] << 8;663} else {664dst[i] = bgpixel;665}666i0 = 1;667}668669#pragma pipeloop(0)670for (i = i0; i <= (mlib_s32)width - 2; i += 2) {671dd = vis_freg_pair(((mlib_s32*)src)[i], ((mlib_s32*)src)[i + 1]);672dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);673mask = (((-*(mlib_u8*)(src + i)) >> 31) & 2) |674(((-*(mlib_u8*)(src + i + 1)) >> 31) & 1);675*(mlib_d64*)(dst + i) = d_bgpixel;676vis_pst_32(dd, dst + i, mask);677}678679if (i < width) {680if (*(mlib_u8*)(src + i)) {681dst[i] = src[i] << 8;682} else {683dst[i] = bgpixel;684}685}686687PTR_ADD(dstBase, dstScan);688PTR_ADD(srcBase, srcScan);689}690}691692/***************************************************************/693694void ADD_SUFF(ByteIndexedToIntRgbxConvert)(BLIT_PARAMS)695{696jint *pixLut = pSrcInfo->lutBase;697mlib_s32 dstScan = pDstInfo->scanStride;698mlib_s32 srcScan = pSrcInfo->scanStride;699mlib_d64 dd, maskRGBx;700mlib_s32 i, i0, j;701702if (srcScan == width && dstScan == 4*width) {703width *= height;704height = 1;705}706707vis_alignaddr(NULL, 1);708maskRGBx = vis_to_double_dup(0xFFFFFF00);709710for (j = 0; j < height; j++) {711mlib_u8 *src = srcBase;712mlib_s32 *dst = dstBase;713714i = i0 = 0;715716if ((mlib_s32)dst & 7) {717dst[i] = pixLut[src[i]] << 8;718i0 = 1;719}720721#pragma pipeloop(0)722for (i = i0; i <= (mlib_s32)width - 2; i += 2) {723dd = vis_freg_pair(((mlib_f32*)pixLut)[src[i]],724((mlib_f32*)pixLut)[src[i + 1]]);725dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);726*(mlib_d64*)(dst + i) = dd;727}728729for (; i < width; i++) {730dst[i] = pixLut[src[i]] << 8;731}732733PTR_ADD(dstBase, dstScan);734PTR_ADD(srcBase, srcScan);735}736}737738/***************************************************************/739740void ADD_SUFF(ByteIndexedToIntRgbxScaleConvert)(SCALE_PARAMS)741{742jint *pixLut = pSrcInfo->lutBase;743mlib_s32 dstScan = pDstInfo->scanStride;744mlib_s32 srcScan = pSrcInfo->scanStride;745mlib_d64 dd, maskRGBx;746mlib_s32 j;747748vis_alignaddr(NULL, 1);749maskRGBx = vis_to_double_dup(0xFFFFFF00);750751for (j = 0; j < height; j++) {752mlib_u8 *src = srcBase;753mlib_s32 *dst = dstBase;754mlib_s32 *dst_end = dst + width;755mlib_s32 tmpsxloc = sxloc;756757PTR_ADD(src, (syloc >> shift) * srcScan);758759if ((mlib_s32)dst & 7) {760*dst++ = pixLut[src[tmpsxloc >> shift]] << 8;761tmpsxloc += sxinc;762}763764#pragma pipeloop(0)765for (; dst <= dst_end - 2; dst += 2) {766dd = LOAD_2F32(pixLut, src[tmpsxloc >> shift],767src[(tmpsxloc + sxinc) >> shift]);768dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);769*(mlib_d64*)dst = dd;770tmpsxloc += 2*sxinc;771}772773for (; dst < dst_end; dst++) {774*dst = pixLut[src[tmpsxloc >> shift]] << 8;775tmpsxloc += sxinc;776}777778PTR_ADD(dstBase, dstScan);779syloc += syinc;780}781}782783/***************************************************************/784785void ADD_SUFF(ByteIndexedBmToIntRgbxXparOver)(BLIT_PARAMS)786{787jint *pixLut = pSrcInfo->lutBase;788mlib_s32 dstScan = pDstInfo->scanStride;789mlib_s32 srcScan = pSrcInfo->scanStride;790mlib_d64 dd, maskRGBx;791mlib_s32 i, i0, j, x, mask;792793if (srcScan == width && dstScan == 4*width) {794width *= height;795height = 1;796}797798vis_alignaddr(NULL, 1);799maskRGBx = vis_to_double_dup(0xFFFFFF00);800801for (j = 0; j < height; j++) {802mlib_u8 *src = srcBase;803mlib_s32 *dst = dstBase;804805i = i0 = 0;806807if ((mlib_s32)dst & 7) {808x = pixLut[src[i]];809if (x < 0) {810dst[i] = x << 8;811}812i0 = 1;813}814815#pragma pipeloop(0)816for (i = i0; i <= (mlib_s32)width - 2; i += 2) {817mlib_f32 *pp0 = (mlib_f32*)pixLut + src[i];818mlib_f32 *pp1 = (mlib_f32*)pixLut + src[i + 1];819dd = vis_freg_pair(*pp0, *pp1);820mask = (((*(mlib_u8*)pp0) >> 6) & 2) | ((*(mlib_u8*)pp1) >> 7);821dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);822vis_pst_32(dd, dst + i, mask);823}824825for (; i < width; i++) {826x = pixLut[src[i]];827if (x < 0) {828dst[i] = x << 8;829}830}831832PTR_ADD(dstBase, dstScan);833PTR_ADD(srcBase, srcScan);834}835}836837/***************************************************************/838839void ADD_SUFF(ByteIndexedBmToIntRgbxScaleXparOver)(SCALE_PARAMS)840{841jint *pixLut = pSrcInfo->lutBase;842mlib_s32 dstScan = pDstInfo->scanStride;843mlib_s32 srcScan = pSrcInfo->scanStride;844mlib_d64 dd, maskRGBx;845mlib_s32 j, x, mask;846847vis_alignaddr(NULL, 1);848maskRGBx = vis_to_double_dup(0xFFFFFF00);849850for (j = 0; j < height; j++) {851mlib_u8 *src = srcBase;852mlib_s32 *dst = dstBase;853mlib_s32 *dst_end = dst + width;854mlib_s32 tmpsxloc = sxloc;855856PTR_ADD(src, (syloc >> shift) * srcScan);857858if ((mlib_s32)dst & 7) {859x = pixLut[src[tmpsxloc >> shift]];860tmpsxloc += sxinc;861if (x < 0) {862*dst = x << 8;863}864dst++;865}866867#pragma pipeloop(0)868for (; dst <= dst_end - 2; dst += 2) {869mlib_f32 *p0 = (mlib_f32*)pixLut + src[tmpsxloc >> shift];870mlib_f32 *p1 = (mlib_f32*)pixLut + src[(tmpsxloc + sxinc) >> shift];871dd = vis_freg_pair(*p0, *p1);872mask = (((*(mlib_u8*)p0) >> 6) & 2) | ((*(mlib_u8*)p1) >> 7);873dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);874tmpsxloc += 2*sxinc;875vis_pst_32(dd, dst, mask);876}877878for (; dst < dst_end; dst++) {879x = pixLut[src[tmpsxloc >> shift]];880tmpsxloc += sxinc;881if (x < 0) {882*dst = x << 8;883}884}885886PTR_ADD(dstBase, dstScan);887syloc += syinc;888}889}890891/***************************************************************/892893void ADD_SUFF(ByteIndexedBmToIntRgbxXparBgCopy)(BCOPY_PARAMS)894{895jint *pixLut = pSrcInfo->lutBase;896mlib_s32 dstScan = pDstInfo->scanStride;897mlib_s32 srcScan = pSrcInfo->scanStride;898mlib_d64 dd, d_bgpixel, maskRGBx;899mlib_s32 j, x, mask;900901if (srcScan == width && dstScan == 4*width) {902width *= height;903height = 1;904}905906vis_alignaddr(NULL, 1);907maskRGBx = vis_to_double_dup(0xFFFFFF00);908d_bgpixel = vis_to_double_dup(bgpixel);909910for (j = 0; j < height; j++) {911mlib_u8 *src = srcBase;912mlib_s32 *dst = dstBase;913mlib_s32 *dst_end;914915dst_end = dst + width;916917if ((mlib_s32)dst & 7) {918x = pixLut[*src++];919if (x < 0) {920*dst = x << 8;921} else {922*dst = bgpixel;923}924dst++;925}926927#pragma pipeloop(0)928for (; dst <= (dst_end - 2); dst += 2) {929mlib_f32 *pp0 = (mlib_f32*)pixLut + src[0];930mlib_f32 *pp1 = (mlib_f32*)pixLut + src[1];931dd = vis_freg_pair(*pp0, *pp1);932mask = (((*(mlib_u8*)pp0) >> 6) & 2) | ((*(mlib_u8*)pp1) >> 7);933dd = vis_fand(vis_faligndata(dd, dd), maskRGBx);934*(mlib_d64*)dst = d_bgpixel;935vis_pst_32(dd, dst, mask);936src += 2;937}938939while (dst < dst_end) {940x = pixLut[*src++];941if (x < 0) {942*dst = x << 8;943} else {944*dst = bgpixel;945}946dst++;947}948949PTR_ADD(dstBase, dstScan);950PTR_ADD(srcBase, srcScan);951}952}953954/***************************************************************/955956void ADD_SUFF(IntRgbxDrawGlyphListAA)(GLYPH_LIST_PARAMS)957{958mlib_s32 glyphCounter;959mlib_s32 scan = pRasInfo->scanStride;960mlib_u8 *dstBase;961mlib_s32 j;962mlib_d64 dmix0, dmix1, dd, d0, d1, e0, e1, fgpixel_d;963mlib_d64 done, done16, d_half, maskRGB, dzero;964mlib_s32 pix, mask, mask_z;965mlib_f32 srcG_f;966967done = vis_to_double_dup(0x7fff7fff);968done16 = vis_to_double_dup(0x7fff);969d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6));970971fgpixel_d = vis_to_double_dup(fgpixel);972srcG_f = vis_to_float(argbcolor << 8);973maskRGB = vis_to_double_dup(0xffffff00);974dzero = vis_fzero();975976vis_write_gsr(0 << 3);977978for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {979const jubyte *pixels;980unsigned int rowBytes;981int left, top;982int width, height;983int right, bottom;984985pixels = (const jubyte *) glyphs[glyphCounter].pixels;986987if (!pixels) continue;988989left = glyphs[glyphCounter].x;990top = glyphs[glyphCounter].y;991width = glyphs[glyphCounter].width;992height = glyphs[glyphCounter].height;993rowBytes = width;994right = left + width;995bottom = top + height;996if (left < clipLeft) {997pixels += clipLeft - left;998left = clipLeft;999}1000if (top < clipTop) {1001pixels += (clipTop - top) * rowBytes;1002top = clipTop;1003}1004if (right > clipRight) {1005right = clipRight;1006}1007if (bottom > clipBottom) {1008bottom = clipBottom;1009}1010if (right <= left || bottom <= top) {1011continue;1012}1013width = right - left;1014height = bottom - top;10151016dstBase = pRasInfo->rasBase;1017PTR_ADD(dstBase, top*scan + 4*left);10181019for (j = 0; j < height; j++) {1020mlib_u8 *src = (void*)pixels;1021mlib_s32 *dst, *dst_end;10221023dst = (void*)dstBase;1024dst_end = dst + width;10251026if ((mlib_s32)dst & 7) {1027pix = *src++;1028if (pix) {1029dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);1030dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);1031*(mlib_f32*)dst = vis_fands(vis_fpack16(dd),1032vis_read_hi(maskRGB));1033if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);1034}1035dst++;1036}10371038#pragma pipeloop(0)1039for (; dst <= (dst_end - 2); dst += 2) {1040dmix0 = vis_freg_pair(((mlib_f32 *)vis_mul8s_tbl)[src[0]],1041((mlib_f32 *)vis_mul8s_tbl)[src[1]]);1042mask = vis_fcmplt32(dmix0, done16);1043mask_z = vis_fcmpne32(dmix0, dzero);1044dmix1 = vis_fpsub16(done, dmix0);1045src += 2;10461047dd = *(mlib_d64*)dst;1048d0 = vis_fmul8x16al(srcG_f, vis_read_hi(dmix0));1049d1 = vis_fmul8x16al(srcG_f, vis_read_lo(dmix0));1050e0 = vis_fmul8x16al(vis_read_hi(dd), vis_read_hi(dmix1));1051e1 = vis_fmul8x16al(vis_read_lo(dd), vis_read_lo(dmix1));1052d0 = vis_fpadd16(vis_fpadd16(d0, d_half), e0);1053d1 = vis_fpadd16(vis_fpadd16(d1, d_half), e1);1054dd = vis_fpack16_pair(d0, d1);1055dd = vis_fand(dd, maskRGB);10561057vis_pst_32(fgpixel_d, dst, mask_z);1058vis_pst_32(dd, dst, mask & mask_z);1059}10601061while (dst < dst_end) {1062pix = *src++;1063if (pix) {1064dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);1065dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);1066*(mlib_f32*)dst = vis_fands(vis_fpack16(dd),1067vis_read_hi(maskRGB));1068if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);1069}1070dst++;1071}10721073PTR_ADD(dstBase, scan);1074pixels += rowBytes;1075}1076}1077}10781079/***************************************************************/10801081#endif /* JAVA2D_NO_MLIB */108210831084