| /* |
| * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| |
| /* |
| * |
| * DESCRIPTION |
| * Clear of an image to a specific color. |
| * -- VIS version low level functions. |
| * |
| * NOTE |
| * These functions are separated from mlib_v_ImageClear.c |
| * for structure clarity. |
| */ |
| |
| #include <vis_proto.h> |
| #include <mlib_image.h> |
| #include <mlib_v_ImageClear_f.h> |
| |
| /***************************************************************/ |
| |
| #define PREPAREVARS(type, chan) \ |
| type *pimg = (type *) mlib_ImageGetData(img); \ |
| mlib_s32 img_height = mlib_ImageGetHeight(img); \ |
| mlib_s32 img_width = mlib_ImageGetWidth(img); \ |
| mlib_s32 img_stride = mlib_ImageGetStride(img) / sizeof(type); \ |
| mlib_s32 i, l, j; \ |
| mlib_s32 emask; \ |
| mlib_d64 dcolor, *dpimg; \ |
| \ |
| if ((img_width * chan) == img_stride) { \ |
| img_width *= img_height; \ |
| img_height = 1; \ |
| } |
| |
| /***************************************************************/ |
| |
| #define STRIP(pd, color, w, h, chan, data_type) \ |
| for (l = 0; l < chan; l++) { \ |
| data_type color_i = color[l]; \ |
| for (i = 0; i < h; i++) { \ |
| for (j = 0; j < w; j++) pd[i*img_stride+l+j*chan] = color_i; \ |
| } \ |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_BIT_1(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img); |
| mlib_s32 img_height = mlib_ImageGetHeight(img); |
| mlib_s32 img_width = mlib_ImageGetWidth(img); |
| mlib_s32 img_stride = mlib_ImageGetStride(img); |
| mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img); |
| mlib_s32 i, j, b_j, k; |
| mlib_u8 bcolor0, bmask, emask, src; |
| mlib_d64 dcolor, *dpimg; |
| mlib_u32 color0; |
| |
| if (img_width == img_stride * 8) { |
| img_width *= img_height; |
| img_height = 1; |
| } |
| |
| color0 = ((color[0] & 1) << 31) >> 31; |
| bcolor0 = color0 & 0xFF; |
| |
| dcolor = vis_to_double_dup(color0); |
| for (i = 0, j = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end; |
| |
| if (img_bitoff + img_width <= 8) { |
| bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width); |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| continue; |
| } |
| else { |
| bmask = 0xFF >> img_bitoff; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| pimg_row++; |
| j = 8 - img_bitoff; |
| b_j = (img_width - j) / 8; |
| } |
| |
| if (b_j < 16) { |
| mlib_s32 ii; |
| |
| for (ii = 0; ii < b_j; ii++) |
| pimg_row[ii] = bcolor0; |
| |
| pimg_row += ii; |
| j += ii << 3; |
| |
| if (j < img_width) { |
| bmask = (0xFF << (8 - (img_width - j))) & 0xFF; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| } |
| |
| continue; |
| } |
| |
| pimg_row_end = pimg_row + b_j - 1; |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| vis_pst_8(dcolor, dpimg++, emask); |
| k = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; k < (b_j - 8); k += 8) |
| *dpimg++ = dcolor; |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor, dpimg, emask); |
| j += b_j << 3; |
| |
| if (j < img_width) { |
| pimg_row = (mlib_u8 *) (pimg_row_end + 1); |
| bmask = (0xFF << (8 - (img_width - j))) & 0xFF; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_BIT_2(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img); /* pointer to the data of img-image */ |
| mlib_s32 img_height = mlib_ImageGetHeight(img); /* height of source image */ |
| mlib_s32 img_width = mlib_ImageGetWidth(img) << 1; /* width of source image */ |
| mlib_s32 img_stride = mlib_ImageGetStride(img); /* elements to next row */ |
| mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img); /* bits to first byte */ |
| mlib_s32 i, j, b_j, k; /* indicies */ |
| mlib_u8 bcolor0, bmask, emask, src; |
| mlib_d64 dcolor, *dpimg; |
| mlib_u32 color0 = color[0] & 1, color1 = color[1] & 1; |
| |
| if (img_width == img_stride * 8) { |
| img_width *= img_height; |
| img_height = 1; |
| } |
| |
| color1 = (color0 << 1) | color1; |
| color1 = (color1 << 2) | color1; |
| color1 = (color1 << 4) | color1; |
| color0 = ((color1 << 1) & 0xFE) | color0; |
| bcolor0 = ((img_bitoff & 1) == 0) ? color1 : color0; |
| color0 = (bcolor0 << 8) | bcolor0; |
| color0 = (color0 << 16) | color0; |
| |
| dcolor = vis_to_double_dup(color0); |
| for (i = 0, j = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end; |
| |
| if (img_bitoff + img_width <= 8) { |
| bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width); |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| continue; |
| } |
| else { |
| bmask = 0xFF >> img_bitoff; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| pimg_row++; |
| j = 8 - img_bitoff; |
| b_j = (img_width - j) / 8; |
| } |
| |
| if (b_j < 16) { |
| mlib_s32 ii; |
| |
| for (ii = 0; ii < b_j; ii++) |
| pimg_row[ii] = bcolor0; |
| |
| pimg_row += ii; |
| j += ii << 3; |
| |
| if (j < img_width) { |
| bmask = (0xFF << (8 - (img_width - j))) & 0xFF; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| } |
| |
| continue; |
| } |
| |
| pimg_row_end = pimg_row + b_j - 1; |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| vis_pst_8(dcolor, dpimg++, emask); |
| k = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; k < (b_j - 8); k += 8) |
| *dpimg++ = dcolor; |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor, dpimg, emask); |
| j += b_j << 3; |
| |
| if (j < img_width) { |
| pimg_row = (mlib_u8 *) (pimg_row_end + 1); |
| bmask = (0xFF << (8 - (img_width - j))) & 0xFF; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_BIT_3(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img); /* pointer to the data of img-image */ |
| mlib_s32 img_height = mlib_ImageGetHeight(img); /* height of source image */ |
| mlib_s32 img_width = mlib_ImageGetWidth(img) * 3; /* width of source image */ |
| mlib_s32 img_stride = mlib_ImageGetStride(img); /* elements to next row */ |
| mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img); /* bits to first byte */ |
| mlib_s32 i, j, b_j, k, bit_shift; /* indicies */ |
| mlib_u8 bcolor, bmask, emask, src; |
| mlib_d64 dcolor0, dcolor1, dcolor2, *dpimg; |
| mlib_d64 dcolor00, dcolor11, dcolor22; |
| mlib_u32 color0 = color[0] & 1, color1 = color[1] & 1, color2 = color[2] & 1; |
| mlib_u32 col0, col1, col2; |
| |
| if (img_width == img_stride * 8) { |
| img_width *= img_height; |
| img_height = 1; |
| } |
| |
| col0 = (color0 << 3) | (color1 << 2) | (color2 << 1) | color0; |
| col1 = (col0 >> 1) | (color2 << 3); |
| col2 = (col1 >> 1) | (color1 << 3); |
| color0 = (col0 << 4) | col2; |
| color1 = (col1 << 4) | col0; |
| color2 = (col2 << 4) | col1; |
| |
| color0 = (color0 << 24) | (color1 << 16) | (color2 << 8) | color0; |
| color1 = (color0 << 8) | color1; |
| color2 = (color1 << 8) | color2; |
| |
| dcolor0 = vis_to_double(color0, color1); |
| dcolor1 = vis_to_double(color2, color0); |
| dcolor2 = vis_to_double(color1, color2); |
| |
| for (i = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end; |
| |
| if (img_bitoff + img_width <= 8) { |
| bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width); |
| src = pimg_row[0]; |
| bcolor = (color0 >> img_bitoff) & 0xFF; |
| pimg_row[0] = (src & ~bmask) | (bcolor & bmask); |
| continue; |
| } |
| else { |
| bmask = 0xFF >> img_bitoff; |
| src = pimg_row[0]; |
| bcolor = (color0 >> img_bitoff) & 0xFF; |
| bit_shift = (((mlib_addr) pimg_row & 7) << 3) + img_bitoff; |
| pimg_row[0] = (src & ~bmask) | (bcolor & bmask); |
| pimg_row++; |
| j = 8 - img_bitoff; |
| b_j = (img_width - j) / 8; |
| } |
| |
| pimg_row_end = pimg_row + b_j - 1; |
| |
| dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7); |
| vis_alignaddr((void *)(bit_shift % 3), 0); |
| dcolor22 = vis_faligndata(dcolor0, dcolor1); |
| dcolor00 = vis_faligndata(dcolor1, dcolor2); |
| dcolor11 = vis_faligndata(dcolor2, dcolor0); |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| |
| if ((mlib_addr) pimg_row & 7) |
| vis_pst_8(dcolor22, dpimg++, emask); |
| k = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; k <= (b_j - 24); k += 24) { |
| dpimg[0] = dcolor00; |
| dpimg[1] = dcolor11; |
| dpimg[2] = dcolor22; |
| dpimg += 3; |
| } |
| |
| if (k < b_j) { |
| if (k < (b_j - 8)) { |
| *dpimg++ = dcolor00; |
| |
| if (k < (b_j - 16)) { |
| *dpimg++ = dcolor11; |
| dcolor00 = dcolor22; |
| } |
| else |
| dcolor00 = dcolor11; |
| } |
| |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor00, dpimg, emask); |
| } |
| |
| j = img_width - j - (b_j << 3); |
| |
| if (j > 0) { |
| pimg_row = (mlib_u8 *) (pimg_row_end + 1); |
| bmask = (0xFF << (8 - j)) & 0xFF; |
| bcolor = (color0 >> j) & 0xFF; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (bcolor & bmask); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_BIT_4(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img); /* pointer to the data of img-image */ |
| mlib_s32 img_height = mlib_ImageGetHeight(img); /* height of source image */ |
| mlib_s32 img_width = mlib_ImageGetWidth(img) << 2; /* width of source image */ |
| mlib_s32 img_stride = mlib_ImageGetStride(img); /* elements to next row */ |
| mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img); /* bits to first byte */ |
| mlib_s32 i, j, b_j, k; /* indicies */ |
| mlib_u8 bcolor0, bmask, emask, src; |
| mlib_d64 dcolor, *dpimg; |
| mlib_u32 color0 = color[0] & 1, color1 = color[1] & 1, color2 = color[2] & 1, color3 = color[3] & 1; |
| |
| if (img_width == img_stride * 8) { |
| img_width *= img_height; |
| img_height = 1; |
| } |
| |
| color0 = (color0 << 3) | (color1 << 2) | (color2 << 1) | color3; |
| color0 = (color0 << 4) | color0; |
| color3 = (color0 << 1) | (color0 >> 7); |
| color2 = (color0 << 2) | (color0 >> 6); |
| color1 = (color0 << 3) | (color0 >> 5); |
| |
| bcolor0 = (img_bitoff & 2) ? ((img_bitoff & 1) ? color3 : color2) : ((img_bitoff & 1) ? color1 : color0); |
| color0 = (bcolor0 << 24) | (bcolor0 << 16) | (bcolor0 << 8) | bcolor0; |
| |
| dcolor = vis_to_double_dup(color0); |
| for (i = 0, j = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end; |
| |
| if (img_bitoff + img_width <= 8) { |
| bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width); |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| continue; |
| } |
| else { |
| bmask = 0xFF >> img_bitoff; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| pimg_row++; |
| j = 8 - img_bitoff; |
| b_j = (img_width - j) / 8; |
| } |
| |
| if (b_j < 16) { |
| mlib_s32 ii; |
| |
| for (ii = 0; ii < b_j; ii++) |
| pimg_row[ii] = bcolor0; |
| |
| pimg_row += ii; |
| j += ii << 3; |
| |
| if (j < img_width) { |
| bmask = (0xFF << (8 - (img_width - j))) & 0xFF; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| } |
| |
| continue; |
| } |
| |
| pimg_row_end = pimg_row + b_j - 1; |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| vis_pst_8(dcolor, dpimg++, emask); |
| k = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; k < (b_j - 8); k += 8) |
| *dpimg++ = dcolor; |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor, dpimg, emask); |
| j += b_j << 3; |
| |
| if (j < img_width) { |
| pimg_row = (mlib_u8 *) (pimg_row_end + 1); |
| bmask = (0xFF << (8 - (img_width - j))) & 0xFF; |
| src = pimg_row[0]; |
| pimg_row[0] = (src & ~bmask) | (color0 & bmask); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_U8_1(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFF; |
| |
| PREPAREVARS(mlib_u8, 1); |
| |
| if (img_width < 16) { |
| STRIP(pimg, color, img_width, img_height, 1, mlib_u8); |
| return; |
| } |
| |
| color0 |= (color0 << 8); |
| color0 |= (color0 << 16); |
| dcolor = vis_to_double_dup(color0); |
| for (i = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width - 1; |
| |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| vis_pst_8(dcolor, dpimg++, emask); |
| j = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; j < (img_width - 8); j += 8) |
| *dpimg++ = dcolor; |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_U8_2(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFF, color1 = color[1] & 0xFF; |
| mlib_d64 dcolor0; |
| |
| PREPAREVARS(mlib_u8, 2); |
| |
| if (img_width < 8) { |
| STRIP(pimg, color, img_width, img_height, 2, mlib_u8); |
| return; |
| } |
| |
| color0 = (color0 << 8) | color1; |
| color0 |= (color0 << 16); |
| dcolor0 = vis_to_double_dup(color0); |
| for (i = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 2 - 1; |
| |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| dcolor = vis_faligndata(dcolor0, dcolor0); |
| vis_pst_8(dcolor, dpimg++, emask); |
| j = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; j < (img_width * 2 - 8); j += 8) |
| *dpimg++ = dcolor; |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_U8_3(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFF, color1 = color[1] & 0xFF, color2 = color[2] & 0xFF, col; |
| mlib_d64 dcolor1, dcolor2, dcolor00, dcolor11, dcolor22; |
| |
| PREPAREVARS(mlib_u8, 3); |
| |
| if (img_width < 16) { |
| STRIP(pimg, color, img_width, img_height, 3, mlib_u8); |
| return; |
| } |
| |
| col = (color0 << 16) | (color1 << 8) | color2; |
| color0 = (col << 8) | color0; |
| color1 = (color0 << 8) | color1; |
| color2 = (color1 << 8) | color2; |
| dcolor = vis_to_double(color0, color1); |
| dcolor1 = vis_to_double(color2, color0); |
| dcolor2 = vis_to_double(color1, color2); |
| for (i = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 3 - 1; |
| |
| dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7); |
| vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8); |
| dcolor22 = vis_faligndata(dcolor2, dcolor); |
| dcolor00 = vis_faligndata(dcolor, dcolor1); |
| dcolor11 = vis_faligndata(dcolor1, dcolor2); |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| |
| if ((mlib_addr) pimg_row & 7) |
| vis_pst_8(dcolor22, dpimg++, emask); |
| j = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; j < (img_width * 3 - 24); j += 24) { |
| dpimg[0] = dcolor00; |
| dpimg[1] = dcolor11; |
| dpimg[2] = dcolor22; |
| dpimg += 3; |
| } |
| |
| if (j < (img_width * 3 - 8)) { |
| *dpimg++ = dcolor00; |
| |
| if (j < (img_width * 3 - 16)) { |
| *dpimg++ = dcolor11; |
| dcolor00 = dcolor22; |
| } |
| else |
| dcolor00 = dcolor11; |
| } |
| |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor00, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_U8_4(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFF, color1 = color[1] & 0xFF, color2 = color[2] & 0xFF, color3 = color[3] & 0xFF; |
| mlib_d64 dcolor0; |
| |
| PREPAREVARS(mlib_u8, 4); |
| |
| if (img_width < 4) { |
| STRIP(pimg, color, img_width, img_height, 4, mlib_u8); |
| return; |
| } |
| |
| color0 = (color0 << 24) | (color1 << 16) | (color2 << 8) | color3; |
| dcolor0 = vis_to_double_dup(color0); |
| for (i = 0; i < img_height; i++) { |
| mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 4 - 1; |
| |
| dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7); |
| vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8); |
| emask = vis_edge8(pimg_row, pimg_row_end); |
| dcolor = vis_faligndata(dcolor0, dcolor0); |
| vis_pst_8(dcolor, dpimg++, emask); |
| j = (mlib_addr) dpimg - (mlib_addr) pimg_row; |
| for (; j < (img_width * 4 - 8); j += 8) |
| *dpimg++ = dcolor; |
| emask = vis_edge8(dpimg, pimg_row_end); |
| vis_pst_8(dcolor, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S16_1(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFFFF; |
| |
| PREPAREVARS(mlib_s16, 1); |
| |
| if (img_width < 8) { |
| STRIP(pimg, color, img_width, img_height, 1, mlib_s16); |
| return; |
| } |
| |
| color0 |= (color0 << 16); |
| dcolor = vis_to_double_dup(color0); |
| for (i = 0; i < img_height; i++) { |
| mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width - 1; |
| |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| emask = vis_edge16(pimg_row, pimg_row_end); |
| vis_pst_16(dcolor, dpimg++, emask); |
| j = (mlib_s16 *) dpimg - pimg_row; |
| for (; j < (img_width - 4); j += 4) |
| *dpimg++ = dcolor; |
| emask = vis_edge16(dpimg, pimg_row_end); |
| vis_pst_16(dcolor, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S16_2(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFFFF, color1 = color[1] & 0xFFFF; |
| mlib_d64 dcolor0; |
| |
| PREPAREVARS(mlib_s16, 2); |
| |
| if (img_width < 4) { |
| STRIP(pimg, color, img_width, img_height, 2, mlib_s16); |
| return; |
| } |
| |
| color0 = (color0 << 16) | color1; |
| dcolor0 = vis_to_double_dup(color0); |
| for (i = 0; i < img_height; i++) { |
| mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 2 - 1; |
| |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| emask = vis_edge16(pimg_row, pimg_row_end); |
| dcolor = vis_faligndata(dcolor0, dcolor0); |
| vis_pst_16(dcolor, dpimg++, emask); |
| j = (mlib_s16 *) dpimg - pimg_row; |
| for (; j < (img_width * 2 - 4); j += 4) |
| *dpimg++ = dcolor; |
| emask = vis_edge16(dpimg, pimg_row_end); |
| vis_pst_16(dcolor, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S16_3(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFFFF, color1 = color[1] & 0xFFFF, color2 = color[2] & 0xFFFF, col0, col1, col2; |
| mlib_d64 dcolor1, dcolor2, dcolor00, dcolor11, dcolor22; |
| |
| PREPAREVARS(mlib_s16, 3); |
| |
| if (img_width < 8) { |
| STRIP(pimg, color, img_width, img_height, 3, mlib_s16); |
| return; |
| } |
| |
| col0 = (color0 << 16) | color1; |
| col1 = (color2 << 16) | color0; |
| col2 = (color1 << 16) | color2; |
| dcolor = vis_to_double(col0, col1); |
| dcolor1 = vis_to_double(col2, col0); |
| dcolor2 = vis_to_double(col1, col2); |
| for (i = 0; i < img_height; i++) { |
| mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 3 - 1; |
| |
| dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7); |
| vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8); |
| dcolor22 = vis_faligndata(dcolor2, dcolor); |
| dcolor00 = vis_faligndata(dcolor, dcolor1); |
| dcolor11 = vis_faligndata(dcolor1, dcolor2); |
| emask = vis_edge16(pimg_row, pimg_row_end); |
| |
| if ((mlib_addr) pimg_row & 7) |
| vis_pst_16(dcolor22, dpimg++, emask); |
| j = (mlib_s16 *) dpimg - pimg_row; |
| for (; j < (img_width * 3 - 12); j += 12) { |
| dpimg[0] = dcolor00; |
| dpimg[1] = dcolor11; |
| dpimg[2] = dcolor22; |
| dpimg += 3; |
| } |
| |
| if (j < (img_width * 3 - 4)) { |
| *dpimg++ = dcolor00; |
| |
| if (j < (img_width * 3 - 8)) { |
| *dpimg++ = dcolor11; |
| dcolor00 = dcolor22; |
| } |
| else |
| dcolor00 = dcolor11; |
| } |
| |
| emask = vis_edge16(dpimg, pimg_row_end); |
| vis_pst_16(dcolor00, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S16_4(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0] & 0xFFFF, color1 = color[1] & 0xFFFF, color2 = color[2] & 0xFFFF, color3 = color[3] & 0xFFFF; |
| mlib_d64 dcolor0; |
| |
| PREPAREVARS(mlib_s16, 4); |
| |
| if (img_width < 2) { |
| STRIP(pimg, color, img_width, img_height, 4, mlib_s16); |
| return; |
| } |
| |
| color0 = (color0 << 16) | color1; |
| color1 = (color2 << 16) | color3; |
| dcolor0 = vis_to_double(color0, color1); |
| for (i = 0; i < img_height; i++) { |
| mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 4 - 1; |
| |
| dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7); |
| vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8); |
| emask = vis_edge16(pimg_row, pimg_row_end); |
| dcolor = vis_faligndata(dcolor0, dcolor0); |
| vis_pst_16(dcolor, dpimg++, emask); |
| j = (mlib_s16 *) dpimg - pimg_row; |
| for (; j < (img_width * 4 - 4); j += 4) |
| *dpimg++ = dcolor; |
| emask = vis_edge16(dpimg, pimg_row_end); |
| vis_pst_16(dcolor, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S32_1(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0]; |
| |
| PREPAREVARS(mlib_s32, 1); |
| |
| if (img_width < 4) { |
| STRIP(pimg, color, img_width, img_height, 1, mlib_s32); |
| return; |
| } |
| |
| dcolor = vis_to_double_dup(color0); |
| for (i = 0; i < img_height; i++) { |
| mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width - 1; |
| |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| emask = vis_edge32(pimg_row, pimg_row_end); |
| vis_pst_32(dcolor, dpimg++, emask); |
| j = (mlib_s32 *) dpimg - pimg_row; |
| for (; j <= (img_width - 2); j += 2) |
| *dpimg++ = dcolor; |
| |
| if (j < img_width) { |
| emask = vis_edge32(dpimg, pimg_row_end); |
| vis_pst_32(dcolor, dpimg, emask); |
| } |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S32_2(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0], color1 = color[1]; |
| mlib_d64 dcolor0; |
| |
| PREPAREVARS(mlib_s32, 2); |
| |
| if (img_width < 2) { |
| STRIP(pimg, color, img_width, img_height, 2, mlib_s32); |
| return; |
| } |
| |
| dcolor0 = vis_to_double(color0, color1); |
| for (i = 0; i < img_height; i++) { |
| mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 2 - 1; |
| |
| dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0); |
| emask = vis_edge32(pimg_row, pimg_row_end); |
| dcolor = vis_faligndata(dcolor0, dcolor0); |
| vis_pst_32(dcolor, dpimg++, emask); |
| j = (mlib_s32 *) dpimg - pimg_row; |
| for (; j < (img_width * 2 - 2); j += 2) |
| *dpimg++ = dcolor; |
| emask = vis_edge32(dpimg, pimg_row_end); |
| vis_pst_32(dcolor, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S32_3(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0], color1 = color[1], color2 = color[2]; |
| mlib_d64 dcolor1, dcolor2, dcolor00, dcolor11, dcolor22; |
| |
| PREPAREVARS(mlib_s32, 3); |
| |
| if (img_width < 2) { |
| STRIP(pimg, color, img_width, img_height, 3, mlib_s32); |
| return; |
| } |
| |
| dcolor = vis_to_double(color0, color1); |
| dcolor1 = vis_to_double(color2, color0); |
| dcolor2 = vis_to_double(color1, color2); |
| for (i = 0; i < img_height; i++) { |
| mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 3 - 1; |
| |
| dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7); |
| vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8); |
| dcolor22 = vis_faligndata(dcolor2, dcolor); |
| dcolor00 = vis_faligndata(dcolor, dcolor1); |
| dcolor11 = vis_faligndata(dcolor1, dcolor2); |
| emask = vis_edge32(pimg_row, pimg_row_end); |
| |
| if ((mlib_addr) pimg_row & 7) |
| vis_pst_32(dcolor22, dpimg++, emask); |
| j = (mlib_s32 *) dpimg - pimg_row; |
| for (; j < (img_width * 3 - 6); j += 6) { |
| dpimg[0] = dcolor00; |
| dpimg[1] = dcolor11; |
| dpimg[2] = dcolor22; |
| dpimg += 3; |
| } |
| |
| if (j < (img_width * 3 - 2)) { |
| *dpimg++ = dcolor00; |
| |
| if (j < (img_width * 3 - 4)) { |
| *dpimg++ = dcolor11; |
| dcolor00 = dcolor22; |
| } |
| else |
| dcolor00 = dcolor11; |
| } |
| |
| emask = vis_edge32(dpimg, pimg_row_end); |
| vis_pst_32(dcolor00, dpimg, emask); |
| } |
| } |
| |
| /***************************************************************/ |
| |
| void mlib_v_ImageClear_S32_4(mlib_image *img, |
| const mlib_s32 *color) |
| { |
| mlib_u32 color0 = color[0], color1 = color[1], color2 = color[2], color3 = color[3]; |
| mlib_d64 dcolor0, dcolor00, dcolor0_, dcolor00_, dcolor1; |
| |
| PREPAREVARS(mlib_s32, 4); |
| |
| if (img_width < 2) { |
| STRIP(pimg, color, img_width, img_height, 4, mlib_s32); |
| return; |
| } |
| |
| dcolor0 = vis_to_double(color2, color3); |
| dcolor00 = vis_to_double(color0, color1); |
| vis_alignaddr((void *)0, 4); |
| dcolor0_ = vis_faligndata(dcolor0, dcolor00); |
| dcolor00_ = vis_faligndata(dcolor00, dcolor0); |
| for (i = 0; i < img_height; i++) { |
| mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 4 - 1; |
| |
| dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7); |
| vis_alignaddr((void *)(-(mlib_addr) pimg_row), 4); |
| emask = vis_edge32(pimg_row, pimg_row_end); |
| dcolor = vis_faligndata(dcolor0_, dcolor00_); |
| dcolor1 = vis_faligndata(dcolor00_, dcolor0_); |
| vis_pst_32(dcolor, dpimg++, emask); |
| *dpimg++ = dcolor1; |
| j = (mlib_s32 *) dpimg - pimg_row; |
| for (; j <= (img_width * 4 - 4); j += 4) { |
| dpimg[0] = dcolor; |
| dpimg[1] = dcolor1; |
| dpimg += 2; |
| } |
| |
| if (j < (img_width * 4)) { |
| emask = vis_edge32(dpimg, pimg_row_end); |
| vis_pst_32(dcolor, dpimg, emask); |
| } |
| } |
| } |
| |
| /***************************************************************/ |