0N/A/*
2362N/A * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A#if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF)
0N/A
0N/A#include <vis_proto.h>
0N/A#include "vis_AlphaMacros.h"
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define STORE_INT \
0N/A *dst = fgpixel
0N/A
0N/A#define STORE_D64(TSIZE, dst, mask) \
0N/A vis_pst_##TSIZE(fgpixel_d, dst, mask)
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define INIT_FG
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define DEF_GLYPH(TSIZE) \
0N/A const jubyte *pixels; \
0N/A unsigned int rowBytes; \
0N/A int left, top; \
0N/A int width, height; \
0N/A int right, bottom; \
0N/A \
0N/A pixels = (const jubyte *) glyphs[glyphCounter].pixels; \
0N/A \
0N/A if (!pixels) continue; \
0N/A \
0N/A left = glyphs[glyphCounter].x; \
0N/A top = glyphs[glyphCounter].y; \
0N/A width = glyphs[glyphCounter].width; \
0N/A height = glyphs[glyphCounter].height; \
0N/A rowBytes = width; \
0N/A right = left + width; \
0N/A bottom = top + height; \
0N/A if (left < clipLeft) { \
0N/A pixels += clipLeft - left; \
0N/A left = clipLeft; \
0N/A } \
0N/A if (top < clipTop) { \
0N/A pixels += (clipTop - top) * rowBytes; \
0N/A top = clipTop; \
0N/A } \
0N/A if (right > clipRight) { \
0N/A right = clipRight; \
0N/A } \
0N/A if (bottom > clipBottom) { \
0N/A bottom = clipBottom; \
0N/A } \
0N/A if (right <= left || bottom <= top) { \
0N/A continue; \
0N/A } \
0N/A width = right - left; \
0N/A height = bottom - top; \
0N/A \
0N/A dstBase = pRasInfo->rasBase; \
0N/A PTR_ADD(dstBase, top*scan + TSIZE*left)
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(AnyByteDrawGlyphList)(GLYPH_LIST_PARAMS)
0N/A{
0N/A mlib_s32 glyphCounter;
0N/A mlib_s32 scan = pRasInfo->scanStride;
0N/A mlib_u8 *dstBase;
0N/A mlib_s32 j;
0N/A mlib_d64 fgpixel_d;
0N/A mlib_d64 dzero;
0N/A mlib_s32 pix, mask0, mask1, mask_h, mask_l, off;
0N/A mlib_f32 fzero;
0N/A
0N/A INIT_FG
0N/A
0N/A fzero = vis_fzeros();
0N/A dzero = vis_fzero();
0N/A D64_FROM_U8x8(fgpixel_d, fgpixel);
0N/A
0N/A for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
0N/A DEF_GLYPH(1);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_u8 *src = (void*)pixels;
0N/A mlib_u8 *dst, *dst_end;
0N/A mlib_d64 ss, s0, s1;
0N/A
0N/A dst = (void*)dstBase;
0N/A dst_end = dst + width;
0N/A
0N/A while (((mlib_s32)dst & 7) && (dst < dst_end)) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A off = (mlib_s32)src & 7;
0N/A ss = *(mlib_d64*)(src - off);
0N/A mask_h = vis_fcmpne16(vis_fpmerge(vis_read_hi(ss), fzero), dzero);
0N/A mask_l = vis_fcmpne16(vis_fpmerge(vis_read_lo(ss), fzero), dzero);
0N/A mask1 = (mask_h << 4) | mask_l;
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; dst <= (dst_end - 8); dst += 8) {
0N/A mask0 = mask1;
0N/A src += 8;
0N/A ss = *(mlib_d64*)(src - off);
0N/A s0 = vis_fpmerge(vis_read_hi(ss), fzero);
0N/A s1 = vis_fpmerge(vis_read_lo(ss), fzero);
0N/A mask_h = vis_fcmpne16(s0, dzero);
0N/A mask_l = vis_fcmpne16(s1, dzero);
0N/A mask1 = (mask_h << 4) | mask_l;
0N/A STORE_D64(8, dst, (mask0 << off) | (mask1 >> (8 - off)));
0N/A }
0N/A
0N/A while (dst < dst_end) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A PTR_ADD(dstBase, scan);
0N/A pixels += rowBytes;
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(AnyShortDrawGlyphList)(GLYPH_LIST_PARAMS)
0N/A{
0N/A mlib_s32 glyphCounter;
0N/A mlib_s32 scan = pRasInfo->scanStride;
0N/A mlib_u8 *dstBase;
0N/A mlib_s32 j;
0N/A mlib_d64 fgpixel_d;
0N/A mlib_d64 dzero;
0N/A mlib_s32 pix, mask0, mask1, off;
0N/A mlib_f32 fzero;
0N/A
0N/A INIT_FG
0N/A
0N/A fzero = vis_fzeros();
0N/A dzero = vis_fzero();
0N/A D64_FROM_U16x4(fgpixel_d, fgpixel);
0N/A
0N/A for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
0N/A DEF_GLYPH(2);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_u8 *src = (void*)pixels;
0N/A mlib_u16 *dst, *dst_end;
0N/A mlib_f32 ss;
0N/A
0N/A dst = (void*)dstBase;
0N/A dst_end = dst + width;
0N/A
0N/A while (((mlib_s32)dst & 7) && (dst < dst_end)) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A off = (mlib_s32)src & 3;
0N/A ss = *(mlib_f32*)(src - off);
0N/A mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; dst <= (dst_end - 4); dst += 4) {
0N/A mask0 = mask1;
0N/A src += 4;
0N/A ss = *(mlib_f32*)(src - off);
0N/A mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
0N/A STORE_D64(16, dst, (mask0 << off) | (mask1 >> (4 - off)));
0N/A }
0N/A
0N/A while (dst < dst_end) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A PTR_ADD(dstBase, scan);
0N/A pixels += rowBytes;
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(AnyIntDrawGlyphList)(GLYPH_LIST_PARAMS)
0N/A{
0N/A mlib_s32 glyphCounter;
0N/A mlib_s32 scan = pRasInfo->scanStride;
0N/A mlib_u8 *dstBase;
0N/A mlib_s32 j;
0N/A mlib_d64 fgpixel_d;
0N/A mlib_d64 dzero;
0N/A mlib_s32 pix, mask0, mask1, mask, off;
0N/A mlib_f32 fzero;
0N/A
0N/A INIT_FG
0N/A
0N/A fzero = vis_fzeros();
0N/A dzero = vis_fzero();
0N/A fgpixel_d = vis_to_double_dup(fgpixel);
0N/A
0N/A for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
0N/A DEF_GLYPH(4);
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_u8 *src = (void*)pixels;
0N/A mlib_u32 *dst, *dst_end;
0N/A mlib_f32 ss;
0N/A
0N/A dst = (void*)dstBase;
0N/A dst_end = dst + width;
0N/A
0N/A while (((mlib_s32)dst & 7) && (dst < dst_end)) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A off = (mlib_s32)src & 3;
0N/A ss = *(mlib_f32*)(src - off);
0N/A mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; dst <= (dst_end - 4); dst += 4) {
0N/A mask0 = mask1;
0N/A src += 4;
0N/A ss = *(mlib_f32*)(src - off);
0N/A mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
0N/A mask = (mask0 << off) | (mask1 >> (4 - off));
0N/A STORE_D64(32, dst, mask >> 2);
0N/A STORE_D64(32, dst + 2, mask);
0N/A }
0N/A
0N/A while (dst < dst_end) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A PTR_ADD(dstBase, scan);
0N/A pixels += rowBytes;
0N/A }
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid ADD_SUFF(Any4ByteDrawGlyphList)(GLYPH_LIST_PARAMS)
0N/A{
0N/A mlib_d64 buff[BUFF_SIZE/2];
0N/A void *pbuff = buff;
0N/A mlib_s32 glyphCounter;
0N/A mlib_s32 scan = pRasInfo->scanStride;
0N/A mlib_u8 *dstBase;
0N/A mlib_s32 j;
0N/A mlib_d64 fgpixel_d;
0N/A mlib_d64 dzero;
0N/A mlib_s32 pix, mask0, mask1, mask, off;
0N/A mlib_f32 fzero, fgpixel_f;
0N/A mlib_s32 max_width = BUFF_SIZE;
0N/A
0N/A INIT_FG
0N/A
0N/A fzero = vis_fzeros();
0N/A dzero = vis_fzero();
0N/A fgpixel_f = vis_ldfa_ASI_PL(&fgpixel);
0N/A fgpixel_d = vis_freg_pair(fgpixel_f, fgpixel_f);
0N/A fgpixel = *(mlib_u32*)&fgpixel_f;
0N/A
0N/A for (glyphCounter = 0; glyphCounter < totalGlyphs; glyphCounter++) {
0N/A DEF_GLYPH(4);
0N/A
0N/A if (((mlib_s32)dstBase | scan) & 3) {
0N/A if (width > max_width) {
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A pbuff = mlib_malloc(width*sizeof(mlib_s32));
0N/A if (pbuff == NULL) return;
0N/A max_width = width;
0N/A }
0N/A }
0N/A
0N/A for (j = 0; j < height; j++) {
0N/A mlib_u8 *src = (void*)pixels;
0N/A mlib_u32 *dst, *dst_end;
0N/A mlib_f32 ss;
0N/A
0N/A if ((mlib_s32)dstBase & 3) {
0N/A COPY_NA(dstBase, pbuff, width*sizeof(mlib_s32));
0N/A dst = pbuff;
0N/A } else {
0N/A dst = (void*)dstBase;
0N/A }
0N/A dst_end = dst + width;
0N/A
0N/A while (((mlib_s32)dst & 7) && (dst < dst_end)) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A off = (mlib_s32)src & 3;
0N/A ss = *(mlib_f32*)(src - off);
0N/A mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; dst <= (dst_end - 4); dst += 4) {
0N/A mask0 = mask1;
0N/A src += 4;
0N/A ss = *(mlib_f32*)(src - off);
0N/A mask1 = vis_fcmpne16(vis_fpmerge(ss, fzero), dzero);
0N/A mask = (mask0 << off) | (mask1 >> (4 - off));
0N/A STORE_D64(32, dst, mask >> 2);
0N/A STORE_D64(32, dst + 2, mask);
0N/A }
0N/A
0N/A while (dst < dst_end) {
0N/A pix = *src++;
0N/A if (pix) STORE_INT;
0N/A dst++;
0N/A }
0N/A
0N/A if ((mlib_s32)dstBase & 3) {
0N/A COPY_NA(pbuff, dstBase, width*sizeof(mlib_s32));
0N/A }
0N/A
0N/A PTR_ADD(dstBase, scan);
0N/A pixels += rowBytes;
0N/A }
0N/A }
0N/A
0N/A if (pbuff != buff) {
0N/A mlib_free(pbuff);
0N/A }
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#endif /* JAVA2D_NO_MLIB */