Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/java2d/loops/vis_IntArgb.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/***************************************************************/3031void ADD_SUFF(ByteIndexedToIntArgbConvert)(BLIT_PARAMS)32{33jint *pixLut = pSrcInfo->lutBase;34mlib_s32 dstScan = pDstInfo->scanStride;35mlib_s32 srcScan = pSrcInfo->scanStride;36mlib_s32 i, i0, j;3738if (srcScan == width && dstScan == 4*width) {39width *= height;40height = 1;41}4243for (j = 0; j < height; j++) {44mlib_u8 *src = srcBase;45mlib_s32 *dst = dstBase;4647i = i0 = 0;4849if ((mlib_s32)dst & 7) {50dst[i] = pixLut[src[i]];51i0 = 1;52}5354#pragma pipeloop(0)55for (i = i0; i <= (mlib_s32)width - 2; i += 2) {56*(mlib_d64*)(dst + i) = LOAD_2F32(pixLut, src[i], src[i + 1]);57}5859for (; i < width; i++) {60dst[i] = pixLut[src[i]];61}6263PTR_ADD(dstBase, dstScan);64PTR_ADD(srcBase, srcScan);65}66}6768/***************************************************************/6970void ADD_SUFF(Index12GrayToIntArgbConvert)(BLIT_PARAMS)71{72jint *pixLut = pSrcInfo->lutBase;73mlib_s32 dstScan = pDstInfo->scanStride;74mlib_s32 srcScan = pSrcInfo->scanStride;75mlib_s32 i, i0, j;7677if (srcScan == width && dstScan == 4*width) {78width *= height;79height = 1;80}8182for (j = 0; j < height; j++) {83mlib_u16 *src = srcBase;84mlib_s32 *dst = dstBase;8586i = i0 = 0;8788if ((mlib_s32)dst & 7) {89dst[i] = pixLut[src[i]];90i0 = 1;91}9293#pragma pipeloop(0)94for (i = i0; i <= (mlib_s32)width - 2; i += 2) {95*(mlib_d64*)(dst + i) = LOAD_2F32(pixLut, src[i], src[i + 1]);96}9798for (; i < width; i++) {99dst[i] = pixLut[src[i]];100}101102PTR_ADD(dstBase, dstScan);103PTR_ADD(srcBase, srcScan);104}105}106107/***************************************************************/108109void ADD_SUFF(ByteIndexedToIntArgbScaleConvert)(SCALE_PARAMS)110{111jint *pixLut = pSrcInfo->lutBase;112mlib_s32 dstScan = pDstInfo->scanStride;113mlib_s32 srcScan = pSrcInfo->scanStride;114mlib_s32 j;115116for (j = 0; j < height; j++) {117mlib_u8 *src = srcBase;118mlib_s32 *dst = dstBase;119mlib_s32 *dst_end = dst + width;120mlib_s32 tmpsxloc = sxloc;121122PTR_ADD(src, (syloc >> shift) * srcScan);123124if ((mlib_s32)dst & 7) {125*dst++ = pixLut[src[tmpsxloc >> shift]];126tmpsxloc += sxinc;127}128129#pragma pipeloop(0)130for (; dst <= dst_end - 2; dst += 2) {131*(mlib_d64*)dst = LOAD_2F32(pixLut,132src[tmpsxloc >> shift],133src[(tmpsxloc + sxinc) >> shift]);134tmpsxloc += 2*sxinc;135}136137for (; dst < dst_end; dst++) {138*dst = pixLut[src[tmpsxloc >> shift]];139tmpsxloc += sxinc;140}141142PTR_ADD(dstBase, dstScan);143syloc += syinc;144}145}146147/***************************************************************/148149void ADD_SUFF(ByteIndexedBmToIntArgbXparOver)(BLIT_PARAMS)150{151jint *pixLut = pSrcInfo->lutBase;152mlib_s32 dstScan = pDstInfo->scanStride;153mlib_s32 srcScan = pSrcInfo->scanStride;154mlib_d64 dd, dzero;155mlib_s32 i, i0, j, x, mask;156157if (srcScan == width && dstScan == 4*width) {158width *= height;159height = 1;160}161162dzero = vis_fzero();163164for (j = 0; j < height; j++) {165mlib_u8 *src = srcBase;166mlib_s32 *dst = dstBase;167168i = i0 = 0;169170if ((mlib_s32)dst & 7) {171x = pixLut[src[i]];172if (x < 0) {173dst[i] = x;174}175i0 = 1;176}177178#pragma pipeloop(0)179for (i = i0; i <= (mlib_s32)width - 2; i += 2) {180dd = LOAD_2F32(pixLut, src[i], src[i + 1]);181mask = vis_fcmplt32(dd, dzero);182vis_pst_32(dd, dst + i, mask);183}184185for (; i < width; i++) {186x = pixLut[src[i]];187if (x < 0) {188dst[i] = x;189}190}191192PTR_ADD(dstBase, dstScan);193PTR_ADD(srcBase, srcScan);194}195}196197/***************************************************************/198199void ADD_SUFF(ByteIndexedBmToIntArgbScaleXparOver)(SCALE_PARAMS)200{201jint *pixLut = pSrcInfo->lutBase;202mlib_s32 dstScan = pDstInfo->scanStride;203mlib_s32 srcScan = pSrcInfo->scanStride;204mlib_d64 dd, dzero;205mlib_s32 j, x, mask;206207dzero = vis_fzero();208209for (j = 0; j < height; j++) {210mlib_u8 *src = srcBase;211mlib_s32 *dst = dstBase;212mlib_s32 *dst_end = dst + width;213mlib_s32 tmpsxloc = sxloc;214215PTR_ADD(src, (syloc >> shift) * srcScan);216217if ((mlib_s32)dst & 7) {218x = pixLut[src[tmpsxloc >> shift]];219tmpsxloc += sxinc;220if (x < 0) {221*dst = x;222}223dst++;224}225226#pragma pipeloop(0)227for (; dst <= dst_end - 2; dst += 2) {228dd = LOAD_2F32(pixLut, src[tmpsxloc >> shift],229src[(tmpsxloc + sxinc) >> shift]);230tmpsxloc += 2*sxinc;231mask = vis_fcmplt32(dd, dzero);232vis_pst_32(dd, dst, mask);233}234235for (; dst < dst_end; dst++) {236x = pixLut[src[tmpsxloc >> shift]];237tmpsxloc += sxinc;238if (x < 0) {239*dst = x;240}241}242243PTR_ADD(dstBase, dstScan);244syloc += syinc;245}246}247248/***************************************************************/249250void ADD_SUFF(IntArgbBmToIntArgbScaleXparOver)(SCALE_PARAMS)251{252mlib_s32 dstScan = pDstInfo->scanStride;253mlib_s32 srcScan = pSrcInfo->scanStride;254mlib_d64 dd, maskAA;255mlib_s32 j, x, mask;256257maskAA = vis_to_double_dup(0xff000000);258259for (j = 0; j < height; j++) {260mlib_s32 *src = srcBase;261mlib_s32 *dst = dstBase;262mlib_s32 *dst_end = dst + width;263mlib_s32 tmpsxloc = sxloc;264265PTR_ADD(src, (syloc >> shift) * srcScan);266267if ((mlib_s32)dst & 7) {268x = src[tmpsxloc >> shift];269tmpsxloc += sxinc;270if (x & 0xff000000) {271*dst = x | 0xff000000;272}273dst++;274}275276#pragma pipeloop(0)277for (; dst <= dst_end - 2; dst += 2) {278mlib_f32 *pp0 = (mlib_f32*)src + (tmpsxloc >> shift);279mlib_f32 *pp1 = (mlib_f32*)src + ((tmpsxloc + sxinc) >> shift);280tmpsxloc += 2*sxinc;281dd = vis_freg_pair(*pp0, *pp1);282mask = (((-*(mlib_u8*)pp0) >> 31) & 2) |283((mlib_u32)(-*(mlib_u8*)pp1) >> 31);284dd = vis_for(dd, maskAA);285vis_pst_32(dd, dst, mask);286}287288for (; dst < dst_end; dst++) {289x = src[tmpsxloc >> shift];290tmpsxloc += sxinc;291if (x & 0xff000000) {292*dst = x | 0xff000000;293}294}295296PTR_ADD(dstBase, dstScan);297syloc += syinc;298}299}300301/***************************************************************/302303void ADD_SUFF(ByteIndexedBmToIntArgbXparBgCopy)(BCOPY_PARAMS)304{305jint *pixLut = pSrcInfo->lutBase;306mlib_s32 dstScan = pDstInfo->scanStride;307mlib_s32 srcScan = pSrcInfo->scanStride;308mlib_d64 dd, dzero, d_bgpixel;309mlib_s32 j, x, mask;310311if (srcScan == width && dstScan == 4*width) {312width *= height;313height = 1;314}315316dzero = vis_fzero();317d_bgpixel = vis_to_double_dup(bgpixel);318319for (j = 0; j < height; j++) {320mlib_u8 *src = srcBase;321mlib_s32 *dst = dstBase;322mlib_s32 *dst_end;323324dst_end = dst + width;325326if ((mlib_s32)dst & 7) {327x = pixLut[*src++];328if (x < 0) {329*dst = x;330} else {331*dst = bgpixel;332}333dst++;334}335336#pragma pipeloop(0)337for (; dst <= (dst_end - 2); dst += 2) {338dd = LOAD_2F32(pixLut, src[0], src[1]);339mask = vis_fcmplt32(dd, dzero);340*(mlib_d64*)dst = d_bgpixel;341vis_pst_32(dd, dst, mask);342src += 2;343}344345while (dst < dst_end) {346x = pixLut[*src++];347if (x < 0) {348*dst = x;349} else {350*dst = bgpixel;351}352dst++;353}354355PTR_ADD(dstBase, dstScan);356PTR_ADD(srcBase, srcScan);357}358}359360/***************************************************************/361362void ADD_SUFF(IntArgbDrawGlyphListAA)(GLYPH_LIST_PARAMS)363{364mlib_s32 glyphCounter;365mlib_s32 scan = pRasInfo->scanStride;366mlib_u8 *dstBase;367mlib_s32 j;368mlib_d64 dmix0, dmix1, dd, d0, d1, e0, e1, fgpixel_d;369mlib_d64 done, done16, d_half;370mlib_s32 pix, mask;371mlib_f32 srcG_f;372373done = vis_to_double_dup(0x7fff7fff);374done16 = vis_to_double_dup(0x7fff);375d_half = vis_to_double_dup((1 << (16 + 6)) | (1 << 6));376377fgpixel_d = vis_to_double_dup(fgpixel);378srcG_f = vis_to_float(argbcolor);379380vis_write_gsr(0 << 3);381382for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {383const jubyte *pixels;384unsigned int rowBytes;385int left, top;386int width, height;387int right, bottom;388389pixels = (const jubyte *) glyphs[glyphCounter].pixels;390391if (!pixels) continue;392393left = glyphs[glyphCounter].x;394top = glyphs[glyphCounter].y;395width = glyphs[glyphCounter].width;396height = glyphs[glyphCounter].height;397rowBytes = width;398right = left + width;399bottom = top + height;400if (left < clipLeft) {401pixels += clipLeft - left;402left = clipLeft;403}404if (top < clipTop) {405pixels += (clipTop - top) * rowBytes;406top = clipTop;407}408if (right > clipRight) {409right = clipRight;410}411if (bottom > clipBottom) {412bottom = clipBottom;413}414if (right <= left || bottom <= top) {415continue;416}417width = right - left;418height = bottom - top;419420dstBase = pRasInfo->rasBase;421PTR_ADD(dstBase, top*scan + 4*left);422423for (j = 0; j < height; j++) {424mlib_u8 *src = (void*)pixels;425mlib_s32 *dst, *dst_end;426427dst = (void*)dstBase;428dst_end = dst + width;429430/* Clearing the Graphics Status Register is necessary otherwise431* left over scale settings affect the pack instructions.432*/433vis_write_gsr(0 << 3);434435if ((mlib_s32)dst & 7) {436pix = *src++;437dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);438dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);439*(mlib_f32*)dst = vis_fpack16(dd);440if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);441dst++;442}443444#pragma pipeloop(0)445for (; dst <= (dst_end - 2); dst += 2) {446dmix0 = vis_freg_pair(((mlib_f32 *)vis_mul8s_tbl)[src[0]],447((mlib_f32 *)vis_mul8s_tbl)[src[1]]);448mask = vis_fcmplt32(dmix0, done16);449dmix1 = vis_fpsub16(done, dmix0);450src += 2;451452dd = *(mlib_d64*)dst;453d0 = vis_fmul8x16al(srcG_f, vis_read_hi(dmix0));454d1 = vis_fmul8x16al(srcG_f, vis_read_lo(dmix0));455e0 = vis_fmul8x16al(vis_read_hi(dd), vis_read_hi(dmix1));456e1 = vis_fmul8x16al(vis_read_lo(dd), vis_read_lo(dmix1));457d0 = vis_fpadd16(vis_fpadd16(d0, d_half), e0);458d1 = vis_fpadd16(vis_fpadd16(d1, d_half), e1);459dd = vis_fpack16_pair(d0, d1);460461*(mlib_d64*)dst = fgpixel_d;462vis_pst_32(dd, dst, mask);463}464465while (dst < dst_end) {466pix = *src++;467dd = vis_fpadd16(MUL8_VIS(srcG_f, pix), d_half);468dd = vis_fpadd16(MUL8_VIS(*(mlib_f32*)dst, 255 - pix), dd);469*(mlib_f32*)dst = vis_fpack16(dd);470if (pix == 255) *(mlib_f32*)dst = vis_read_hi(fgpixel_d);471dst++;472}473474ADD_SUFF(IntArgbPreToIntArgbConvert)(dstBase, dstBase, width, 1,475pRasInfo, pRasInfo,476pPrim, pCompInfo);477PTR_ADD(dstBase, scan);478pixels += rowBytes;479}480}481}482483/***************************************************************/484485#endif /* JAVA2D_NO_MLIB */486487488