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
27 /*
28 *
29 * DESCRIPTION
30 * Clear of an image to a specific color.
31 * -- VIS version low level functions.
32 *
33 * NOTE
34 * These functions are separated from mlib_v_ImageClear.c
35 * for structure clarity.
36 */
37
38 #include <vis_proto.h>
39 #include <mlib_image.h>
40 #include <mlib_v_ImageClear_f.h>
41
42 /***************************************************************/
43
44 #define PREPAREVARS(type, chan) \
45 type *pimg = (type *) mlib_ImageGetData(img); \
46 mlib_s32 img_height = mlib_ImageGetHeight(img); \
47 mlib_s32 img_width = mlib_ImageGetWidth(img); \
48 mlib_s32 img_stride = mlib_ImageGetStride(img) / sizeof(type); \
49 mlib_s32 i, l, j; \
50 mlib_s32 emask; \
51 mlib_d64 dcolor, *dpimg; \
52 \
53 if ((img_width * chan) == img_stride) { \
54 img_width *= img_height; \
55 img_height = 1; \
56 }
57
58 /***************************************************************/
59
60 #define STRIP(pd, color, w, h, chan, data_type) \
61 for (l = 0; l < chan; l++) { \
62 data_type color_i = color[l]; \
63 for (i = 0; i < h; i++) { \
64 for (j = 0; j < w; j++) pd[i*img_stride+l+j*chan] = color_i; \
65 } \
66 }
67
68 /***************************************************************/
69
mlib_v_ImageClear_BIT_1(mlib_image * img,const mlib_s32 * color)70 void mlib_v_ImageClear_BIT_1(mlib_image *img,
71 const mlib_s32 *color)
72 {
73 mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img);
74 mlib_s32 img_height = mlib_ImageGetHeight(img);
75 mlib_s32 img_width = mlib_ImageGetWidth(img);
76 mlib_s32 img_stride = mlib_ImageGetStride(img);
77 mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img);
78 mlib_s32 i, j, b_j, k;
79 mlib_u8 bcolor0, bmask, emask, src;
80 mlib_d64 dcolor, *dpimg;
81 mlib_u32 color0;
82
83 if (img_width == img_stride * 8) {
84 img_width *= img_height;
85 img_height = 1;
86 }
87
88 color0 = ((color[0] & 1) << 31) >> 31;
89 bcolor0 = color0 & 0xFF;
90
91 dcolor = vis_to_double_dup(color0);
92 for (i = 0, j = 0; i < img_height; i++) {
93 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end;
94
95 if (img_bitoff + img_width <= 8) {
96 bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width);
97 src = pimg_row[0];
98 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
99 continue;
100 }
101 else {
102 bmask = 0xFF >> img_bitoff;
103 src = pimg_row[0];
104 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
105 pimg_row++;
106 j = 8 - img_bitoff;
107 b_j = (img_width - j) / 8;
108 }
109
110 if (b_j < 16) {
111 mlib_s32 ii;
112
113 for (ii = 0; ii < b_j; ii++)
114 pimg_row[ii] = bcolor0;
115
116 pimg_row += ii;
117 j += ii << 3;
118
119 if (j < img_width) {
120 bmask = (0xFF << (8 - (img_width - j))) & 0xFF;
121 src = pimg_row[0];
122 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
123 }
124
125 continue;
126 }
127
128 pimg_row_end = pimg_row + b_j - 1;
129 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
130
131 emask = vis_edge8(pimg_row, pimg_row_end);
132 vis_pst_8(dcolor, dpimg++, emask);
133 k = (mlib_addr) dpimg - (mlib_addr) pimg_row;
134 for (; k < (b_j - 8); k += 8)
135 *dpimg++ = dcolor;
136 emask = vis_edge8(dpimg, pimg_row_end);
137 vis_pst_8(dcolor, dpimg, emask);
138 j += b_j << 3;
139
140 if (j < img_width) {
141 pimg_row = (mlib_u8 *) (pimg_row_end + 1);
142 bmask = (0xFF << (8 - (img_width - j))) & 0xFF;
143 src = pimg_row[0];
144 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
145 }
146 }
147 }
148
149 /***************************************************************/
150
mlib_v_ImageClear_BIT_2(mlib_image * img,const mlib_s32 * color)151 void mlib_v_ImageClear_BIT_2(mlib_image *img,
152 const mlib_s32 *color)
153 {
154 mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img); /* pointer to the data of img-image */
155 mlib_s32 img_height = mlib_ImageGetHeight(img); /* height of source image */
156 mlib_s32 img_width = mlib_ImageGetWidth(img) << 1; /* width of source image */
157 mlib_s32 img_stride = mlib_ImageGetStride(img); /* elements to next row */
158 mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img); /* bits to first byte */
159 mlib_s32 i, j, b_j, k; /* indicies */
160 mlib_u8 bcolor0, bmask, emask, src;
161 mlib_d64 dcolor, *dpimg;
162 mlib_u32 color0 = color[0] & 1, color1 = color[1] & 1;
163
164 if (img_width == img_stride * 8) {
165 img_width *= img_height;
166 img_height = 1;
167 }
168
169 color1 = (color0 << 1) | color1;
170 color1 = (color1 << 2) | color1;
171 color1 = (color1 << 4) | color1;
172 color0 = ((color1 << 1) & 0xFE) | color0;
173 bcolor0 = ((img_bitoff & 1) == 0) ? color1 : color0;
174 color0 = (bcolor0 << 8) | bcolor0;
175 color0 = (color0 << 16) | color0;
176
177 dcolor = vis_to_double_dup(color0);
178 for (i = 0, j = 0; i < img_height; i++) {
179 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end;
180
181 if (img_bitoff + img_width <= 8) {
182 bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width);
183 src = pimg_row[0];
184 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
185 continue;
186 }
187 else {
188 bmask = 0xFF >> img_bitoff;
189 src = pimg_row[0];
190 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
191 pimg_row++;
192 j = 8 - img_bitoff;
193 b_j = (img_width - j) / 8;
194 }
195
196 if (b_j < 16) {
197 mlib_s32 ii;
198
199 for (ii = 0; ii < b_j; ii++)
200 pimg_row[ii] = bcolor0;
201
202 pimg_row += ii;
203 j += ii << 3;
204
205 if (j < img_width) {
206 bmask = (0xFF << (8 - (img_width - j))) & 0xFF;
207 src = pimg_row[0];
208 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
209 }
210
211 continue;
212 }
213
214 pimg_row_end = pimg_row + b_j - 1;
215 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
216
217 emask = vis_edge8(pimg_row, pimg_row_end);
218 vis_pst_8(dcolor, dpimg++, emask);
219 k = (mlib_addr) dpimg - (mlib_addr) pimg_row;
220 for (; k < (b_j - 8); k += 8)
221 *dpimg++ = dcolor;
222 emask = vis_edge8(dpimg, pimg_row_end);
223 vis_pst_8(dcolor, dpimg, emask);
224 j += b_j << 3;
225
226 if (j < img_width) {
227 pimg_row = (mlib_u8 *) (pimg_row_end + 1);
228 bmask = (0xFF << (8 - (img_width - j))) & 0xFF;
229 src = pimg_row[0];
230 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
231 }
232 }
233 }
234
235 /***************************************************************/
236
mlib_v_ImageClear_BIT_3(mlib_image * img,const mlib_s32 * color)237 void mlib_v_ImageClear_BIT_3(mlib_image *img,
238 const mlib_s32 *color)
239 {
240 mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img); /* pointer to the data of img-image */
241 mlib_s32 img_height = mlib_ImageGetHeight(img); /* height of source image */
242 mlib_s32 img_width = mlib_ImageGetWidth(img) * 3; /* width of source image */
243 mlib_s32 img_stride = mlib_ImageGetStride(img); /* elements to next row */
244 mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img); /* bits to first byte */
245 mlib_s32 i, j, b_j, k, bit_shift; /* indicies */
246 mlib_u8 bcolor, bmask, emask, src;
247 mlib_d64 dcolor0, dcolor1, dcolor2, *dpimg;
248 mlib_d64 dcolor00, dcolor11, dcolor22;
249 mlib_u32 color0 = color[0] & 1, color1 = color[1] & 1, color2 = color[2] & 1;
250 mlib_u32 col0, col1, col2;
251
252 if (img_width == img_stride * 8) {
253 img_width *= img_height;
254 img_height = 1;
255 }
256
257 col0 = (color0 << 3) | (color1 << 2) | (color2 << 1) | color0;
258 col1 = (col0 >> 1) | (color2 << 3);
259 col2 = (col1 >> 1) | (color1 << 3);
260 color0 = (col0 << 4) | col2;
261 color1 = (col1 << 4) | col0;
262 color2 = (col2 << 4) | col1;
263
264 color0 = (color0 << 24) | (color1 << 16) | (color2 << 8) | color0;
265 color1 = (color0 << 8) | color1;
266 color2 = (color1 << 8) | color2;
267
268 dcolor0 = vis_to_double(color0, color1);
269 dcolor1 = vis_to_double(color2, color0);
270 dcolor2 = vis_to_double(color1, color2);
271
272 for (i = 0; i < img_height; i++) {
273 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end;
274
275 if (img_bitoff + img_width <= 8) {
276 bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width);
277 src = pimg_row[0];
278 bcolor = (color0 >> img_bitoff) & 0xFF;
279 pimg_row[0] = (src & ~bmask) | (bcolor & bmask);
280 continue;
281 }
282 else {
283 bmask = 0xFF >> img_bitoff;
284 src = pimg_row[0];
285 bcolor = (color0 >> img_bitoff) & 0xFF;
286 bit_shift = (((mlib_addr) pimg_row & 7) << 3) + img_bitoff;
287 pimg_row[0] = (src & ~bmask) | (bcolor & bmask);
288 pimg_row++;
289 j = 8 - img_bitoff;
290 b_j = (img_width - j) / 8;
291 }
292
293 pimg_row_end = pimg_row + b_j - 1;
294
295 dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7);
296 vis_alignaddr((void *)(bit_shift % 3), 0);
297 dcolor22 = vis_faligndata(dcolor0, dcolor1);
298 dcolor00 = vis_faligndata(dcolor1, dcolor2);
299 dcolor11 = vis_faligndata(dcolor2, dcolor0);
300 emask = vis_edge8(pimg_row, pimg_row_end);
301
302 if ((mlib_addr) pimg_row & 7)
303 vis_pst_8(dcolor22, dpimg++, emask);
304 k = (mlib_addr) dpimg - (mlib_addr) pimg_row;
305 for (; k <= (b_j - 24); k += 24) {
306 dpimg[0] = dcolor00;
307 dpimg[1] = dcolor11;
308 dpimg[2] = dcolor22;
309 dpimg += 3;
310 }
311
312 if (k < b_j) {
313 if (k < (b_j - 8)) {
314 *dpimg++ = dcolor00;
315
316 if (k < (b_j - 16)) {
317 *dpimg++ = dcolor11;
318 dcolor00 = dcolor22;
319 }
320 else
321 dcolor00 = dcolor11;
322 }
323
324 emask = vis_edge8(dpimg, pimg_row_end);
325 vis_pst_8(dcolor00, dpimg, emask);
326 }
327
328 j = img_width - j - (b_j << 3);
329
330 if (j > 0) {
331 pimg_row = (mlib_u8 *) (pimg_row_end + 1);
332 bmask = (0xFF << (8 - j)) & 0xFF;
333 bcolor = (color0 >> j) & 0xFF;
334 src = pimg_row[0];
335 pimg_row[0] = (src & ~bmask) | (bcolor & bmask);
336 }
337 }
338 }
339
340 /***************************************************************/
341
mlib_v_ImageClear_BIT_4(mlib_image * img,const mlib_s32 * color)342 void mlib_v_ImageClear_BIT_4(mlib_image *img,
343 const mlib_s32 *color)
344 {
345 mlib_u8 *pimg = (mlib_u8 *) mlib_ImageGetData(img); /* pointer to the data of img-image */
346 mlib_s32 img_height = mlib_ImageGetHeight(img); /* height of source image */
347 mlib_s32 img_width = mlib_ImageGetWidth(img) << 2; /* width of source image */
348 mlib_s32 img_stride = mlib_ImageGetStride(img); /* elements to next row */
349 mlib_s32 img_bitoff = mlib_ImageGetBitOffset(img); /* bits to first byte */
350 mlib_s32 i, j, b_j, k; /* indicies */
351 mlib_u8 bcolor0, bmask, emask, src;
352 mlib_d64 dcolor, *dpimg;
353 mlib_u32 color0 = color[0] & 1, color1 = color[1] & 1, color2 = color[2] & 1, color3 = color[3] & 1;
354
355 if (img_width == img_stride * 8) {
356 img_width *= img_height;
357 img_height = 1;
358 }
359
360 color0 = (color0 << 3) | (color1 << 2) | (color2 << 1) | color3;
361 color0 = (color0 << 4) | color0;
362 color3 = (color0 << 1) | (color0 >> 7);
363 color2 = (color0 << 2) | (color0 >> 6);
364 color1 = (color0 << 3) | (color0 >> 5);
365
366 bcolor0 = (img_bitoff & 2) ? ((img_bitoff & 1) ? color3 : color2) : ((img_bitoff & 1) ? color1 : color0);
367 color0 = (bcolor0 << 24) | (bcolor0 << 16) | (bcolor0 << 8) | bcolor0;
368
369 dcolor = vis_to_double_dup(color0);
370 for (i = 0, j = 0; i < img_height; i++) {
371 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end;
372
373 if (img_bitoff + img_width <= 8) {
374 bmask = (0xFF >> (8 - img_width)) << (8 - img_bitoff - img_width);
375 src = pimg_row[0];
376 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
377 continue;
378 }
379 else {
380 bmask = 0xFF >> img_bitoff;
381 src = pimg_row[0];
382 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
383 pimg_row++;
384 j = 8 - img_bitoff;
385 b_j = (img_width - j) / 8;
386 }
387
388 if (b_j < 16) {
389 mlib_s32 ii;
390
391 for (ii = 0; ii < b_j; ii++)
392 pimg_row[ii] = bcolor0;
393
394 pimg_row += ii;
395 j += ii << 3;
396
397 if (j < img_width) {
398 bmask = (0xFF << (8 - (img_width - j))) & 0xFF;
399 src = pimg_row[0];
400 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
401 }
402
403 continue;
404 }
405
406 pimg_row_end = pimg_row + b_j - 1;
407 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
408
409 emask = vis_edge8(pimg_row, pimg_row_end);
410 vis_pst_8(dcolor, dpimg++, emask);
411 k = (mlib_addr) dpimg - (mlib_addr) pimg_row;
412 for (; k < (b_j - 8); k += 8)
413 *dpimg++ = dcolor;
414 emask = vis_edge8(dpimg, pimg_row_end);
415 vis_pst_8(dcolor, dpimg, emask);
416 j += b_j << 3;
417
418 if (j < img_width) {
419 pimg_row = (mlib_u8 *) (pimg_row_end + 1);
420 bmask = (0xFF << (8 - (img_width - j))) & 0xFF;
421 src = pimg_row[0];
422 pimg_row[0] = (src & ~bmask) | (color0 & bmask);
423 }
424 }
425 }
426
427 /***************************************************************/
428
mlib_v_ImageClear_U8_1(mlib_image * img,const mlib_s32 * color)429 void mlib_v_ImageClear_U8_1(mlib_image *img,
430 const mlib_s32 *color)
431 {
432 mlib_u32 color0 = color[0] & 0xFF;
433
434 PREPAREVARS(mlib_u8, 1);
435
436 if (img_width < 16) {
437 STRIP(pimg, color, img_width, img_height, 1, mlib_u8);
438 return;
439 }
440
441 color0 |= (color0 << 8);
442 color0 |= (color0 << 16);
443 dcolor = vis_to_double_dup(color0);
444 for (i = 0; i < img_height; i++) {
445 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width - 1;
446
447 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
448 emask = vis_edge8(pimg_row, pimg_row_end);
449 vis_pst_8(dcolor, dpimg++, emask);
450 j = (mlib_addr) dpimg - (mlib_addr) pimg_row;
451 for (; j < (img_width - 8); j += 8)
452 *dpimg++ = dcolor;
453 emask = vis_edge8(dpimg, pimg_row_end);
454 vis_pst_8(dcolor, dpimg, emask);
455 }
456 }
457
458 /***************************************************************/
459
mlib_v_ImageClear_U8_2(mlib_image * img,const mlib_s32 * color)460 void mlib_v_ImageClear_U8_2(mlib_image *img,
461 const mlib_s32 *color)
462 {
463 mlib_u32 color0 = color[0] & 0xFF, color1 = color[1] & 0xFF;
464 mlib_d64 dcolor0;
465
466 PREPAREVARS(mlib_u8, 2);
467
468 if (img_width < 8) {
469 STRIP(pimg, color, img_width, img_height, 2, mlib_u8);
470 return;
471 }
472
473 color0 = (color0 << 8) | color1;
474 color0 |= (color0 << 16);
475 dcolor0 = vis_to_double_dup(color0);
476 for (i = 0; i < img_height; i++) {
477 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 2 - 1;
478
479 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
480 emask = vis_edge8(pimg_row, pimg_row_end);
481 dcolor = vis_faligndata(dcolor0, dcolor0);
482 vis_pst_8(dcolor, dpimg++, emask);
483 j = (mlib_addr) dpimg - (mlib_addr) pimg_row;
484 for (; j < (img_width * 2 - 8); j += 8)
485 *dpimg++ = dcolor;
486 emask = vis_edge8(dpimg, pimg_row_end);
487 vis_pst_8(dcolor, dpimg, emask);
488 }
489 }
490
491 /***************************************************************/
492
mlib_v_ImageClear_U8_3(mlib_image * img,const mlib_s32 * color)493 void mlib_v_ImageClear_U8_3(mlib_image *img,
494 const mlib_s32 *color)
495 {
496 mlib_u32 color0 = color[0] & 0xFF, color1 = color[1] & 0xFF, color2 = color[2] & 0xFF, col;
497 mlib_d64 dcolor1, dcolor2, dcolor00, dcolor11, dcolor22;
498
499 PREPAREVARS(mlib_u8, 3);
500
501 if (img_width < 16) {
502 STRIP(pimg, color, img_width, img_height, 3, mlib_u8);
503 return;
504 }
505
506 col = (color0 << 16) | (color1 << 8) | color2;
507 color0 = (col << 8) | color0;
508 color1 = (color0 << 8) | color1;
509 color2 = (color1 << 8) | color2;
510 dcolor = vis_to_double(color0, color1);
511 dcolor1 = vis_to_double(color2, color0);
512 dcolor2 = vis_to_double(color1, color2);
513 for (i = 0; i < img_height; i++) {
514 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 3 - 1;
515
516 dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7);
517 vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8);
518 dcolor22 = vis_faligndata(dcolor2, dcolor);
519 dcolor00 = vis_faligndata(dcolor, dcolor1);
520 dcolor11 = vis_faligndata(dcolor1, dcolor2);
521 emask = vis_edge8(pimg_row, pimg_row_end);
522
523 if ((mlib_addr) pimg_row & 7)
524 vis_pst_8(dcolor22, dpimg++, emask);
525 j = (mlib_addr) dpimg - (mlib_addr) pimg_row;
526 for (; j < (img_width * 3 - 24); j += 24) {
527 dpimg[0] = dcolor00;
528 dpimg[1] = dcolor11;
529 dpimg[2] = dcolor22;
530 dpimg += 3;
531 }
532
533 if (j < (img_width * 3 - 8)) {
534 *dpimg++ = dcolor00;
535
536 if (j < (img_width * 3 - 16)) {
537 *dpimg++ = dcolor11;
538 dcolor00 = dcolor22;
539 }
540 else
541 dcolor00 = dcolor11;
542 }
543
544 emask = vis_edge8(dpimg, pimg_row_end);
545 vis_pst_8(dcolor00, dpimg, emask);
546 }
547 }
548
549 /***************************************************************/
550
mlib_v_ImageClear_U8_4(mlib_image * img,const mlib_s32 * color)551 void mlib_v_ImageClear_U8_4(mlib_image *img,
552 const mlib_s32 *color)
553 {
554 mlib_u32 color0 = color[0] & 0xFF, color1 = color[1] & 0xFF, color2 = color[2] & 0xFF, color3 = color[3] & 0xFF;
555 mlib_d64 dcolor0;
556
557 PREPAREVARS(mlib_u8, 4);
558
559 if (img_width < 4) {
560 STRIP(pimg, color, img_width, img_height, 4, mlib_u8);
561 return;
562 }
563
564 color0 = (color0 << 24) | (color1 << 16) | (color2 << 8) | color3;
565 dcolor0 = vis_to_double_dup(color0);
566 for (i = 0; i < img_height; i++) {
567 mlib_u8 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 4 - 1;
568
569 dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7);
570 vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8);
571 emask = vis_edge8(pimg_row, pimg_row_end);
572 dcolor = vis_faligndata(dcolor0, dcolor0);
573 vis_pst_8(dcolor, dpimg++, emask);
574 j = (mlib_addr) dpimg - (mlib_addr) pimg_row;
575 for (; j < (img_width * 4 - 8); j += 8)
576 *dpimg++ = dcolor;
577 emask = vis_edge8(dpimg, pimg_row_end);
578 vis_pst_8(dcolor, dpimg, emask);
579 }
580 }
581
582 /***************************************************************/
583
mlib_v_ImageClear_S16_1(mlib_image * img,const mlib_s32 * color)584 void mlib_v_ImageClear_S16_1(mlib_image *img,
585 const mlib_s32 *color)
586 {
587 mlib_u32 color0 = color[0] & 0xFFFF;
588
589 PREPAREVARS(mlib_s16, 1);
590
591 if (img_width < 8) {
592 STRIP(pimg, color, img_width, img_height, 1, mlib_s16);
593 return;
594 }
595
596 color0 |= (color0 << 16);
597 dcolor = vis_to_double_dup(color0);
598 for (i = 0; i < img_height; i++) {
599 mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width - 1;
600
601 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
602 emask = vis_edge16(pimg_row, pimg_row_end);
603 vis_pst_16(dcolor, dpimg++, emask);
604 j = (mlib_s16 *) dpimg - pimg_row;
605 for (; j < (img_width - 4); j += 4)
606 *dpimg++ = dcolor;
607 emask = vis_edge16(dpimg, pimg_row_end);
608 vis_pst_16(dcolor, dpimg, emask);
609 }
610 }
611
612 /***************************************************************/
613
mlib_v_ImageClear_S16_2(mlib_image * img,const mlib_s32 * color)614 void mlib_v_ImageClear_S16_2(mlib_image *img,
615 const mlib_s32 *color)
616 {
617 mlib_u32 color0 = color[0] & 0xFFFF, color1 = color[1] & 0xFFFF;
618 mlib_d64 dcolor0;
619
620 PREPAREVARS(mlib_s16, 2);
621
622 if (img_width < 4) {
623 STRIP(pimg, color, img_width, img_height, 2, mlib_s16);
624 return;
625 }
626
627 color0 = (color0 << 16) | color1;
628 dcolor0 = vis_to_double_dup(color0);
629 for (i = 0; i < img_height; i++) {
630 mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 2 - 1;
631
632 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
633 emask = vis_edge16(pimg_row, pimg_row_end);
634 dcolor = vis_faligndata(dcolor0, dcolor0);
635 vis_pst_16(dcolor, dpimg++, emask);
636 j = (mlib_s16 *) dpimg - pimg_row;
637 for (; j < (img_width * 2 - 4); j += 4)
638 *dpimg++ = dcolor;
639 emask = vis_edge16(dpimg, pimg_row_end);
640 vis_pst_16(dcolor, dpimg, emask);
641 }
642 }
643
644 /***************************************************************/
645
mlib_v_ImageClear_S16_3(mlib_image * img,const mlib_s32 * color)646 void mlib_v_ImageClear_S16_3(mlib_image *img,
647 const mlib_s32 *color)
648 {
649 mlib_u32 color0 = color[0] & 0xFFFF, color1 = color[1] & 0xFFFF, color2 = color[2] & 0xFFFF, col0, col1, col2;
650 mlib_d64 dcolor1, dcolor2, dcolor00, dcolor11, dcolor22;
651
652 PREPAREVARS(mlib_s16, 3);
653
654 if (img_width < 8) {
655 STRIP(pimg, color, img_width, img_height, 3, mlib_s16);
656 return;
657 }
658
659 col0 = (color0 << 16) | color1;
660 col1 = (color2 << 16) | color0;
661 col2 = (color1 << 16) | color2;
662 dcolor = vis_to_double(col0, col1);
663 dcolor1 = vis_to_double(col2, col0);
664 dcolor2 = vis_to_double(col1, col2);
665 for (i = 0; i < img_height; i++) {
666 mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 3 - 1;
667
668 dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7);
669 vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8);
670 dcolor22 = vis_faligndata(dcolor2, dcolor);
671 dcolor00 = vis_faligndata(dcolor, dcolor1);
672 dcolor11 = vis_faligndata(dcolor1, dcolor2);
673 emask = vis_edge16(pimg_row, pimg_row_end);
674
675 if ((mlib_addr) pimg_row & 7)
676 vis_pst_16(dcolor22, dpimg++, emask);
677 j = (mlib_s16 *) dpimg - pimg_row;
678 for (; j < (img_width * 3 - 12); j += 12) {
679 dpimg[0] = dcolor00;
680 dpimg[1] = dcolor11;
681 dpimg[2] = dcolor22;
682 dpimg += 3;
683 }
684
685 if (j < (img_width * 3 - 4)) {
686 *dpimg++ = dcolor00;
687
688 if (j < (img_width * 3 - 8)) {
689 *dpimg++ = dcolor11;
690 dcolor00 = dcolor22;
691 }
692 else
693 dcolor00 = dcolor11;
694 }
695
696 emask = vis_edge16(dpimg, pimg_row_end);
697 vis_pst_16(dcolor00, dpimg, emask);
698 }
699 }
700
701 /***************************************************************/
702
mlib_v_ImageClear_S16_4(mlib_image * img,const mlib_s32 * color)703 void mlib_v_ImageClear_S16_4(mlib_image *img,
704 const mlib_s32 *color)
705 {
706 mlib_u32 color0 = color[0] & 0xFFFF, color1 = color[1] & 0xFFFF, color2 = color[2] & 0xFFFF, color3 = color[3] & 0xFFFF;
707 mlib_d64 dcolor0;
708
709 PREPAREVARS(mlib_s16, 4);
710
711 if (img_width < 2) {
712 STRIP(pimg, color, img_width, img_height, 4, mlib_s16);
713 return;
714 }
715
716 color0 = (color0 << 16) | color1;
717 color1 = (color2 << 16) | color3;
718 dcolor0 = vis_to_double(color0, color1);
719 for (i = 0; i < img_height; i++) {
720 mlib_s16 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 4 - 1;
721
722 dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7);
723 vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8);
724 emask = vis_edge16(pimg_row, pimg_row_end);
725 dcolor = vis_faligndata(dcolor0, dcolor0);
726 vis_pst_16(dcolor, dpimg++, emask);
727 j = (mlib_s16 *) dpimg - pimg_row;
728 for (; j < (img_width * 4 - 4); j += 4)
729 *dpimg++ = dcolor;
730 emask = vis_edge16(dpimg, pimg_row_end);
731 vis_pst_16(dcolor, dpimg, emask);
732 }
733 }
734
735 /***************************************************************/
736
mlib_v_ImageClear_S32_1(mlib_image * img,const mlib_s32 * color)737 void mlib_v_ImageClear_S32_1(mlib_image *img,
738 const mlib_s32 *color)
739 {
740 mlib_u32 color0 = color[0];
741
742 PREPAREVARS(mlib_s32, 1);
743
744 if (img_width < 4) {
745 STRIP(pimg, color, img_width, img_height, 1, mlib_s32);
746 return;
747 }
748
749 dcolor = vis_to_double_dup(color0);
750 for (i = 0; i < img_height; i++) {
751 mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width - 1;
752
753 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
754 emask = vis_edge32(pimg_row, pimg_row_end);
755 vis_pst_32(dcolor, dpimg++, emask);
756 j = (mlib_s32 *) dpimg - pimg_row;
757 for (; j <= (img_width - 2); j += 2)
758 *dpimg++ = dcolor;
759
760 if (j < img_width) {
761 emask = vis_edge32(dpimg, pimg_row_end);
762 vis_pst_32(dcolor, dpimg, emask);
763 }
764 }
765 }
766
767 /***************************************************************/
768
mlib_v_ImageClear_S32_2(mlib_image * img,const mlib_s32 * color)769 void mlib_v_ImageClear_S32_2(mlib_image *img,
770 const mlib_s32 *color)
771 {
772 mlib_u32 color0 = color[0], color1 = color[1];
773 mlib_d64 dcolor0;
774
775 PREPAREVARS(mlib_s32, 2);
776
777 if (img_width < 2) {
778 STRIP(pimg, color, img_width, img_height, 2, mlib_s32);
779 return;
780 }
781
782 dcolor0 = vis_to_double(color0, color1);
783 for (i = 0; i < img_height; i++) {
784 mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 2 - 1;
785
786 dpimg = (mlib_d64 *) vis_alignaddr(pimg_row, 0);
787 emask = vis_edge32(pimg_row, pimg_row_end);
788 dcolor = vis_faligndata(dcolor0, dcolor0);
789 vis_pst_32(dcolor, dpimg++, emask);
790 j = (mlib_s32 *) dpimg - pimg_row;
791 for (; j < (img_width * 2 - 2); j += 2)
792 *dpimg++ = dcolor;
793 emask = vis_edge32(dpimg, pimg_row_end);
794 vis_pst_32(dcolor, dpimg, emask);
795 }
796 }
797
798 /***************************************************************/
799
mlib_v_ImageClear_S32_3(mlib_image * img,const mlib_s32 * color)800 void mlib_v_ImageClear_S32_3(mlib_image *img,
801 const mlib_s32 *color)
802 {
803 mlib_u32 color0 = color[0], color1 = color[1], color2 = color[2];
804 mlib_d64 dcolor1, dcolor2, dcolor00, dcolor11, dcolor22;
805
806 PREPAREVARS(mlib_s32, 3);
807
808 if (img_width < 2) {
809 STRIP(pimg, color, img_width, img_height, 3, mlib_s32);
810 return;
811 }
812
813 dcolor = vis_to_double(color0, color1);
814 dcolor1 = vis_to_double(color2, color0);
815 dcolor2 = vis_to_double(color1, color2);
816 for (i = 0; i < img_height; i++) {
817 mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 3 - 1;
818
819 dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7);
820 vis_alignaddr((void *)(-(mlib_addr) pimg_row), 8);
821 dcolor22 = vis_faligndata(dcolor2, dcolor);
822 dcolor00 = vis_faligndata(dcolor, dcolor1);
823 dcolor11 = vis_faligndata(dcolor1, dcolor2);
824 emask = vis_edge32(pimg_row, pimg_row_end);
825
826 if ((mlib_addr) pimg_row & 7)
827 vis_pst_32(dcolor22, dpimg++, emask);
828 j = (mlib_s32 *) dpimg - pimg_row;
829 for (; j < (img_width * 3 - 6); j += 6) {
830 dpimg[0] = dcolor00;
831 dpimg[1] = dcolor11;
832 dpimg[2] = dcolor22;
833 dpimg += 3;
834 }
835
836 if (j < (img_width * 3 - 2)) {
837 *dpimg++ = dcolor00;
838
839 if (j < (img_width * 3 - 4)) {
840 *dpimg++ = dcolor11;
841 dcolor00 = dcolor22;
842 }
843 else
844 dcolor00 = dcolor11;
845 }
846
847 emask = vis_edge32(dpimg, pimg_row_end);
848 vis_pst_32(dcolor00, dpimg, emask);
849 }
850 }
851
852 /***************************************************************/
853
mlib_v_ImageClear_S32_4(mlib_image * img,const mlib_s32 * color)854 void mlib_v_ImageClear_S32_4(mlib_image *img,
855 const mlib_s32 *color)
856 {
857 mlib_u32 color0 = color[0], color1 = color[1], color2 = color[2], color3 = color[3];
858 mlib_d64 dcolor0, dcolor00, dcolor0_, dcolor00_, dcolor1;
859
860 PREPAREVARS(mlib_s32, 4);
861
862 if (img_width < 2) {
863 STRIP(pimg, color, img_width, img_height, 4, mlib_s32);
864 return;
865 }
866
867 dcolor0 = vis_to_double(color2, color3);
868 dcolor00 = vis_to_double(color0, color1);
869 vis_alignaddr((void *)0, 4);
870 dcolor0_ = vis_faligndata(dcolor0, dcolor00);
871 dcolor00_ = vis_faligndata(dcolor00, dcolor0);
872 for (i = 0; i < img_height; i++) {
873 mlib_s32 *pimg_row = pimg + i * img_stride, *pimg_row_end = pimg_row + img_width * 4 - 1;
874
875 dpimg = (mlib_d64 *) ((mlib_addr) pimg_row & ~7);
876 vis_alignaddr((void *)(-(mlib_addr) pimg_row), 4);
877 emask = vis_edge32(pimg_row, pimg_row_end);
878 dcolor = vis_faligndata(dcolor0_, dcolor00_);
879 dcolor1 = vis_faligndata(dcolor00_, dcolor0_);
880 vis_pst_32(dcolor, dpimg++, emask);
881 *dpimg++ = dcolor1;
882 j = (mlib_s32 *) dpimg - pimg_row;
883 for (; j <= (img_width * 4 - 4); j += 4) {
884 dpimg[0] = dcolor;
885 dpimg[1] = dcolor1;
886 dpimg += 2;
887 }
888
889 if (j < (img_width * 4)) {
890 emask = vis_edge32(dpimg, pimg_row_end);
891 vis_pst_32(dcolor, dpimg, emask);
892 }
893 }
894 }
895
896 /***************************************************************/
897