1 /* 2 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #if !defined(JAVA2D_NO_MLIB) || defined(MLIB_ADD_SUFF) 27 28 #include <vis_proto.h> 29 #include <mlib_image.h> 30 31 #include "java2d_Mlib.h" 32 #include "AlphaMacros.h" 33 34 /***************************************************************/ 35 36 extern const mlib_u32 vis_mul8s_tbl[]; 37 extern const mlib_u64 vis_div8_tbl[]; 38 extern const mlib_u64 vis_div8pre_tbl[]; 39 40 /***************************************************************/ 41 42 void IntArgbToIntAbgrConvert_line(mlib_s32 *srcBase, 43 mlib_s32 *dstBase, 44 mlib_s32 width); 45 46 /***************************************************************/ 47 48 #define BUFF_SIZE 256 49 50 /***************************************************************/ 51 52 #define COPY_NA(src, dst, _size) { \ 53 mlib_s32 cci, size = _size; \ 54 if (size <= 16) { \ 55 for (cci = 0; cci < size; cci++) { \ 56 ((mlib_u8*)dst)[cci] = ((mlib_u8*)src)[cci]; \ 57 } \ 58 } else { \ 59 mlib_ImageCopy_na(src, dst, size); \ 60 } \ 61 } 62 63 /***************************************************************/ 64 65 #define MUL8_INT(x, y) mul8_tbl[256*(y) + (x)] 66 67 #define FMUL_16x16(x, y) \ 68 vis_fpadd16(vis_fmul8sux16(x, y), vis_fmul8ulx16(x, y)) 69 70 /***************************************************************/ 71 72 #define MUL8_VIS(rr, alp) \ 73 vis_fmul8x16al(rr, ((mlib_f32 *)vis_mul8s_tbl)[alp]) 74 75 #define DIV_ALPHA(rr, alp) { \ 76 mlib_d64 d_div = ((mlib_d64*)vis_div8_tbl)[alp]; \ 77 rr = FMUL_16x16(rr, d_div); \ 78 } 79 80 #define DIV_ALPHA_RGB(rr, alp) \ 81 DIV_ALPHA(rr, alp) 82 83 /***************************************************************/ 84 85 #define BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA) \ 86 { \ 87 mlib_d64 t0, t1; \ 88 \ 89 t0 = MUL8_VIS(srcARGB, srcA); \ 90 t1 = MUL8_VIS(dstARGB, dstA); \ 91 rr = vis_fpadd16(t0, t1); \ 92 \ 93 dstA += srcA; \ 94 DIV_ALPHA(rr, dstA); \ 95 } 96 97 #define BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA) \ 98 BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA) 99 100 /***************************************************************/ 101 102 #if 0 103 extern const mlib_u16 vis_div8_16_tbl[]; 104 105 #undef BLEND_VIS 106 #define BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA) \ 107 { \ 108 mlib_d64 done = vis_to_double_dup(0x00FFFFFF); \ 109 mlib_d64 t0, t1; \ 110 mlib_f32 s0, s1; \ 111 mlib_s32 resA; \ 112 \ 113 resA = dstA + srcA; \ 114 t0 = vis_ld_u16((mlib_u16*)vis_div8_16_tbl + 256*srcA + resA); \ 115 t1 = vis_ld_u16((mlib_u16*)vis_div8_16_tbl + 256*dstA + resA); \ 116 dstA = resA; \ 117 \ 118 t0 = vis_fmul8x16al(srcARGB, vis_read_lo(t0)); \ 119 t1 = vis_fmul8x16al(dstARGB, vis_read_lo(t1)); \ 120 rr = vis_fpadd16(t0, t1); \ 121 } 122 123 #define BLEND_VIS_RGB(rr, dstARGB, srcARGB, dstA, srcA) \ 124 { \ 125 mlib_d64 maskRGB = vis_to_double_dup(0x00FFFFFF); \ 126 \ 127 BLEND_VIS(rr, dstARGB, srcARGB, dstA, srcA) \ 128 \ 129 rr = vis_fand(rr, maskRGB); \ 130 } 131 132 #endif 133 134 /***************************************************************/ 135 136 #define F32_FROM_U8x4(x0, x1, x2, x3) \ 137 vis_to_float(((x0) << 24) | ((x1) << 16) | ((x2)<< 8) | ((x3))) 138 139 /***************************************************************/ 140 141 #define D64_FROM_U8x8(dd, val) \ 142 val &= 0xFF; \ 143 val |= (val << 8); \ 144 val |= (val << 16); \ 145 dd = vis_to_double_dup(val) 146 147 /***************************************************************/ 148 149 #define D64_FROM_U16x4(dd, val) \ 150 val &= 0xFFFF; \ 151 val |= (val << 16); \ 152 dd = vis_to_double_dup(val) 153 154 /***************************************************************/ 155 156 #define D64_FROM_F32x2(ff) \ 157 vis_freg_pair(ff, ff) 158 159 /***************************************************************/ 160 161 #if VIS >= 0x200 162 163 #define ARGB2ABGR_FL(src) \ 164 src = vis_read_hi(vis_bshuffle(vis_freg_pair(src, vis_fzeros()), 0)); 165 166 #define ARGB2ABGR_FL2(dst, src0, src1) \ 167 dst = vis_freg_pair(src0, src1); \ 168 dst = vis_bshuffle(dst, 0) 169 170 #define ARGB2ABGR_DB(src) \ 171 src = vis_bshuffle(src, 0); 172 173 #else 174 175 #define ARGB2ABGR_FL(src) { \ 176 mlib_d64 t0, t1, t2, t3; \ 177 t0 = vis_fpmerge(src, src); \ 178 t1 = vis_fpmerge(vis_read_lo(t0), vis_read_hi(t0)); \ 179 t2 = vis_fpmerge(vis_read_hi(t0), vis_read_lo(t0)); \ 180 t3 = vis_fpmerge(vis_read_hi(t2), vis_read_lo(t1)); \ 181 src = vis_read_hi(t3); \ 182 } 183 184 #define ARGB2ABGR_FL2(dst, src0, src1) { \ 185 mlib_d64 t0, t1, t2; \ 186 t0 = vis_fpmerge(src0, src1); \ 187 t1 = vis_fpmerge(vis_read_lo(t0), vis_read_hi(t0)); \ 188 t2 = vis_fpmerge(vis_read_hi(t0), vis_read_lo(t0)); \ 189 dst = vis_fpmerge(vis_read_hi(t2), vis_read_lo(t1)); \ 190 } 191 192 #define ARGB2ABGR_DB(src) \ 193 ARGB2ABGR_FL2(src, vis_read_hi(src), vis_read_lo(src)) 194 195 #endif 196 197 /***************************************************************/ 198 199 #endif /* JAVA2D_NO_MLIB */ 200