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 <mlib_image.h>
0N/A
0N/A#include "java2d_Mlib.h"
0N/A#include "AlphaMacros.h"
0N/A
0N/A/***************************************************************/
0N/A
0N/Aextern const mlib_u32 vis_mul8s_tbl[];
0N/Aextern const mlib_u64 vis_div8_tbl[];
0N/Aextern const mlib_u64 vis_div8pre_tbl[];
0N/A
0N/A/***************************************************************/
0N/A
0N/Avoid IntArgbToIntAbgrConvert_line(mlib_s32 *srcBase,
0N/A mlib_s32 *dstBase,
0N/A mlib_s32 width);
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define BUFF_SIZE 256
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define COPY_NA(src, dst, _size) { \
0N/A mlib_s32 cci, size = _size; \
0N/A if (size <= 16) { \
0N/A for (cci = 0; cci < size; cci++) { \
0N/A ((mlib_u8*)dst)[cci] = ((mlib_u8*)src)[cci]; \
0N/A } \
0N/A } else { \
0N/A mlib_ImageCopy_na(src, dst, size); \
0N/A } \
0N/A}
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define MUL8_INT(x, y) mul8_tbl[256*(y) + (x)]
0N/A
0N/A#define FMUL_16x16(x, y) \
0N/A vis_fpadd16(vis_fmul8sux16(x, y), vis_fmul8ulx16(x, y))
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define MUL8_VIS(rr, alp) \
0N/A vis_fmul8x16al(rr, ((mlib_f32 *)vis_mul8s_tbl)[alp])
0N/A
0N/A#define DIV_ALPHA(rr, alp) { \
0N/A mlib_d64 d_div = ((mlib_d64*)vis_div8_tbl)[alp]; \
0N/A rr = FMUL_16x16(rr, d_div); \
0N/A}
0N/A
0N/A#define DIV_ALPHA_RGB(rr, alp) \
0N/A DIV_ALPHA(rr, alp)
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA) \
0N/A{ \
0N/A mlib_d64 t0, t1; \
0N/A \
0N/A t0 = MUL8_VIS(srcARGB, srcA); \
0N/A t1 = MUL8_VIS(dstARGB, dstA); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A \
0N/A dstA += srcA; \
0N/A DIV_ALPHA(rr, dstA); \
0N/A}
0N/A
0N/A#define BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA) \
0N/A BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA)
0N/A
0N/A/***************************************************************/
0N/A
0N/A#if 0
0N/Aextern const mlib_u16 vis_div8_16_tbl[];
0N/A
0N/A#undef BLEND_VIS
0N/A#define BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA) \
0N/A{ \
0N/A mlib_d64 done = vis_to_double_dup(0x00FFFFFF); \
0N/A mlib_d64 t0, t1; \
0N/A mlib_f32 s0, s1; \
0N/A mlib_s32 resA; \
0N/A \
0N/A resA = dstA + srcA; \
0N/A t0 = vis_ld_u16((mlib_u16*)vis_div8_16_tbl + 256*srcA + resA); \
0N/A t1 = vis_ld_u16((mlib_u16*)vis_div8_16_tbl + 256*dstA + resA); \
0N/A dstA = resA; \
0N/A \
0N/A t0 = vis_fmul8x16al(srcARGB, vis_read_lo(t0)); \
0N/A t1 = vis_fmul8x16al(dstARGB, vis_read_lo(t1)); \
0N/A rr = vis_fpadd16(t0, t1); \
0N/A}
0N/A
0N/A#define BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA) \
0N/A{ \
0N/A mlib_d64 maskRGB = vis_to_double_dup(0x00FFFFFF); \
0N/A \
0N/A BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA) \
0N/A \
0N/A rr = vis_fand(rr, maskRGB); \
0N/A}
0N/A
0N/A#endif
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define F32_FROM_U8x4(x0, x1, x2, x3) \
0N/A vis_to_float(((x0) << 24) | ((x1) << 16) | ((x2)<< 8) | ((x3)))
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define D64_FROM_U8x8(dd, val) \
0N/A val &= 0xFF; \
0N/A val |= (val << 8); \
0N/A val |= (val << 16); \
0N/A dd = vis_to_double_dup(val)
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define D64_FROM_U16x4(dd, val) \
0N/A val &= 0xFFFF; \
0N/A val |= (val << 16); \
0N/A dd = vis_to_double_dup(val)
0N/A
0N/A/***************************************************************/
0N/A
0N/A#define D64_FROM_F32x2(ff) \
0N/A vis_freg_pair(ff, ff)
0N/A
0N/A/***************************************************************/
0N/A
0N/A#if VIS >= 0x200
0N/A
0N/A#define ARGB2ABGR_FL(src) \
0N/A src = vis_read_hi(vis_bshuffle(vis_freg_pair(src, vis_fzeros()), 0));
0N/A
0N/A#define ARGB2ABGR_FL2(dst, src0, src1) \
0N/A dst = vis_freg_pair(src0, src1); \
0N/A dst = vis_bshuffle(dst, 0)
0N/A
0N/A#define ARGB2ABGR_DB(src) \
0N/A src = vis_bshuffle(src, 0);
0N/A
0N/A#else
0N/A
0N/A#define ARGB2ABGR_FL(src) { \
0N/A mlib_d64 t0, t1, t2, t3; \
0N/A t0 = vis_fpmerge(src, src); \
0N/A t1 = vis_fpmerge(vis_read_lo(t0), vis_read_hi(t0)); \
0N/A t2 = vis_fpmerge(vis_read_hi(t0), vis_read_lo(t0)); \
0N/A t3 = vis_fpmerge(vis_read_hi(t2), vis_read_lo(t1)); \
0N/A src = vis_read_hi(t3); \
0N/A}
0N/A
0N/A#define ARGB2ABGR_FL2(dst, src0, src1) { \
0N/A mlib_d64 t0, t1, t2; \
0N/A t0 = vis_fpmerge(src0, src1); \
0N/A t1 = vis_fpmerge(vis_read_lo(t0), vis_read_hi(t0)); \
0N/A t2 = vis_fpmerge(vis_read_hi(t0), vis_read_lo(t0)); \
0N/A dst = vis_fpmerge(vis_read_hi(t2), vis_read_lo(t1)); \
0N/A}
0N/A
0N/A#define ARGB2ABGR_DB(src) \
0N/A ARGB2ABGR_FL2(src, vis_read_hi(src), vis_read_lo(src))
0N/A
0N/A#endif
0N/A
0N/A/***************************************************************/
0N/A
0N/A#endif /* JAVA2D_NO_MLIB */