Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/java2d/loops/vis_IntArgbBm.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/***************************************************************/3031static mlib_u64 vis_amask_arr[] = {320x0000000000000000,330x00000000FF000000,340xFF00000000000000,350xFF000000FF000000,36};3738/***************************************************************/3940void ADD_SUFF(IntArgbBmToIntArgbConvert)(BLIT_PARAMS)41{42mlib_s32 dstScan = pDstInfo->scanStride;43mlib_s32 srcScan = pSrcInfo->scanStride;44mlib_d64 dd, dmask, dFF;45mlib_s32 i, i0, j, x, mask;4647if (dstScan == 4*width && srcScan == 4*width) {48width *= height;49height = 1;50}5152dmask = vis_to_double_dup(0xFFFFFF);53dFF = vis_to_double_dup(0xFFFFFFFF);5455for (j = 0; j < height; j++) {56mlib_s32 *src = srcBase;57mlib_s32 *dst = dstBase;5859i = i0 = 0;6061if ((mlib_s32)dst & 7) {62x = src[i];63dst[i] = (x << 7) >> 7;64i0 = 1;65}6667#pragma pipeloop(0)68for (i = i0; i <= (mlib_s32)width - 2; i += 2) {69mlib_u8 *pp0 = (mlib_u8*)(src + i);70mlib_u8 *pp1 = (mlib_u8*)(src + i + 1);71dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);72dd = vis_fand(dd, dmask);73#if 174mask = ((*pp0 & 1) << 7) | ((*pp1 & 1) << 3);75*(mlib_d64*)(dst + i) = dd;76vis_pst_8(dFF, dst + i, mask);77#else78mask = ((*pp0 & 1) << 1) | (*pp1 & 1);79dd = vis_for(dd, ((mlib_d64*)vis_amask_arr)[mask]);80*(mlib_d64*)(dst + i) = dd;81#endif82}8384if (i < width) {85x = src[i];86dst[i] = (x << 7) >> 7;87}8889PTR_ADD(dstBase, dstScan);90PTR_ADD(srcBase, srcScan);91}92}9394/***************************************************************/9596void ADD_SUFF(IntArgbToIntArgbBmConvert)(BLIT_PARAMS)97{98mlib_s32 dstScan = pDstInfo->scanStride;99mlib_s32 srcScan = pSrcInfo->scanStride;100mlib_d64 dd, dFF;101mlib_s32 i, i0, j, x, mask;102103if (dstScan == 4*width && srcScan == 4*width) {104width *= height;105height = 1;106}107108dFF = vis_to_double_dup(0xFFFFFFFF);109110for (j = 0; j < height; j++) {111mlib_s32 *src = srcBase;112mlib_s32 *dst = dstBase;113114i = i0 = 0;115116if ((mlib_s32)dst & 7) {117x = src[i];118dst[i] = x | ((x >> 31) << 24);119i0 = 1;120}121122#pragma pipeloop(0)123for (i = i0; i <= (mlib_s32)width - 2; i += 2) {124dd = vis_freg_pair(((mlib_f32*)src)[i], ((mlib_f32*)src)[i + 1]);125#ifdef VIS_USE_FCMP126mask = vis_fcmplt32(dd, dzero);127mask = ((mask << 3) | (mask << 6)) & 0x88;128#else129mask = (*(mlib_u8*)(src + i) & 0x80) |130((*(mlib_u8*)(src + i + 1) >> 4) & 0x8);131#endif132*(mlib_d64*)(dst + i) = dd;133vis_pst_8(dFF, dst + i, mask);134}135136if (i < width) {137x = src[i];138dst[i] = x | ((x >> 31) << 24);139}140141PTR_ADD(dstBase, dstScan);142PTR_ADD(srcBase, srcScan);143}144}145146/***************************************************************/147148void ADD_SUFF(IntArgbToIntArgbBmScaleConvert)(SCALE_PARAMS)149{150mlib_s32 dstScan = pDstInfo->scanStride;151mlib_s32 srcScan = pSrcInfo->scanStride;152mlib_d64 dd, dFF;153mlib_s32 j, x, mask;154155dFF = vis_to_double_dup(0xFFFFFFFF);156157for (j = 0; j < height; j++) {158mlib_u32 *src = srcBase;159mlib_u32 *dst = dstBase;160mlib_u32 *dst_end = dst + width;161mlib_s32 tmpsxloc = sxloc;162163PTR_ADD(src, (syloc >> shift) * srcScan);164165if ((mlib_s32)dst & 7) {166x = src[tmpsxloc >> shift];167*dst++ = x | ((x >> 31) << 24);168tmpsxloc += sxinc;169}170171#pragma pipeloop(0)172for (; dst <= dst_end - 2; dst += 2) {173mlib_u8 *pp0 = (mlib_u8*)(src + (tmpsxloc >> shift));174mlib_u8 *pp1 = (mlib_u8*)(src + ((tmpsxloc + sxinc) >> shift));175dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);176#ifdef VIS_USE_FCMP177mask = vis_fcmplt32(dd, dzero);178mask = ((mask << 3) | (mask << 6)) & 0x88;179#else180mask = (*pp0 & 0x80) | ((*pp1 >> 4) & 0x8);181#endif182*(mlib_d64*)dst = dd;183vis_pst_8(dFF, dst, mask);184tmpsxloc += 2*sxinc;185}186187for (; dst < dst_end; dst++) {188x = src[tmpsxloc >> shift];189*dst++ = x | ((x >> 31) << 24);190tmpsxloc += sxinc;191}192193PTR_ADD(dstBase, dstScan);194syloc += syinc;195}196}197198/***************************************************************/199200void ADD_SUFF(ByteIndexedToIntArgbBmConvert)(BLIT_PARAMS)201{202jint *pixLut = pSrcInfo->lutBase;203mlib_s32 dstScan = pDstInfo->scanStride;204mlib_s32 srcScan = pSrcInfo->scanStride;205mlib_d64 dd, dFF;206mlib_s32 i, i0, j, x, mask;207208if (srcScan == width && dstScan == 4*width) {209width *= height;210height = 1;211}212213dFF = vis_to_double_dup(0xFFFFFFFF);214215for (j = 0; j < height; j++) {216mlib_u8 *src = srcBase;217mlib_s32 *dst = dstBase;218219i = i0 = 0;220221if ((mlib_s32)dst & 7) {222x = pixLut[src[i]];223dst[i] = x | ((x >> 31) << 24);224i0 = 1;225}226227#pragma pipeloop(0)228for (i = i0; i <= (mlib_s32)width - 2; i += 2) {229mlib_u8 *pp0 = (mlib_u8*)(pixLut + src[i]);230mlib_u8 *pp1 = (mlib_u8*)(pixLut + src[i + 1]);231dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);232#ifdef VIS_USE_FCMP233mask = vis_fcmplt32(dd, dzero);234mask = ((mask << 3) | (mask << 6)) & 0x88;235#else236mask = (*pp0 & 0x80) | ((*pp1 >> 4) & 0x8);237#endif238*(mlib_d64*)(dst + i) = dd;239vis_pst_8(dFF, dst + i, mask);240}241242for (; i < width; i++) {243x = pixLut[src[i]];244dst[i] = x | ((x >> 31) << 24);245}246247PTR_ADD(dstBase, dstScan);248PTR_ADD(srcBase, srcScan);249}250}251252/***************************************************************/253254void ADD_SUFF(ByteIndexedToIntArgbBmScaleConvert)(SCALE_PARAMS)255{256jint *pixLut = pSrcInfo->lutBase;257mlib_s32 dstScan = pDstInfo->scanStride;258mlib_s32 srcScan = pSrcInfo->scanStride;259mlib_d64 dd, dFF;260mlib_s32 j, x, mask;261262dFF = vis_to_double_dup(0xFFFFFFFF);263264for (j = 0; j < height; j++) {265mlib_u8 *src = srcBase;266mlib_s32 *dst = dstBase;267mlib_s32 *dst_end = dst + width;268mlib_s32 tmpsxloc = sxloc;269270PTR_ADD(src, (syloc >> shift) * srcScan);271272if ((mlib_s32)dst & 7) {273x = pixLut[src[tmpsxloc >> shift]];274*dst++ = x | ((x >> 31) << 24);275tmpsxloc += sxinc;276}277278#pragma pipeloop(0)279for (; dst <= dst_end - 2; dst += 2) {280mlib_u8 *pp0 = (void*)(pixLut + src[tmpsxloc >> shift]);281mlib_u8 *pp1 = (void*)(pixLut + src[(tmpsxloc + sxinc) >> shift]);282dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);283#ifdef VIS_USE_FCMP284mask = vis_fcmplt32(dd, dzero);285mask = ((mask << 3) | (mask << 6)) & 0x88;286#else287mask = (*pp0 & 0x80) | ((*pp1 >> 4) & 0x8);288#endif289*(mlib_d64*)dst = dd;290vis_pst_8(dFF, dst, mask);291tmpsxloc += 2*sxinc;292}293294for (; dst < dst_end; dst++) {295x = pixLut[src[tmpsxloc >> shift]];296*dst++ = x | ((x >> 31) << 24);297tmpsxloc += sxinc;298}299300PTR_ADD(dstBase, dstScan);301syloc += syinc;302}303}304305/***************************************************************/306307void ADD_SUFF(ByteIndexedBmToIntArgbBmXparOver)(BLIT_PARAMS)308{309jint *pixLut = pSrcInfo->lutBase;310mlib_s32 dstScan = pDstInfo->scanStride;311mlib_s32 srcScan = pSrcInfo->scanStride;312mlib_d64 dd, dFF;313mlib_s32 i, i0, j, x, mask;314315if (srcScan == width && dstScan == 4*width) {316width *= height;317height = 1;318}319320dFF = vis_to_double_dup(0xFF000000);321322for (j = 0; j < height; j++) {323mlib_u8 *src = srcBase;324mlib_s32 *dst = dstBase;325326i = i0 = 0;327328if ((mlib_s32)dst & 7) {329x = pixLut[src[i]];330if (x < 0) {331dst[i] = x | 0xFF000000;332}333i0 = 1;334}335336#pragma pipeloop(0)337for (i = i0; i <= (mlib_s32)width - 2; i += 2) {338mlib_u8 *pp0 = (mlib_u8*)(pixLut + src[i]);339mlib_u8 *pp1 = (mlib_u8*)(pixLut + src[i + 1]);340dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);341#ifdef VIS_USE_FCMP342mask = vis_fcmplt32(dd, dzero);343#else344mask = ((*pp0 & 0x80) >> 6) | ((*pp1 & 0x80) >> 7);345#endif346dd = vis_for(dd, dFF);347vis_pst_32(dd, dst + i, mask);348}349350for (; i < width; i++) {351x = pixLut[src[i]];352if (x < 0) {353dst[i] = x | 0xFF000000;354}355}356357PTR_ADD(dstBase, dstScan);358PTR_ADD(srcBase, srcScan);359}360}361362/***************************************************************/363364void ADD_SUFF(ByteIndexedBmToIntArgbBmScaleXparOver)(SCALE_PARAMS)365{366jint *pixLut = pSrcInfo->lutBase;367mlib_s32 dstScan = pDstInfo->scanStride;368mlib_s32 srcScan = pSrcInfo->scanStride;369mlib_d64 dd, dFF;370mlib_s32 j, x, mask;371372dFF = vis_to_double_dup(0xFF000000);373374for (j = 0; j < height; j++) {375mlib_u8 *src = srcBase;376mlib_s32 *dst = dstBase;377mlib_s32 *dst_end = dst + width;378mlib_s32 tmpsxloc = sxloc;379380PTR_ADD(src, (syloc >> shift) * srcScan);381382if ((mlib_s32)dst & 7) {383x = pixLut[src[tmpsxloc >> shift]];384tmpsxloc += sxinc;385if (x < 0) {386*dst = x | 0xFF000000;387}388dst++;389}390391#pragma pipeloop(0)392for (; dst <= dst_end - 2; dst += 2) {393mlib_u8 *pp0 = (void*)(pixLut + src[tmpsxloc >> shift]);394mlib_u8 *pp1 = (void*)(pixLut + src[(tmpsxloc + sxinc) >> shift]);395dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);396#ifdef VIS_USE_FCMP397mask = vis_fcmplt32(dd, dzero);398#else399mask = ((*pp0 & 0x80) >> 6) | ((*pp1 & 0x80) >> 7);400#endif401dd = vis_for(dd, dFF);402vis_pst_32(dd, dst, mask);403tmpsxloc += 2*sxinc;404}405406for (; dst < dst_end; dst++) {407x = pixLut[src[tmpsxloc >> shift]];408tmpsxloc += sxinc;409if (x < 0) {410*dst = x | 0xFF000000;411}412}413414PTR_ADD(dstBase, dstScan);415syloc += syinc;416}417}418419/***************************************************************/420421void ADD_SUFF(ByteIndexedBmToIntArgbBmXparBgCopy)(BCOPY_PARAMS)422{423jint *pixLut = pSrcInfo->lutBase;424mlib_s32 dstScan = pDstInfo->scanStride;425mlib_s32 srcScan = pSrcInfo->scanStride;426mlib_d64 dd, dFF, d_bgpixel;427mlib_s32 j, x, mask;428429if (srcScan == width && dstScan == 4*width) {430width *= height;431height = 1;432}433434dFF = vis_to_double_dup(0xFF000000);435d_bgpixel = vis_to_double_dup(bgpixel);436437for (j = 0; j < height; j++) {438mlib_u8 *src = srcBase;439mlib_s32 *dst = dstBase;440mlib_s32 *dst_end;441442dst_end = dst + width;443444if ((mlib_s32)dst & 7) {445x = pixLut[*src++];446if (x < 0) {447*dst = x | 0xFF000000;448} else {449*dst = bgpixel;450}451dst++;452}453454#pragma pipeloop(0)455for (; dst <= (dst_end - 2); dst += 2) {456mlib_u8 *pp0 = (mlib_u8*)(pixLut + src[0]);457mlib_u8 *pp1 = (mlib_u8*)(pixLut + src[1]);458dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1);459#ifdef VIS_USE_FCMP460mask = vis_fcmplt32(dd, dzero);461#else462mask = ((*pp0 & 0x80) >> 6) | ((*pp1 & 0x80) >> 7);463#endif464dd = vis_for(dd, dFF);465*(mlib_d64*)dst = d_bgpixel;466vis_pst_32(dd, dst, mask);467src += 2;468}469470while (dst < dst_end) {471x = pixLut[*src++];472if (x < 0) {473*dst = x | 0xFF000000;474} else {475*dst = bgpixel;476}477dst++;478}479480PTR_ADD(dstBase, dstScan);481PTR_ADD(srcBase, srcScan);482}483}484485/***************************************************************/486487void ADD_SUFF(IntArgbAlphaMaskFill)(void *rasBase,488jubyte *pMask,489jint maskOff,490jint maskScan,491jint width,492jint height,493jint fgColor,494SurfaceDataRasInfo *pRasInfo,495NativePrimitive *pPrim,496CompositeInfo *pCompInfo);497498void ADD_SUFF(IntArgbBmAlphaMaskFill)(void *rasBase,499jubyte *pMask,500jint maskOff,501jint maskScan,502jint width,503jint height,504jint fgColor,505SurfaceDataRasInfo *pRasInfo,506NativePrimitive *pPrim,507CompositeInfo *pCompInfo)508{509mlib_u8 *dst = rasBase;510mlib_s32 rasScan = pRasInfo->scanStride;511mlib_s32 i, j;512513if (rasScan == 4*width) {514width *= height;515height = 1;516}517518for (j = 0; j < height; j++) {519for (i = 0; i < width; i++) {520dst[4*i] = ((mlib_s32)dst[4*i] << 31) >> 31;521}522PTR_ADD(dst, rasScan);523}524525ADD_SUFF(IntArgbAlphaMaskFill)(rasBase, pMask, maskOff, maskScan,526width, height,527fgColor, pRasInfo, pPrim, pCompInfo);528529for (j = 0; j < height; j++) {530for (i = 0; i < width; i++) {531dst[4*i] = ((mlib_s32)dst[4*i] << 31) >> 31;532}533PTR_ADD(dst, rasScan);534}535}536537/***************************************************************/538539void ADD_SUFF(IntArgbBmDrawGlyphListAA)(GLYPH_LIST_PARAMS)540{541mlib_s32 glyphCounter;542mlib_s32 scan = pRasInfo->scanStride;543mlib_u8 *dstBase;544mlib_s32 j;545mlib_d64 dmix0, dmix1, dd, d0, d1, e0, e1, fgpixel_d;546mlib_d64 done, done16, d_half;547mlib_s32 pix, mask, srcA, dstA;548mlib_f32 srcG_f;549550done = vis_to_double_dup(0x7fff7fff);551done16 = vis_to_double_dup(0x7fff);552d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6));553554fgpixel_d = vis_to_double_dup(fgpixel);555srcG_f = vis_to_float(argbcolor);556557srcA = (mlib_u32)argbcolor >> 24;558559vis_write_gsr(0 << 3);560561for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {562const jubyte *pixels;563unsigned int rowBytes;564int left, top;565int width, height;566int right, bottom;567568pixels = (const jubyte *) glyphs[glyphCounter].pixels;569570if (!pixels) continue;571572left = glyphs[glyphCounter].x;573top = glyphs[glyphCounter].y;574width = glyphs[glyphCounter].width;575height = glyphs[glyphCounter].height;576rowBytes = width;577right = left + width;578bottom = top + height;579if (left < clipLeft) {580pixels += clipLeft - left;581left = clipLeft;582}583if (top < clipTop) {584pixels += (clipTop - top) * rowBytes;585top = clipTop;586}587if (right > clipRight) {588right = clipRight;589}590if (bottom > clipBottom) {591bottom = clipBottom;592}593if (right <= left || bottom <= top) {594continue;595}596width = right - left;597height = bottom - top;598599dstBase = pRasInfo->rasBase;600PTR_ADD(dstBase, top*scan + 4*left);601602for (j = 0; j < height; j++) {603mlib_u8 *src = (void*)pixels;604mlib_s32 *dst, *dst_end;605606dst = (void*)dstBase;607dst_end = dst + width;608609if ((mlib_s32)dst & 7) {610pix = *src++;611if (pix) {612dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);613dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);614*(mlib_f32*)dst = vis_fpack16(dd);615dstA = ((dst[0] << 7) >> 31) & 0xff;616dstA = mul8table[dstA][255 - pix] + mul8table[srcA][pix];617((mlib_u8*)dst)[0] = dstA >> 7;618if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);619}620dst++;621}622623#pragma pipeloop(0)624for (; dst <= (dst_end - 2); dst += 2) {625mlib_s32 pix0 = src[0];626mlib_s32 pix1 = src[1];627dmix0 = vis_freg_pair(((mlib_f32 *)vis_mul8s_tbl)[pix0],628((mlib_f32 *)vis_mul8s_tbl)[pix1]);629mask = vis_fcmplt32(dmix0, done16);630dmix1 = vis_fpsub16(done, dmix0);631src += 2;632633dd = *(mlib_d64*)dst;634d0 = vis_fmul8x16al(srcG_f, vis_read_hi(dmix0));635d1 = vis_fmul8x16al(srcG_f, vis_read_lo(dmix0));636e0 = vis_fmul8x16al(vis_read_hi(dd), vis_read_hi(dmix1));637e1 = vis_fmul8x16al(vis_read_lo(dd), vis_read_lo(dmix1));638d0 = vis_fpadd16(vis_fpadd16(d0, d_half), e0);639d1 = vis_fpadd16(vis_fpadd16(d1, d_half), e1);640dd = vis_fpack16_pair(d0, d1);641642*(mlib_d64*)dst = dd;643dstA = ((dst[0] << 7) >> 31) & 0xff;644dstA = mul8table[dstA][255 - pix0] + mul8table[srcA][pix0];645pix0 = (-pix0) >> 31;646((mlib_u8*)dst)[0] = ((dstA >> 7) & pix0) |647(((mlib_u8*)dst)[0] &~ pix0);648dstA = ((dst[1] << 7) >> 31) & 0xff;649dstA = mul8table[dstA][255 - pix1] + mul8table[srcA][pix1];650pix1 = (-pix1) >> 31;651((mlib_u8*)dst)[4] = ((dstA >> 7) & pix1) |652(((mlib_u8*)dst)[4] &~ pix1);653654vis_pst_32(fgpixel_d, dst, ~mask);655}656657while (dst < dst_end) {658pix = *src++;659if (pix) {660dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);661dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);662*(mlib_f32*)dst = vis_fpack16(dd);663dstA = ((dst[0] << 7) >> 31) & 0xff;664dstA = mul8table[dstA][255 - pix] + mul8table[srcA][pix];665((mlib_u8*)dst)[0] = dstA >> 7;666if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);667}668dst++;669}670671PTR_ADD(dstBase, scan);672pixels += rowBytes;673}674}675}676677/***************************************************************/678679#endif /* JAVA2D_NO_MLIB */680681682