Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/java2d/loops/vis_IntRgb.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 Gray2Rgb(x) \32(x << 16) | (x << 8) | x3334/***************************************************************/3536#define INT_RGB(r, g, b) \37((r << 16) | (g << 8) | b)3839/***************************************************************/4041void ADD_SUFF(IntRgbToIntArgbConvert)(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);5455for (j = 0; j < height; j++) {56mlib_f32 *src = srcBase;57mlib_f32 *dst = dstBase;5859i = i0 = 0;6061if ((mlib_s32)dst & 7) {62dst[i] = vis_fors(src[i], vis_read_hi(mask));63i0 = 1;64}6566#pragma pipeloop(0)67for (i = i0; i <= (mlib_s32)width - 2; i += 2) {68dd = vis_freg_pair(src[i], src[i + 1]);6970*(mlib_d64*)(dst + i) = vis_for(dd, mask);71}7273if (i < width) {74dst[i] = vis_fors(src[i], vis_read_hi(mask));75}7677PTR_ADD(dstBase, dstScan);78PTR_ADD(srcBase, srcScan);79}80}8182/***************************************************************/8384void ADD_SUFF(IntRgbToIntArgbScaleConvert)(SCALE_PARAMS)85{86mlib_s32 dstScan = pDstInfo->scanStride;87mlib_s32 srcScan = pSrcInfo->scanStride;88mlib_d64 dd, mask;89mlib_s32 j;9091mask = vis_to_double_dup(0xFF000000);9293for (j = 0; j < height; j++) {94mlib_f32 *src = srcBase;95mlib_f32 *dst = dstBase;96mlib_f32 *dst_end = dst + width;97mlib_s32 tmpsxloc = sxloc;9899PTR_ADD(src, (syloc >> shift) * srcScan);100101if ((mlib_s32)dst & 7) {102*dst++ = vis_fors(src[tmpsxloc >> shift], vis_read_hi(mask));103tmpsxloc += sxinc;104}105106#pragma pipeloop(0)107for (; dst <= dst_end - 2; dst += 2) {108dd = vis_freg_pair(src[tmpsxloc >> shift],109src[(tmpsxloc + sxinc) >> shift]);110*(mlib_d64*)dst = vis_for(dd, mask);111tmpsxloc += 2*sxinc;112}113114for (; dst < dst_end; dst++) {115*dst++ = vis_fors(src[tmpsxloc >> shift], vis_read_hi(mask));116tmpsxloc += sxinc;117}118119PTR_ADD(dstBase, dstScan);120syloc += syinc;121}122}123124/***************************************************************/125126#define BGR_TO_ARGB { \127mlib_d64 sda, sdb, sdc, sdd, sde, sdf; \128mlib_d64 s_1, s_2, s_3, a13, b13, a02, b02; \129\130sda = vis_fpmerge(vis_read_hi(sd0), vis_read_lo(sd1)); \131sdb = vis_fpmerge(vis_read_lo(sd0), vis_read_hi(sd2)); \132sdc = vis_fpmerge(vis_read_hi(sd1), vis_read_lo(sd2)); \133\134sdd = vis_fpmerge(vis_read_hi(sda), vis_read_lo(sdb)); \135sde = vis_fpmerge(vis_read_lo(sda), vis_read_hi(sdc)); \136sdf = vis_fpmerge(vis_read_hi(sdb), vis_read_lo(sdc)); \137\138s_3 = vis_fpmerge(vis_read_hi(sdd), vis_read_lo(sde)); \139s_2 = vis_fpmerge(vis_read_lo(sdd), vis_read_hi(sdf)); \140s_1 = vis_fpmerge(vis_read_hi(sde), vis_read_lo(sdf)); \141\142a13 = vis_fpmerge(vis_read_hi(s_1), vis_read_hi(s_3)); \143b13 = vis_fpmerge(vis_read_lo(s_1), vis_read_lo(s_3)); \144a02 = vis_fpmerge(vis_read_hi(s_0), vis_read_hi(s_2)); \145b02 = vis_fpmerge(vis_read_lo(s_0), vis_read_lo(s_2)); \146\147dd0 = vis_fpmerge(vis_read_hi(a02), vis_read_hi(a13)); \148dd1 = vis_fpmerge(vis_read_lo(a02), vis_read_lo(a13)); \149dd2 = vis_fpmerge(vis_read_hi(b02), vis_read_hi(b13)); \150dd3 = vis_fpmerge(vis_read_lo(b02), vis_read_lo(b13)); \151}152153/***************************************************************/154155void ADD_SUFF(ThreeByteBgrToIntRgbConvert)(BLIT_PARAMS)156{157mlib_s32 dstScan = pDstInfo->scanStride;158mlib_s32 srcScan = pSrcInfo->scanStride;159mlib_d64 *sp;160mlib_d64 s_0;161mlib_d64 s0, s1, s2, s3, sd0, sd1, sd2, dd0, dd1, dd2, dd3;162mlib_s32 i, i0, j;163164if (width < 16) {165for (j = 0; j < height; j++) {166mlib_u8 *src = srcBase;167mlib_s32 *dst = dstBase;168169for (i = 0; i < width; i++) {170dst[i] = INT_RGB(src[3*i + 2], src[3*i + 1], src[3*i]);171}172173PTR_ADD(dstBase, dstScan);174PTR_ADD(srcBase, srcScan);175}176return;177}178179if (srcScan == 3*width && dstScan == 4*width) {180width *= height;181height = 1;182}183184s_0 = vis_fzero();185186for (j = 0; j < height; j++) {187mlib_u8 *src = srcBase;188mlib_f32 *dst = dstBase;189190i = i0 = 0;191192if ((mlib_s32)dst & 7) {193((mlib_s32*)dst)[i] = INT_RGB(src[3*i + 2], src[3*i + 1], src[3*i]);194i0 = 1;195}196197sp = vis_alignaddr(src, 3*i0);198s3 = *sp++;199200#pragma pipeloop(0)201for (i = i0; i <= (mlib_s32)width - 8; i += 8) {202s0 = s3;203s1 = *sp++;204s2 = *sp++;205s3 = *sp++;206sd0 = vis_faligndata(s0, s1);207sd1 = vis_faligndata(s1, s2);208sd2 = vis_faligndata(s2, s3);209210BGR_TO_ARGB211212*(mlib_d64*)(dst + i ) = dd0;213*(mlib_d64*)(dst + i + 2) = dd1;214*(mlib_d64*)(dst + i + 4) = dd2;215*(mlib_d64*)(dst + i + 6) = dd3;216}217218for (; i < width; i++) {219((mlib_s32*)dst)[i] = INT_RGB(src[3*i + 2], src[3*i + 1], src[3*i]);220}221222PTR_ADD(dstBase, dstScan);223PTR_ADD(srcBase, srcScan);224}225}226227/***************************************************************/228229void ADD_SUFF(ThreeByteBgrToIntRgbScaleConvert)(SCALE_PARAMS)230{231mlib_s32 dstScan = pDstInfo->scanStride;232mlib_s32 srcScan = pSrcInfo->scanStride;233mlib_d64 dd, maskFF;234mlib_s32 i, i0, i1, j;235236if (width < 16) {237for (j = 0; j < height; j++) {238mlib_u8 *src = srcBase;239mlib_s32 *dst = dstBase;240mlib_s32 *dst_end = dst + width;241mlib_s32 tmpsxloc = sxloc;242243PTR_ADD(src, (syloc >> shift) * srcScan);244245for (; dst < dst_end; dst++) {246i = tmpsxloc >> shift;247tmpsxloc += sxinc;248*(mlib_s32*)dst = INT_RGB(src[3*i + 2], src[3*i + 1], src[3*i]);249}250251PTR_ADD(dstBase, dstScan);252syloc += syinc;253}254return;255}256257maskFF = vis_fzero();258259vis_alignaddr(NULL, 7);260261for (j = 0; j < height; j++) {262mlib_u8 *src = srcBase;263mlib_f32 *dst = dstBase;264mlib_f32 *dst_end = dst + width;265mlib_s32 tmpsxloc = sxloc;266267PTR_ADD(src, (syloc >> shift) * srcScan);268269if ((mlib_s32)dst & 7) {270i = tmpsxloc >> shift;271tmpsxloc += sxinc;272*(mlib_s32*)dst = INT_RGB(src[3*i + 2], src[3*i + 1], src[3*i]);273dst++;274}275276#pragma pipeloop(0)277for (; dst <= dst_end - 2; dst += 2) {278i0 = tmpsxloc >> shift;279i1 = (tmpsxloc + sxinc) >> shift;280tmpsxloc += 2*sxinc;281282dd = vis_faligndata(vis_ld_u8(src + 3*i1 ), dd);283dd = vis_faligndata(vis_ld_u8(src + 3*i1 + 1), dd);284dd = vis_faligndata(vis_ld_u8(src + 3*i1 + 2), dd);285dd = vis_faligndata(maskFF, dd);286dd = vis_faligndata(vis_ld_u8(src + 3*i0 ), dd);287dd = vis_faligndata(vis_ld_u8(src + 3*i0 + 1), dd);288dd = vis_faligndata(vis_ld_u8(src + 3*i0 + 2), dd);289dd = vis_faligndata(maskFF, dd);290291*(mlib_d64*)dst = dd;292}293294for (; dst < dst_end; dst++) {295i = tmpsxloc >> shift;296tmpsxloc += sxinc;297*(mlib_s32*)dst = INT_RGB(src[3*i + 2], src[3*i + 1], src[3*i]);298}299300PTR_ADD(dstBase, dstScan);301syloc += syinc;302}303}304305/***************************************************************/306307void ADD_SUFF(ByteGrayToIntRgbConvert)(BLIT_PARAMS)308{309mlib_s32 dstScan = pDstInfo->scanStride;310mlib_s32 srcScan = pSrcInfo->scanStride;311mlib_d64 d0, d1, d2, d3;312mlib_f32 ff, aa = vis_fzero();313mlib_s32 i, j, x;314315if (width < 8) {316for (j = 0; j < height; j++) {317mlib_u8 *src = srcBase;318mlib_s32 *dst = dstBase;319320for (i = 0; i < width; i++) {321x = src[i];322dst[i] = Gray2Rgb(x);323}324325PTR_ADD(dstBase, dstScan);326PTR_ADD(srcBase, srcScan);327}328return;329}330331if (srcScan == width && dstScan == 4*width) {332width *= height;333height = 1;334}335336for (j = 0; j < height; j++) {337mlib_u8 *src = srcBase;338mlib_s32 *dst = dstBase;339mlib_s32 *dst_end;340341dst_end = dst + width;342343while (((mlib_s32)src & 3) && dst < dst_end) {344x = *src++;345*dst++ = Gray2Rgb(x);346}347348#pragma pipeloop(0)349for (; dst <= (dst_end - 4); dst += 4) {350ff = *(mlib_f32*)src;351d0 = vis_fpmerge(aa, ff);352d1 = vis_fpmerge(ff, ff);353d2 = vis_fpmerge(vis_read_hi(d0), vis_read_hi(d1));354d3 = vis_fpmerge(vis_read_lo(d0), vis_read_lo(d1));355((mlib_f32*)dst)[0] = vis_read_hi(d2);356((mlib_f32*)dst)[1] = vis_read_lo(d2);357((mlib_f32*)dst)[2] = vis_read_hi(d3);358((mlib_f32*)dst)[3] = vis_read_lo(d3);359src += 4;360}361362while (dst < dst_end) {363x = *src++;364*dst++ = Gray2Rgb(x);365}366367PTR_ADD(dstBase, dstScan);368PTR_ADD(srcBase, srcScan);369}370}371372/***************************************************************/373374void ADD_SUFF(ByteGrayToIntRgbScaleConvert)(SCALE_PARAMS)375{376mlib_s32 dstScan = pDstInfo->scanStride;377mlib_s32 srcScan = pSrcInfo->scanStride;378mlib_d64 d0, d1, d2, d3, dd;379mlib_f32 ff, aa = vis_fzero();380mlib_s32 i, j, x;381382if (width < 16) {383for (j = 0; j < height; j++) {384mlib_u8 *src = srcBase;385mlib_s32 *dst = dstBase;386mlib_s32 tmpsxloc = sxloc;387388PTR_ADD(src, (syloc >> shift) * srcScan);389390for (i = 0; i < width; i++) {391x = src[tmpsxloc >> shift];392tmpsxloc += sxinc;393dst[i] = Gray2Rgb(x);394}395396PTR_ADD(dstBase, dstScan);397syloc += syinc;398}399return;400}401402vis_alignaddr(NULL, 7);403404for (j = 0; j < height; j++) {405mlib_u8 *src = srcBase;406mlib_s32 *dst = dstBase;407mlib_s32 *dst_end;408mlib_s32 tmpsxloc = sxloc;409410PTR_ADD(src, (syloc >> shift) * srcScan);411412dst_end = dst + width;413414#pragma pipeloop(0)415for (; dst <= (dst_end - 4); dst += 4) {416LOAD_NEXT_U8(dd, src + ((tmpsxloc + 3*sxinc) >> shift));417LOAD_NEXT_U8(dd, src + ((tmpsxloc + 2*sxinc) >> shift));418LOAD_NEXT_U8(dd, src + ((tmpsxloc + sxinc) >> shift));419LOAD_NEXT_U8(dd, src + ((tmpsxloc ) >> shift));420tmpsxloc += 4*sxinc;421ff = vis_read_hi(dd);422d0 = vis_fpmerge(aa, ff);423d1 = vis_fpmerge(ff, ff);424d2 = vis_fpmerge(vis_read_hi(d0), vis_read_hi(d1));425d3 = vis_fpmerge(vis_read_lo(d0), vis_read_lo(d1));426((mlib_f32*)dst)[0] = vis_read_hi(d2);427((mlib_f32*)dst)[1] = vis_read_lo(d2);428((mlib_f32*)dst)[2] = vis_read_hi(d3);429((mlib_f32*)dst)[3] = vis_read_lo(d3);430}431432while (dst < dst_end) {433x = src[tmpsxloc >> shift];434tmpsxloc += sxinc;435*dst++ = Gray2Rgb(x);436}437438PTR_ADD(dstBase, dstScan);439syloc += syinc;440}441}442443/***************************************************************/444445void ADD_SUFF(IntArgbBmToIntRgbXparOver)(BLIT_PARAMS)446{447mlib_s32 dstScan = pDstInfo->scanStride;448mlib_s32 srcScan = pSrcInfo->scanStride;449mlib_d64 dd;450mlib_s32 i, i0, j, mask;451452if (dstScan == 4*width && srcScan == 4*width) {453width *= height;454height = 1;455}456457for (j = 0; j < height; j++) {458mlib_f32 *src = srcBase;459mlib_f32 *dst = dstBase;460461i = i0 = 0;462463if ((mlib_s32)dst & 7) {464if (*(mlib_u8*)(src + i)) {465dst[i] = src[i];466}467i0 = 1;468}469470#pragma pipeloop(0)471for (i = i0; i <= (mlib_s32)width - 2; i += 2) {472dd = vis_freg_pair(src[i], src[i + 1]);473474mask = (((-*(mlib_u8*)(src + i)) >> 31) & 2) |475(((-*(mlib_u8*)(src + i + 1)) >> 31) & 1);476vis_pst_32(dd, dst + i, mask);477}478479if (i < width) {480if (*(mlib_u8*)(src + i)) {481dst[i] = src[i];482}483}484485PTR_ADD(dstBase, dstScan);486PTR_ADD(srcBase, srcScan);487}488}489490/***************************************************************/491492void ADD_SUFF(IntArgbBmToIntRgbXparBgCopy)(BCOPY_PARAMS)493{494mlib_s32 dstScan = pDstInfo->scanStride;495mlib_s32 srcScan = pSrcInfo->scanStride;496mlib_d64 dd, d_bgpixel;497mlib_s32 i, i0, j, mask;498499if (dstScan == 4*width && srcScan == 4*width) {500width *= height;501height = 1;502}503504d_bgpixel = vis_to_double_dup(bgpixel);505506for (j = 0; j < height; j++) {507mlib_f32 *src = srcBase;508mlib_f32 *dst = dstBase;509510i = i0 = 0;511512if ((mlib_s32)dst & 7) {513if (*(mlib_u8*)(src + i)) {514dst[i] = src[i];515} else {516dst[i] = vis_read_hi(d_bgpixel);517}518i0 = 1;519}520521#pragma pipeloop(0)522for (i = i0; i <= (mlib_s32)width - 2; i += 2) {523dd = vis_freg_pair(src[i], src[i + 1]);524525mask = (((-*(mlib_u8*)(src + i)) >> 31) & 2) |526(((-*(mlib_u8*)(src + i + 1)) >> 31) & 1);527*(mlib_d64*)(dst + i) = d_bgpixel;528vis_pst_32(dd, dst + i, mask);529}530531if (i < width) {532if (*(mlib_u8*)(src + i)) {533dst[i] = src[i];534} else {535dst[i] = vis_read_hi(d_bgpixel);536}537}538539PTR_ADD(dstBase, dstScan);540PTR_ADD(srcBase, srcScan);541}542}543544/***************************************************************/545546void ADD_SUFF(IntRgbDrawGlyphListAA)(GLYPH_LIST_PARAMS)547{548mlib_s32 glyphCounter;549mlib_s32 scan = pRasInfo->scanStride;550mlib_u8 *dstBase;551mlib_s32 j;552mlib_d64 dmix0, dmix1, dd, d0, d1, e0, e1, fgpixel_d;553mlib_d64 done, done16, d_half, maskRGB, dzero;554mlib_s32 pix, mask, mask_z;555mlib_f32 srcG_f;556557done = vis_to_double_dup(0x7fff7fff);558done16 = vis_to_double_dup(0x7fff);559d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6));560561fgpixel_d = vis_to_double_dup(fgpixel);562srcG_f = vis_to_float(argbcolor);563maskRGB = vis_to_double_dup(0xffffff);564dzero = vis_fzero();565566vis_write_gsr(0 << 3);567568for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {569const jubyte *pixels;570unsigned int rowBytes;571int left, top;572int width, height;573int right, bottom;574575pixels = (const jubyte *) glyphs[glyphCounter].pixels;576577if (!pixels) continue;578579left = glyphs[glyphCounter].x;580top = glyphs[glyphCounter].y;581width = glyphs[glyphCounter].width;582height = glyphs[glyphCounter].height;583rowBytes = width;584right = left + width;585bottom = top + height;586if (left < clipLeft) {587pixels += clipLeft - left;588left = clipLeft;589}590if (top < clipTop) {591pixels += (clipTop - top) * rowBytes;592top = clipTop;593}594if (right > clipRight) {595right = clipRight;596}597if (bottom > clipBottom) {598bottom = clipBottom;599}600if (right <= left || bottom <= top) {601continue;602}603width = right - left;604height = bottom - top;605606dstBase = pRasInfo->rasBase;607PTR_ADD(dstBase, top*scan + 4*left);608609for (j = 0; j < height; j++) {610mlib_u8 *src = (void*)pixels;611mlib_s32 *dst, *dst_end;612613dst = (void*)dstBase;614dst_end = dst + width;615616if ((mlib_s32)dst & 7) {617pix = *src++;618if (pix) {619dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);620dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);621*(mlib_f32*)dst = vis_fands(vis_fpack16(dd),622vis_read_hi(maskRGB));623if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);624}625dst++;626}627628#pragma pipeloop(0)629for (; dst <= (dst_end - 2); dst += 2) {630dmix0 = vis_freg_pair(((mlib_f32 *)vis_mul8s_tbl)[src[0]],631((mlib_f32 *)vis_mul8s_tbl)[src[1]]);632mask = vis_fcmplt32(dmix0, done16);633mask_z = vis_fcmpne32(dmix0, dzero);634dmix1 = vis_fpsub16(done, dmix0);635src += 2;636637dd = *(mlib_d64*)dst;638d0 = vis_fmul8x16al(srcG_f, vis_read_hi(dmix0));639d1 = vis_fmul8x16al(srcG_f, vis_read_lo(dmix0));640e0 = vis_fmul8x16al(vis_read_hi(dd), vis_read_hi(dmix1));641e1 = vis_fmul8x16al(vis_read_lo(dd), vis_read_lo(dmix1));642d0 = vis_fpadd16(vis_fpadd16(d0, d_half), e0);643d1 = vis_fpadd16(vis_fpadd16(d1, d_half), e1);644dd = vis_fpack16_pair(d0, d1);645dd = vis_fand(dd, maskRGB);646647vis_pst_32(fgpixel_d, dst, mask_z);648vis_pst_32(dd, dst, mask & mask_z);649}650651while (dst < dst_end) {652pix = *src++;653if (pix) {654dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);655dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);656*(mlib_f32*)dst = vis_fands(vis_fpack16(dd),657vis_read_hi(maskRGB));658if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);659}660dst++;661}662663PTR_ADD(dstBase, scan);664pixels += rowBytes;665}666}667}668669/***************************************************************/670671#endif /* JAVA2D_NO_MLIB */672673674