blob: d8e339c56c2911560b53a1ad465540202b4d5f73 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26/*
27 * FUNCTION
28 * mlib_ImageZoom - image scaling with edge condition
29 *
30 * SYNOPSIS
31 * mlib_status mlib_ImageZoom(mlib_image *dst,
32 * const mlib_image *src,
33 * mlib_f32 zoomx,
34 * mlib_f32 zoomy,
35 * mlib_filter filter,
36 * mlib_edge edge)
37 *
38 * ARGUMENTS
39 * dst Pointer to destination image
40 * src Pointer to source image
41 * zoomx X zoom factor.
42 * zoomy Y zoom factor.
43 * filter Type of resampling filter.
44 * edge Type of edge condition.
45 *
46 * DESCRIPTION
47 * The center of the source image is mapped to the center of the
48 * destination image.
49 *
50 * The upper-left corner pixel of an image is located at (0.5, 0.5).
51 *
52 * The resampling filter can be one of the following:
53 * MLIB_NEAREST
54 * MLIB_BILINEAR
55 * MLIB_BICUBIC
56 * MLIB_BICUBIC2
57 *
58 * The edge condition can be one of the following:
59 * MLIB_EDGE_DST_NO_WRITE (default)
60 * MLIB_EDGE_DST_FILL_ZERO
61 * MLIB_EDGE_OP_NEAREST
62 * MLIB_EDGE_SRC_EXTEND
63 * MLIB_EDGE_SRC_PADDED
64 */
65
66#include <mlib_image.h>
67#include <mlib_ImageZoom.h>
68
69#define MLIB_COPY_FUNC mlib_ImageCopy_na
70
71/***************************************************************/
72
73#ifdef i386 /* do not perform the coping by mlib_d64 data type for x86 */
74
75typedef struct {
76 mlib_s32 int0, int1;
77} two_int;
78
79#define TYPE_64 two_int
80
81#else /* i386 ( do not perform the coping by mlib_d64 data type for x86 ) */
82
83#define TYPE_64 mlib_d64
84
85#endif /* i386 ( do not perform the coping by mlib_d64 data type for x86 ) */
86
87/***************************************************************/
88
89typedef union {
90 TYPE_64 d64;
91 struct {
92 mlib_f32 f0, f1;
93 } f32s;
94} d64_2_f32;
95
96/***************************************************************/
97
98#define CLAMP_U8(X) ((X >= 256) ? (255) : ((X) &~ ((X) >> 31)))
99
100/***************************************************************/
101
102#ifdef _LITTLE_ENDIAN
103
104static const mlib_u32 mlib_bit_mask4[16] = {
105 0x00000000u, 0xFF000000u, 0x00FF0000u, 0xFFFF0000u,
106 0x0000FF00u, 0xFF00FF00u, 0x00FFFF00u, 0xFFFFFF00u,
107 0x000000FFu, 0xFF0000FFu, 0x00FF00FFu, 0xFFFF00FFu,
108 0x0000FFFFu, 0xFF00FFFFu, 0x00FFFFFFu, 0xFFFFFFFFu
109};
110
111#else /* _LITTLE_ENDIAN */
112
113static const mlib_u32 mlib_bit_mask4[16] = {
114 0x00000000u, 0x000000FFu, 0x0000FF00u, 0x0000FFFFu,
115 0x00FF0000u, 0x00FF00FFu, 0x00FFFF00u, 0x00FFFFFFu,
116 0xFF000000u, 0xFF0000FFu, 0xFF00FF00u, 0xFF00FFFFu,
117 0xFFFF0000u, 0xFFFF00FFu, 0xFFFFFF00u, 0xFFFFFFFFu
118};
119
120#endif /* _LITTLE_ENDIAN */
121
122/***************************************************************/
123
124#define VARIABLE(FORMAT) \
125 mlib_s32 j, \
126 dx = GetElemStruct(DX), \
127 dy = GetElemStruct(DY), \
128 x = GetElemSubStruct(current, srcX), \
129 y = GetElemSubStruct(current, srcY), \
130 src_stride = GetElemStruct(src_stride), \
131 dst_stride = GetElemStruct(dst_stride), \
132 width = GetElemSubStruct(current, width), \
133 height = GetElemSubStruct(current, height); \
134 FORMAT *sp = (FORMAT *)GetElemSubStruct(current, sp), \
135 *dp = (FORMAT *)GetElemSubStruct(current, dp)
136
137/***************************************************************/
138
139#define BUFF_SIZE 256
140#define BYTE_POS_MASK ((1 << (MLIB_SHIFT + 3)) - 1)
141
142/***************************************************************/
143
144mlib_status mlib_ImageZoom_BIT_1_Nearest(mlib_work_image *param,
145 mlib_s32 s_bitoff,
146 mlib_s32 d_bitoff)
147{
148 VARIABLE(mlib_u8);
149 mlib_s32 i;
150 mlib_s32 buff_loc[BUFF_SIZE], *buff = buff_loc;
151 mlib_s32 srcX = GetElemSubStruct(current, srcX);
152 mlib_s32 dstX = GetElemSubStruct(current, dstX);
153 mlib_u8 *sl = sp - (srcX >> MLIB_SHIFT), *dl = dp - dstX, *dt;
154 mlib_s32 bit, res, k, y_step = -1;
155 mlib_s32 num0, n_al, mask0, mask1;
156
157 srcX += (s_bitoff << MLIB_SHIFT);
158 dstX += d_bitoff;
159
160 num0 = 8 - (dstX & 7);
161
162 if (num0 > width)
163 num0 = width;
164 num0 &= 7;
165 mask0 = ((0xFF00 >> num0) & 0xFF) >> (dstX & 7);
166 n_al = width - num0;
167 mask1 = ((0xFF00 >> (n_al & 7)) & 0xFF);
168
169 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
170
171 if (n_al > BUFF_SIZE) {
172 buff = mlib_malloc(sizeof(mlib_s32) * n_al);
173
174 if (buff == NULL)
175 return MLIB_FAILURE;
176 }
177
178/* save shifts for bit extracting */
179 x = srcX + num0 * dx;
180#if 0
181#ifdef __SUNPRO_C
182#pragma pipeloop(0)
183#endif /* __SUNPRO_C */
184 for (i = 0; i < (n_al >> 3); i++) {
185 buff[8 * i] = (((x >> MLIB_SHIFT)) & 7) | (x & ~BYTE_POS_MASK);
186 x += dx;
187 buff[8 * i + 1] = (((x >> MLIB_SHIFT) - 1) & 7) | (x & ~BYTE_POS_MASK);
188 x += dx;
189 buff[8 * i + 2] = (((x >> MLIB_SHIFT) - 2) & 7) | (x & ~BYTE_POS_MASK);
190 x += dx;
191 buff[8 * i + 3] = (((x >> MLIB_SHIFT) - 3) & 7) | (x & ~BYTE_POS_MASK);
192 x += dx;
193 buff[8 * i + 4] = (((x >> MLIB_SHIFT) - 4) & 7) | (x & ~BYTE_POS_MASK);
194 x += dx;
195 buff[8 * i + 5] = (((x >> MLIB_SHIFT) - 5) & 7) | (x & ~BYTE_POS_MASK);
196 x += dx;
197 buff[8 * i + 6] = (((x >> MLIB_SHIFT) - 6) & 7) | (x & ~BYTE_POS_MASK);
198 x += dx;
199 buff[8 * i + 7] = (((x >> MLIB_SHIFT) - 7) & 7) | (x & ~BYTE_POS_MASK);
200 x += dx;
201 }
202
203 x_last = x;
204#else /* 0 */
205#ifdef __SUNPRO_C
206#pragma pipeloop(0)
207#endif /* __SUNPRO_C */
208 for (i = 0; i < (n_al >> 3); i++) {
209 buff[8 * i] = (((x >> MLIB_SHIFT)) & 7);
210 x += dx;
211 buff[8 * i + 1] = (((x >> MLIB_SHIFT) - 1) & 7);
212 x += dx;
213 buff[8 * i + 2] = (((x >> MLIB_SHIFT) - 2) & 7);
214 x += dx;
215 buff[8 * i + 3] = (((x >> MLIB_SHIFT) - 3) & 7);
216 x += dx;
217 buff[8 * i + 4] = (((x >> MLIB_SHIFT) - 4) & 7);
218 x += dx;
219 buff[8 * i + 5] = (((x >> MLIB_SHIFT) - 5) & 7);
220 x += dx;
221 buff[8 * i + 6] = (((x >> MLIB_SHIFT) - 6) & 7);
222 x += dx;
223 buff[8 * i + 7] = (((x >> MLIB_SHIFT) - 7) & 7);
224 x += dx;
225 }
226
227#endif /* 0 */
228
229 for (j = 0; j < height; j++) {
230
231 if (!y_step) {
232 dp = dl + (dstX >> 3);
233 dt = dp - dst_stride;
234
235 if (num0) {
236 dp[0] = (dp[0] & ~mask0) | (*dt++ & mask0);
237 dp++;
238 }
239
240#if 0
241 MLIB_COPY_FUNC(dt, dp, n_al >> 3);
242
243 if (n_al & 7) {
244 dp[n_al >> 3] = (dp[n_al >> 3] & ~mask1) | (dt[n_al >> 3] & mask1);
245 }
246
247#else /* 0 */
248#ifdef __SUNPRO_C
249#pragma pipeloop(0)
250#endif /* __SUNPRO_C */
251 for (i = 0; i < (n_al >> 3); i++) {
252 dp[i] = dt[i];
253 }
254
255 if (n_al & 7) {
256 dp[i] = (dp[i] & ~mask1) | (dt[i] & mask1);
257 }
258
259#endif /* 0 */
260 }
261 else {
262
263 x = srcX;
264 dp = dl + (dstX >> 3);
265
266 if (num0) {
267 mlib_s32 res = dp[0] & ~mask0;
268
269 for (k = dstX; k < (dstX + num0); k++) {
270 bit = 7 - (k & 7);
271 res |=
272 (((sl[x >> (MLIB_SHIFT + 3)] >> (7 - (x >> MLIB_SHIFT) & 7)) & 1) << bit);
273 x += dx;
274 }
275
276 *dp++ = res;
277 }
278
279#ifdef __SUNPRO_C
280#pragma pipeloop(0)
281#endif /* __SUNPRO_C */
282 for (i = 0; i < (n_al >> 3); i++) {
283#if 0
284 res = ((sl[buff[8 * i] >> (MLIB_SHIFT + 3)] << buff[8 * i]) & 0x8080);
285 res |= ((sl[buff[8 * i + 1] >> (MLIB_SHIFT + 3)] << buff[8 * i + 1]) & 0x4040);
286 res |= ((sl[buff[8 * i + 2] >> (MLIB_SHIFT + 3)] << buff[8 * i + 2]) & 0x2020);
287 res |= ((sl[buff[8 * i + 3] >> (MLIB_SHIFT + 3)] << buff[8 * i + 3]) & 0x1010);
288 res |= ((sl[buff[8 * i + 4] >> (MLIB_SHIFT + 3)] << buff[8 * i + 4]) & 0x0808);
289 res |= ((sl[buff[8 * i + 5] >> (MLIB_SHIFT + 3)] << buff[8 * i + 5]) & 0x0404);
290 res |= ((sl[buff[8 * i + 6] >> (MLIB_SHIFT + 3)] << buff[8 * i + 6]) & 0x0202);
291 res |= ((sl[buff[8 * i + 7] >> (MLIB_SHIFT + 3)] << buff[8 * i + 7]) & 0x0101);
292#else /* 0 */
293 res = ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i]) & 0x8080);
294 x += dx;
295 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 1]) & 0x4040);
296 x += dx;
297 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 2]) & 0x2020);
298 x += dx;
299 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 3]) & 0x1010);
300 x += dx;
301 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 4]) & 0x0808);
302 x += dx;
303 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 5]) & 0x0404);
304 x += dx;
305 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 6]) & 0x0202);
306 x += dx;
307 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 7]) & 0x0101);
308 x += dx;
309#endif /* 0 */
310 dp[i] = res | (res >> 8);
311 }
312
313 if (mask1) {
314 mlib_s32 res = dp[i] & ~mask1;
315
316 for (k = 0; k < (n_al & 7); k++) {
317 bit = 7 - (k & 7);
318 res |=
319 (((sl[x >> (MLIB_SHIFT + 3)] >> (7 - (x >> MLIB_SHIFT) & 7)) & 1) << bit);
320 x += dx;
321 }
322
323 dp[i] = res;
324 }
325 }
326
327 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
328 y += dy;
329
330 dl = (void *)((mlib_u8 *) dl + dst_stride);
331 sl = (void *)((mlib_u8 *) sl + y_step * src_stride);
332 }
333
334 if (buff != buff_loc)
335 mlib_free(buff);
336 return MLIB_SUCCESS;
337}
338
339/***************************************************************/
340
341#ifdef _NO_LONGLONG
342
343typedef struct {
344#ifdef _LITTLE_ENDIAN
345 mlib_u32 uint1, uint0;
346#else /* _LITTLE_ENDIAN */
347 mlib_u32 uint0, uint1;
348#endif /* _LITTLE_ENDIAN */
349} two_uint;
350
351/***************************************************************/
352
353#define DTYPE two_uint
354#define MASK(dst) (dst).uint0 = (dst).uint1 = -1
355
356/***************************************************************/
357
358#define RSHIFT(dst, src, rshift) { \
359 DTYPE tmp = (src); \
360 if ((rshift) >= 32) { \
361 tmp.uint1 = tmp.uint0 >> ((rshift) - 32); \
362 tmp.uint0 = 0; \
363 } \
364 else { \
365 tmp.uint1 = (tmp.uint1 >> (rshift)) | (tmp.uint0 << (32 - (rshift))); \
366 tmp.uint0 = tmp.uint0 >> (rshift); \
367 } \
368 (dst) = tmp; \
369}
370
371/***************************************************************/
372
373#define LSHIFT(dst, src, lshift) { \
374 DTYPE tmp = (src); \
375 if ((lshift) >= 32) { \
376 tmp.uint0 = tmp.uint1 << ((lshift) - 32); \
377 tmp.uint1 = 0; \
378 } \
379 else { \
380 tmp.uint0 = (tmp.uint0 << (lshift)) | (tmp.uint1 >> (32 - (lshift))); \
381 tmp.uint1 = tmp.uint1 << (lshift); \
382 } \
383 (dst) = tmp; \
384}
385
386/***************************************************************/
387
388#define LOGIC(dst, src1, src2, OPERATION) { \
389 DTYPE tmp; \
390 ((tmp).uint0 = (src1).uint0 OPERATION (src2).uint0); \
391 ((tmp).uint1 = (src1).uint1 OPERATION (src2).uint1); \
392 (dst) = tmp; \
393}
394
395#else /* _NO_LONGLONG */
396
397/***************************************************************/
398
399#define DTYPE mlib_u64
400#define MASK(dst) (dst) = ((mlib_u64)((mlib_s64) -1))
401
402#define RSHIFT(dst, src, rshift) (dst) = ((src) >> (rshift))
403
404#define LSHIFT(dst, src, lshift) (dst) = ((src) << (lshift))
405
406#define LOGIC(dst, src1, src2, OPERATION) (dst) = ((src1) OPERATION (src2))
407
408#endif /* _NO_LONGLONG */
409
410/***************************************************************/
411
412mlib_status mlib_ImageZoom_BitToGray_1_Nearest(mlib_work_image *param,
413 mlib_s32 s_bitoff,
414 const mlib_s32 *ghigh,
415 const mlib_s32 *glow)
416{
417 VARIABLE(mlib_u8);
418 mlib_s32 i;
419 DTYPE gray_mask[256], dd, dd_old, *da, dtmp, dtmp1;
420 mlib_u32 *pgray = (mlib_u32 *) gray_mask;
421 mlib_u8 buff_loc[2 * BUFF_SIZE], *buff = buff_loc;
422 mlib_u8 *sl, *dl, gray_val[2];
423 mlib_s32 srcX = GetElemSubStruct(current, srcX);
424 mlib_u32 gray_val0, gray_val1;
425 mlib_s32 width8, res, y_step = -1;
426 mlib_s32 k;
427
428 sl = sp - (srcX >> MLIB_SHIFT);
429 dl = dp;
430 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
431 srcX += (s_bitoff << MLIB_SHIFT);
432
433 width8 = width / 8;
434
435 if (width8 > 2 * BUFF_SIZE) {
436 buff = mlib_malloc(width8 * sizeof(mlib_u8));
437
438 if (buff == NULL)
439 return MLIB_FAILURE;
440 }
441
442/* save shifts for bit extracting */
443 x = srcX;
444#ifdef __SUNPRO_C
445#pragma pipeloop(0)
446#endif /* __SUNPRO_C */
447 for (i = 0; i < width8; i++) {
448 buff[8 * i] = (((x >> MLIB_SHIFT)) & 7);
449 x += dx;
450 buff[8 * i + 1] = (((x >> MLIB_SHIFT) - 1) & 7);
451 x += dx;
452 buff[8 * i + 2] = (((x >> MLIB_SHIFT) - 2) & 7);
453 x += dx;
454 buff[8 * i + 3] = (((x >> MLIB_SHIFT) - 3) & 7);
455 x += dx;
456 buff[8 * i + 4] = (((x >> MLIB_SHIFT) - 4) & 7);
457 x += dx;
458 buff[8 * i + 5] = (((x >> MLIB_SHIFT) - 5) & 7);
459 x += dx;
460 buff[8 * i + 6] = (((x >> MLIB_SHIFT) - 6) & 7);
461 x += dx;
462 buff[8 * i + 7] = (((x >> MLIB_SHIFT) - 7) & 7);
463 x += dx;
464 }
465
466/* calculate lookup table */
467 gray_val0 = CLAMP_U8(glow[0]);
468 gray_val1 = CLAMP_U8(ghigh[0]);
469 gray_val[0] = gray_val0;
470 gray_val[1] = gray_val1;
471 gray_val0 |= (gray_val0 << 8);
472 gray_val0 |= (gray_val0 << 16);
473 gray_val1 |= (gray_val1 << 8);
474 gray_val1 |= (gray_val1 << 16);
475
476 for (i = 0; i < 16; i++) {
477 mlib_u32 v, mask = mlib_bit_mask4[i];
478
479 v = (gray_val0 & ~mask) | (gray_val1 & mask);
480
481#ifdef __SUNPRO_C
482#pragma pipeloop(0)
483#endif /* __SUNPRO_C */
484 for (j = 0; j < 16; j++) {
485 pgray[2 * (16 * i + j)] = v;
486 }
487
488#ifdef __SUNPRO_C
489#pragma pipeloop(0)
490#endif /* __SUNPRO_C */
491 for (j = 0; j < 16; j++) {
492 pgray[2 * (i + 16 * j) + 1] = v;
493 }
494 }
495
496 for (j = 0; j < height; j++) {
497
498 if (!y_step) {
499 MLIB_COPY_FUNC((mlib_u8 *) dl - dst_stride, dl, width);
500 }
501 else {
502 mlib_s32 off = (mlib_addr) dl & 7;
503
504 da = (DTYPE *) (dl - off);
505 x = srcX;
506
507 if (off) { /* not aligned */
508 DTYPE mask;
509 MASK(mask);
510 off *= 8;
511#ifdef _LITTLE_ENDIAN
512 LSHIFT(dd_old, da[0], 64 - off);
513#else /* _LITTLE_ENDIAN */
514 RSHIFT(dd_old, da[0], 64 - off);
515#endif /* _LITTLE_ENDIAN */
516
517#ifdef __SUNPRO_C
518#pragma pipeloop(0)
519#endif /* __SUNPRO_C */
520 for (i = 0; i < (width / 8); i++) {
521 res = ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i]) & 0x8080);
522 x += dx;
523 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 1]) & 0x4040);
524 x += dx;
525 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 2]) & 0x2020);
526 x += dx;
527 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 3]) & 0x1010);
528 x += dx;
529 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 4]) & 0x0808);
530 x += dx;
531 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 5]) & 0x0404);
532 x += dx;
533 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 6]) & 0x0202);
534 x += dx;
535 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 7]) & 0x0101);
536 x += dx;
537
538 res = (res & 0xff) | (res >> 8);
539 dd = gray_mask[res];
540#ifdef _LITTLE_ENDIAN
541/* *da++ = (dd_old >> (64 - off)) | (dd << off);*/
542 RSHIFT(dd_old, dd_old, 64 - off);
543 LSHIFT(dtmp, dd, off);
544#else /* _LITTLE_ENDIAN */
545/* *da++ = (dd_old << (64 - off)) | (dd >> off);*/
546 LSHIFT(dd_old, dd_old, 64 - off);
547 RSHIFT(dtmp, dd, off);
548#endif /* _LITTLE_ENDIAN */
549 LOGIC(*da++, dd_old, dtmp, |);
550 dd_old = dd;
551 }
552
553#ifdef _LITTLE_ENDIAN
554/* da[0] = (dd_old >> (64 - off)) | (da[0] & ((mlib_u64)((mlib_s64) -1) << off));*/
555 LSHIFT(dtmp, mask, off);
556 LOGIC(dtmp, da[0], dtmp, &);
557 RSHIFT(dtmp1, dd_old, 64 - off);
558#else /* _LITTLE_ENDIAN */
559/* da[0] = (dd_old << (64 - off)) | (da[0] & ((mlib_u64)((mlib_s64) -1) >> off));*/
560 RSHIFT(dtmp, mask, off);
561 LOGIC(dtmp, da[0], dtmp, &);
562 LSHIFT(dtmp1, dd_old, 64 - off);
563#endif /* _LITTLE_ENDIAN */
564 LOGIC(da[0], dtmp, dtmp1, |);
565 }
566 else { /* aligned */
567
568#ifdef __SUNPRO_C
569#pragma pipeloop(0)
570#endif /* __SUNPRO_C */
571 for (i = 0; i < (width / 8); i++) {
572 res = ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i]) & 0x8080);
573 x += dx;
574 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 1]) & 0x4040);
575 x += dx;
576 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 2]) & 0x2020);
577 x += dx;
578 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 3]) & 0x1010);
579 x += dx;
580 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 4]) & 0x0808);
581 x += dx;
582 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 5]) & 0x0404);
583 x += dx;
584 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 6]) & 0x0202);
585 x += dx;
586 res |= ((sl[x >> (MLIB_SHIFT + 3)] << buff[8 * i + 7]) & 0x0101);
587 x += dx;
588
589 res = (res & 0xff) | (res >> 8);
590 *da++ = gray_mask[res];
591 }
592 }
593
594 if (width & 7) {
595 dp = dl + (width & ~7);
596
597 for (k = 0; k < (width & 7); k++) {
598 dp[k] =
599 gray_val[(sl[x >> (MLIB_SHIFT + 3)] >> (7 - (x >> MLIB_SHIFT) & 7)) & 1];
600 x += dx;
601 }
602 }
603 }
604
605 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
606 y += dy;
607
608 dl += dst_stride;
609 sl += y_step * src_stride;
610 }
611
612 if (buff != buff_loc)
613 mlib_free(buff);
614 return MLIB_SUCCESS;
615}
616
617/***************************************************************/
618
619mlib_status mlib_ImageZoom_U8_2_Nearest(mlib_work_image *param)
620{
621 VARIABLE(mlib_u8);
622 mlib_s32 i;
623 mlib_u8 *tdp, *tsp, tmp0, tmp1;
624 mlib_s32 cx, y_step = -1;
625
626 tsp = sp;
627 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
628
629 for (j = 0; j < height; j++) {
630
631 if (!y_step) {
632 MLIB_COPY_FUNC((mlib_u8 *) dp - dst_stride, dp, 2 * width);
633 }
634 else {
635 tdp = dp;
636 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
637 cx = (x >> (MLIB_SHIFT - 1)) & ~1;
638 tmp0 = tsp[cx];
639 tmp1 = tsp[cx + 1];
640
641#ifdef __SUNPRO_C
642#pragma pipeloop(0)
643#endif /* __SUNPRO_C */
644 for (i = 0; i < width - 1; i++, tdp += 2) {
645 tdp[0] = tmp0;
646 tdp[1] = tmp1;
647 x += dx;
648 cx = (x >> (MLIB_SHIFT - 1)) & ~1;
649 tmp0 = tsp[cx];
650 tmp1 = tsp[cx + 1];
651 }
652
653 tdp[0] = tmp0;
654 tdp[1] = tmp1;
655 }
656
657 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
658 y += dy;
659
660 dp = (void *)((mlib_u8 *) dp + dst_stride);
661 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
662 }
663
664 return MLIB_SUCCESS;
665}
666
667/***************************************************************/
668
669mlib_status mlib_ImageZoom_U8_4_Nearest(mlib_work_image *param)
670{
671 VARIABLE(mlib_u8);
672 mlib_s32 i;
673 mlib_u8 *tdp, *tsp, tmp0, tmp1, tmp2, tmp3;
674 mlib_u16 utmp0, utmp1;
675 mlib_s32 cx, y_step = -1;
676
677 tsp = sp;
678 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
679
680 for (j = 0; j < height; j++) {
681
682 if (!y_step) {
683 MLIB_COPY_FUNC((mlib_u8 *) dp - dst_stride, dp, 4 * width);
684 }
685 else {
686 tdp = dp;
687 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
688
689 if (((mlib_addr) tdp | (mlib_addr) tsp) & 1) { /* sp & dp pointers not aligned */
690
691 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
692 tmp0 = tsp[cx];
693 tmp1 = tsp[cx + 1];
694 tmp2 = tsp[cx + 2];
695 tmp3 = tsp[cx + 3];
696
697#ifdef __SUNPRO_C
698#pragma pipeloop(0)
699#endif /* __SUNPRO_C */
700 for (i = 0; i < width - 1; i++) {
701 tdp[0] = tmp0;
702 tdp[1] = tmp1;
703 tdp[2] = tmp2;
704 tdp[3] = tmp3;
705
706 x += dx;
707 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
708
709 tmp0 = tsp[cx];
710 tmp1 = tsp[cx + 1];
711 tmp2 = tsp[cx + 2];
712 tmp3 = tsp[cx + 3];
713
714 tdp += 4;
715 }
716
717 tdp[0] = tmp0;
718 tdp[1] = tmp1;
719 tdp[2] = tmp2;
720 tdp[3] = tmp3;
721 }
722 else {
723
724 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
725 utmp0 = *(mlib_u16 *) (tsp + cx);
726 utmp1 = *(mlib_u16 *) (tsp + cx + 2);
727
728#ifdef __SUNPRO_C
729#pragma pipeloop(0)
730#endif /* __SUNPRO_C */
731 for (i = 0; i < width - 1; i++) {
732 *(mlib_u16 *) tdp = utmp0;
733 *(mlib_u16 *) (tdp + 2) = utmp1;
734
735 x += dx;
736 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
737
738 utmp0 = *(mlib_u16 *) (tsp + cx);
739 utmp1 = *(mlib_u16 *) (tsp + cx + 2);
740
741 tdp += 4;
742 }
743
744 *(mlib_u16 *) tdp = utmp0;
745 *(mlib_u16 *) (tdp + 2) = utmp1;
746 }
747 }
748
749 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
750 y += dy;
751
752 dp = (void *)((mlib_u8 *) dp + dst_stride);
753 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
754 }
755
756 return MLIB_SUCCESS;
757}
758
759/***************************************************************/
760
761mlib_status mlib_ImageZoom_S16_2_Nearest(mlib_work_image *param)
762{
763 VARIABLE(mlib_u16);
764 mlib_s32 i;
765 mlib_u8 *tsp, *tdp;
766 mlib_u16 tmp0, tmp1;
767 mlib_s32 cx, y_step = -1;
768 mlib_u32 utmp;
769
770 tsp = (mlib_u8 *) sp;
771 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
772
773 for (j = 0; j < height; j++) {
774
775 if (!y_step) {
776 MLIB_COPY_FUNC((mlib_u8 *) dp - dst_stride, (void *)dp, 4 * width);
777 }
778 else {
779 tdp = (mlib_u8 *) dp;
780 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
781
782 if (((mlib_addr) tdp | (mlib_addr) tsp) & 3) { /* sp & dp pointers not aligned */
783
784 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
785 tmp0 = *(mlib_u16 *) (tsp + cx);
786 tmp1 = *(mlib_u16 *) (tsp + cx + 2);
787
788#ifdef __SUNPRO_C
789#pragma pipeloop(0)
790#endif /* __SUNPRO_C */
791 for (i = 0; i < width - 1; i++, tdp += 4) {
792
793 *(mlib_u16 *) tdp = tmp0;
794 *(mlib_u16 *) (tdp + 2) = tmp1;
795
796 x += dx;
797 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
798
799 tmp0 = *(mlib_u16 *) (tsp + cx);
800 tmp1 = *(mlib_u16 *) (tsp + cx + 2);
801 }
802
803 *(mlib_u16 *) tdp = tmp0;
804 *(mlib_u16 *) (tdp + 2) = tmp1;
805 }
806 else {
807
808 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
809 utmp = *(mlib_u32 *) (tsp + cx);
810
811#ifdef __SUNPRO_C
812#pragma pipeloop(0)
813#endif /* __SUNPRO_C */
814 for (i = 0; i < width - 1; i++, tdp += 4) {
815
816 *(mlib_u32 *) tdp = utmp;
817 x += dx;
818 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
819
820 utmp = *(mlib_u32 *) (tsp + cx);
821 }
822
823 *(mlib_u32 *) tdp = utmp;
824 }
825 }
826
827 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
828 y += dy;
829
830 dp = (void *)((mlib_u8 *) dp + dst_stride);
831 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
832 }
833
834 return MLIB_SUCCESS;
835}
836
837/***************************************************************/
838
839mlib_status mlib_ImageZoom_S16_4_Nearest(mlib_work_image *param)
840{
841 VARIABLE(mlib_u16);
842 mlib_s32 i;
843 mlib_u8 *tsp, *tdp;
844 mlib_s32 cx, y_step = -1;
845 mlib_u16 tmp0, tmp1, tmp2, tmp3;
846 TYPE_64 dtmp;
847 mlib_f32 ftmp0, ftmp1;
848
849 tsp = (mlib_u8 *) sp;
850 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
851
852 for (j = 0; j < height; j++) {
853
854 if (!y_step) {
855 MLIB_COPY_FUNC((mlib_u8 *) dp - dst_stride, (void *)dp, 8 * width);
856 }
857 else {
858 tdp = (mlib_u8 *) dp;
859 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
860
861 if (((mlib_addr) tdp | (mlib_addr) tsp) & 7) {
862 if (((mlib_addr) tdp | (mlib_addr) tsp) & 3) {
863
864 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
865 tmp0 = *(mlib_u16 *) (tsp + cx);
866 tmp1 = *(mlib_u16 *) (tsp + cx + 2);
867
868#ifdef __SUNPRO_C
869#pragma pipeloop(0)
870#endif /* __SUNPRO_C */
871 for (i = 0; i < width - 1; i++) {
872
873 tmp2 = *(mlib_u16 *) (tsp + cx + 4);
874 tmp3 = *(mlib_u16 *) (tsp + cx + 6);
875
876 *(mlib_u16 *) tdp = tmp0;
877 *(mlib_u16 *) (tdp + 2) = tmp1;
878 *(mlib_u16 *) (tdp + 4) = tmp2;
879 *(mlib_u16 *) (tdp + 6) = tmp3;
880
881 x += dx;
882 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
883
884 tmp0 = *(mlib_u16 *) (tsp + cx);
885 tmp1 = *(mlib_u16 *) (tsp + cx + 2);
886
887 tdp += 8;
888 }
889
890 tmp2 = *(mlib_u16 *) (tsp + cx + 4);
891 tmp3 = *(mlib_u16 *) (tsp + cx + 6);
892
893 *(mlib_u16 *) tdp = tmp0;
894 *(mlib_u16 *) (tdp + 2) = tmp1;
895 *(mlib_u16 *) (tdp + 4) = tmp2;
896 *(mlib_u16 *) (tdp + 6) = tmp3;
897 }
898 else { /* align to word */
899
900 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
901 ftmp0 = *(mlib_f32 *) (tsp + cx);
902 ftmp1 = *(mlib_f32 *) (tsp + cx + 4);
903
904#ifdef __SUNPRO_C
905#pragma pipeloop(0)
906#endif /* __SUNPRO_C */
907 for (i = 0; i < width - 1; i++) {
908
909 *(mlib_f32 *) tdp = ftmp0;
910 *(mlib_f32 *) (tdp + 4) = ftmp1;
911
912 x += dx;
913 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
914
915 ftmp0 = *(mlib_f32 *) (tsp + cx);
916 ftmp1 = *(mlib_f32 *) (tsp + cx + 4);
917
918 tdp += 8;
919 }
920
921 *(mlib_f32 *) tdp = ftmp0;
922 *(mlib_f32 *) (tdp + 4) = ftmp1;
923 }
924 }
925 else { /* align to mlib_d64 word */
926
927 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
928 dtmp = *(TYPE_64 *) (tsp + cx);
929
930#ifdef __SUNPRO_C
931#pragma pipeloop(0)
932#endif /* __SUNPRO_C */
933 for (i = 0; i < width - 1; i++) {
934
935 *(TYPE_64 *) tdp = dtmp;
936
937 x += dx;
938 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
939
940 dtmp = *(TYPE_64 *) (tsp + cx);
941
942 tdp += 8;
943 }
944
945 *(TYPE_64 *) tdp = dtmp;
946 }
947 }
948
949 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
950 y += dy;
951
952 dp = (void *)((mlib_u8 *) dp + dst_stride);
953 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
954 }
955
956 return MLIB_SUCCESS;
957}
958
959/***************************************************************/
960
961mlib_status mlib_ImageZoom_S32_1_Nearest(mlib_work_image *param)
962{
963 VARIABLE(mlib_s32);
964 mlib_s32 *dl = dp, *tsp;
965 mlib_s32 y_step = -1;
966
967 tsp = sp;
968 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
969
970 for (j = 0; j < height; j++) {
971
972 if (!y_step) {
973 MLIB_COPY_FUNC((mlib_u8 *) dl - dst_stride, (void *)dl, 4 * width);
974 }
975 else {
976 mlib_s32 *dp = dl, *dend = dl + width;
977
978 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
979
980 if ((mlib_addr) dp & 7) {
981 *dp++ = tsp[x >> MLIB_SHIFT];
982 x += dx;
983 }
984
985#ifdef __SUNPRO_C
986#pragma pipeloop(0)
987#endif /* __SUNPRO_C */
988 for (; dp <= dend - 2; dp += 2) {
989 d64_2_f32 dd;
990 dd.f32s.f0 = *(mlib_f32 *) ((mlib_u8 *) tsp + ((x >> (MLIB_SHIFT - 2)) & ~3));
991 x += dx;
992 dd.f32s.f1 = *(mlib_f32 *) ((mlib_u8 *) tsp + ((x >> (MLIB_SHIFT - 2)) & ~3));
993 x += dx;
994 *(TYPE_64 *) dp = dd.d64;
995 }
996
997 if (dp < dend) {
998 *dp++ = tsp[x >> MLIB_SHIFT];
999 }
1000 }
1001
1002 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1003 y += dy;
1004
1005 dl = (void *)((mlib_u8 *) dl + dst_stride);
1006 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1007 }
1008
1009 return MLIB_SUCCESS;
1010}
1011
1012/***************************************************************/
1013
1014mlib_status mlib_ImageZoom_S32_2_Nearest(mlib_work_image *param)
1015{
1016 VARIABLE(mlib_s32);
1017 mlib_s32 i;
1018 mlib_u8 *tsp;
1019 mlib_s32 cx, y_step = -1, tmp0, tmp1, tmp2, tmp3, x_max;
1020 TYPE_64 dtmp0;
1021
1022 tsp = (mlib_u8 *) sp;
1023 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
1024
1025 x_max = (param->sline_size) << MLIB_SHIFT;
1026
1027 for (j = 0; j < height; j++) {
1028
1029 if (!y_step) {
1030 MLIB_COPY_FUNC((mlib_u8 *) dp - dst_stride, (void *)dp, 8 * width);
1031 }
1032 else {
1033 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
1034
1035 if (!(((mlib_addr) dp | (mlib_addr) tsp) & 7)) {
1036
1037#ifdef __SUNPRO_C
1038#pragma pipeloop(0)
1039#endif /* __SUNPRO_C */
1040 for (i = 0; i < width; i++) {
1041 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
1042 x += dx;
1043 dtmp0 = *(TYPE_64 *) (tsp + cx);
1044 ((TYPE_64 *) dp)[i] = dtmp0;
1045 }
1046 }
1047 else {
1048
1049 cx = (x >> (MLIB_SHIFT - 3)) & ~7;
1050 x += dx;
1051 tmp0 = *(mlib_s32 *) (tsp + cx);
1052 tmp1 = *(mlib_s32 *) (tsp + cx + 4);
1053 cx = ((x >> (MLIB_SHIFT - 3)) & ~7) & ((x - x_max) >> 31);
1054 x += dx;
1055 tmp2 = *(mlib_s32 *) (tsp + cx);
1056 tmp3 = *(mlib_s32 *) (tsp + cx + 4);
1057
1058#ifdef __SUNPRO_C
1059#pragma pipeloop(0)
1060#endif /* __SUNPRO_C */
1061 for (i = 0; i <= width - 2; i += 2) {
1062 dp[2 * i] = tmp0;
1063 dp[2 * i + 1] = tmp1;
1064 dp[2 * i + 2] = tmp2;
1065 dp[2 * i + 3] = tmp3;
1066
1067 cx = ((x >> (MLIB_SHIFT - 3)) & ~7) & ((x - x_max) >> 31);
1068 x += dx;
1069 tmp0 = *(mlib_s32 *) (tsp + cx);
1070 tmp1 = *(mlib_s32 *) (tsp + cx + 4);
1071 cx = ((x >> (MLIB_SHIFT - 3)) & ~7) & ((x - x_max) >> 31);
1072 x += dx;
1073 tmp2 = *(mlib_s32 *) (tsp + cx);
1074 tmp3 = *(mlib_s32 *) (tsp + cx + 4);
1075 }
1076
1077 if (width & 1) {
1078 dp[2 * i] = tmp0;
1079 dp[2 * i + 1] = tmp1;
1080 }
1081 }
1082 }
1083
1084 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1085 y += dy;
1086
1087 dp = (void *)((mlib_u8 *) dp + dst_stride);
1088 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1089 }
1090
1091 return MLIB_SUCCESS;
1092}
1093
1094/***************************************************************/
1095
1096mlib_status mlib_ImageZoom_S32_3_Nearest(mlib_work_image *param)
1097{
1098 VARIABLE(mlib_s32);
1099 mlib_s32 i;
1100 mlib_u8 *tsp;
1101 mlib_s32 cx, y_step = -1, tmp0, tmp1, tmp2;
1102
1103 tsp = (mlib_u8 *) sp;
1104 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
1105
1106 for (j = 0; j < height; j++) {
1107
1108 if (!y_step) {
1109 MLIB_COPY_FUNC((mlib_u8 *) dp - dst_stride, (void *)dp, 12 * width);
1110 }
1111 else {
1112 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
1113
1114 cx = (x >> MLIB_SHIFT) * 12;
1115 x += dx;
1116 tmp0 = *(mlib_s32 *) (tsp + cx);
1117 tmp1 = *(mlib_s32 *) (tsp + cx + 4);
1118 tmp2 = *(mlib_s32 *) (tsp + cx + 8);
1119
1120 cx = (x >> MLIB_SHIFT) * 12;
1121 x += dx;
1122
1123#ifdef __SUNPRO_C
1124#pragma pipeloop(0)
1125#endif /* __SUNPRO_C */
1126 for (i = 0; i < width - 1; i++) {
1127 dp[3 * i + 0] = tmp0;
1128 dp[3 * i + 1] = tmp1;
1129 dp[3 * i + 2] = tmp2;
1130
1131 tmp0 = *(mlib_s32 *) (tsp + cx);
1132 tmp1 = *(mlib_s32 *) (tsp + cx + 4);
1133 tmp2 = *(mlib_s32 *) (tsp + cx + 8);
1134
1135 cx = (x >> MLIB_SHIFT) * 12;
1136 x += dx;
1137 }
1138
1139 dp[3 * i + 0] = tmp0;
1140 dp[3 * i + 1] = tmp1;
1141 dp[3 * i + 2] = tmp2;
1142 }
1143
1144 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1145 y += dy;
1146
1147 dp = (void *)((mlib_u8 *) dp + dst_stride);
1148 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1149 }
1150
1151 return MLIB_SUCCESS;
1152}
1153
1154/***************************************************************/
1155
1156mlib_status mlib_ImageZoom_S32_4_Nearest(mlib_work_image *param)
1157{
1158 VARIABLE(mlib_s32);
1159 mlib_s32 i;
1160 mlib_u8 *tsp;
1161 mlib_s32 cx, y_step = -1, tmp0, tmp1, tmp2, tmp3;
1162 TYPE_64 dtmp0, dtmp1;
1163
1164 tsp = (mlib_u8 *) sp;
1165 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
1166
1167 for (j = 0; j < height; j++) {
1168
1169 if (!y_step) {
1170 MLIB_COPY_FUNC((mlib_u8 *) dp - dst_stride, (void *)dp, 16 * width);
1171 }
1172 else {
1173 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
1174
1175 if (((mlib_addr) dp | (mlib_addr) tsp) & 7) {
1176 cx = (x >> (MLIB_SHIFT - 4)) & ~15;
1177 x += dx;
1178
1179 tmp0 = *(mlib_s32 *) (tsp + cx);
1180 tmp1 = *(mlib_s32 *) (tsp + cx + 4);
1181 tmp2 = *(mlib_s32 *) (tsp + cx + 8);
1182 tmp3 = *(mlib_s32 *) (tsp + cx + 12);
1183
1184 cx = (x >> (MLIB_SHIFT - 4)) & ~15;
1185 x += dx;
1186
1187#ifdef __SUNPRO_C
1188#pragma pipeloop(0)
1189#endif /* __SUNPRO_C */
1190 for (i = 0; i < width - 1; i++) {
1191 dp[4 * i + 0] = tmp0;
1192 dp[4 * i + 1] = tmp1;
1193 dp[4 * i + 2] = tmp2;
1194 dp[4 * i + 3] = tmp3;
1195
1196 tmp0 = *(mlib_s32 *) (tsp + cx);
1197 tmp1 = *(mlib_s32 *) (tsp + cx + 4);
1198 tmp2 = *(mlib_s32 *) (tsp + cx + 8);
1199 tmp3 = *(mlib_s32 *) (tsp + cx + 12);
1200
1201 cx = (x >> (MLIB_SHIFT - 4)) & ~15;
1202 x += dx;
1203 }
1204
1205 dp[4 * i + 0] = tmp0;
1206 dp[4 * i + 1] = tmp1;
1207 dp[4 * i + 2] = tmp2;
1208 dp[4 * i + 3] = tmp3;
1209 }
1210 else {
1211
1212 cx = (x >> (MLIB_SHIFT - 4)) & ~15;
1213 x += dx;
1214
1215 dtmp0 = *(TYPE_64 *) (tsp + cx);
1216 dtmp1 = *(TYPE_64 *) (tsp + cx + 8);
1217
1218 cx = (x >> (MLIB_SHIFT - 4)) & ~15;
1219 x += dx;
1220
1221#ifdef __SUNPRO_C
1222#pragma pipeloop(0)
1223#endif /* __SUNPRO_C */
1224 for (i = 0; i < width - 1; i++) {
1225 *(TYPE_64 *) (dp + 4 * i) = dtmp0;
1226 *(TYPE_64 *) (dp + 4 * i + 2) = dtmp1;
1227
1228 dtmp0 = *(TYPE_64 *) (tsp + cx);
1229 dtmp1 = *(TYPE_64 *) (tsp + cx + 8);
1230
1231 cx = (x >> (MLIB_SHIFT - 4)) & ~15;
1232 x += dx;
1233 }
1234
1235 *(TYPE_64 *) (dp + 4 * i) = dtmp0;
1236 *(TYPE_64 *) (dp + 4 * i + 2) = dtmp1;
1237 }
1238 }
1239
1240 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1241 y += dy;
1242
1243 dp = (void *)((mlib_u8 *) dp + dst_stride);
1244 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1245 }
1246
1247 return MLIB_SUCCESS;
1248}
1249
1250/***************************************************************/
1251
1252mlib_status mlib_ImageZoom_D64_1_Nearest(mlib_work_image *param)
1253{
1254 VARIABLE(TYPE_64);
1255 mlib_s32 i;
1256 TYPE_64 *tsp, tmp;
1257 mlib_s32 cx, y_step;
1258
1259 tsp = sp;
1260 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
1261
1262 for (j = 0; j < height; j++) {
1263 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
1264
1265#ifdef __SUNPRO_C
1266#pragma pipeloop(0)
1267#endif /* __SUNPRO_C */
1268 for (i = 0; i < width; i++) {
1269 cx = x >> MLIB_SHIFT;
1270 tmp = tsp[cx];
1271 dp[i] = tmp;
1272 x += dx;
1273 }
1274
1275 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1276 y += dy;
1277
1278 dp = (void *)((mlib_u8 *) dp + dst_stride);
1279 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1280 }
1281
1282 return MLIB_SUCCESS;
1283}
1284
1285/***************************************************************/
1286
1287mlib_status mlib_ImageZoom_D64_2_Nearest(mlib_work_image *param)
1288{
1289 VARIABLE(TYPE_64);
1290 mlib_s32 i;
1291 TYPE_64 *tsp, tmp, tmp1;
1292 mlib_s32 cx, y_step;
1293
1294 tsp = sp;
1295 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
1296
1297 for (j = 0; j < height; j++) {
1298 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
1299
1300#ifdef __SUNPRO_C
1301#pragma pipeloop(0)
1302#endif /* __SUNPRO_C */
1303 for (i = 0; i < width; i++) {
1304 cx = (x >> (MLIB_SHIFT - 1)) & ~1;
1305 tmp = tsp[cx];
1306 tmp1 = tsp[cx + 1];
1307 dp[2 * i] = tmp;
1308 dp[2 * i + 1] = tmp1;
1309 x += dx;
1310 }
1311
1312 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1313 y += dy;
1314
1315 dp = (void *)((mlib_u8 *) dp + dst_stride);
1316 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1317 }
1318
1319 return MLIB_SUCCESS;
1320}
1321
1322/***************************************************************/
1323
1324mlib_status mlib_ImageZoom_D64_3_Nearest(mlib_work_image *param)
1325{
1326 VARIABLE(TYPE_64);
1327 mlib_s32 i;
1328 TYPE_64 *tsp, tmp, tmp1, tmp2;
1329 mlib_s32 cx, y_step;
1330
1331 tsp = sp;
1332 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
1333
1334 for (j = 0; j < height; j++) {
1335 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
1336
1337 cx = (x >> MLIB_SHIFT) * 3;
1338 tmp = tsp[cx];
1339 tmp1 = tsp[cx + 1];
1340 tmp2 = tsp[cx + 2];
1341 x += dx;
1342
1343 cx = (x >> MLIB_SHIFT) * 3;
1344 x += dx;
1345
1346#ifdef __SUNPRO_C
1347#pragma pipeloop(0)
1348#endif /* __SUNPRO_C */
1349 for (i = 0; i < width - 1; i++) {
1350 dp[3 * i] = tmp;
1351 dp[3 * i + 1] = tmp1;
1352 dp[3 * i + 2] = tmp2;
1353 tmp = tsp[cx];
1354 tmp1 = tsp[cx + 1];
1355 tmp2 = tsp[cx + 2];
1356 cx = (x >> MLIB_SHIFT) * 3;
1357 x += dx;
1358 }
1359
1360 dp[3 * i] = tmp;
1361 dp[3 * i + 1] = tmp1;
1362 dp[3 * i + 2] = tmp2;
1363
1364 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1365 y += dy;
1366
1367 dp = (void *)((mlib_u8 *) dp + dst_stride);
1368 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1369 }
1370
1371 return MLIB_SUCCESS;
1372}
1373
1374/***************************************************************/
1375
1376mlib_status mlib_ImageZoom_D64_4_Nearest(mlib_work_image *param)
1377{
1378 VARIABLE(TYPE_64);
1379 mlib_s32 i;
1380 TYPE_64 *tsp, tmp, tmp1, tmp2, tmp3;
1381 mlib_s32 cx, y_step;
1382
1383 tsp = sp;
1384 y = GetElemSubStruct(current, srcY) & MLIB_MASK;
1385
1386 for (j = 0; j < height; j++) {
1387 x = GetElemSubStruct(current, srcX) & MLIB_MASK;
1388
1389 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
1390 tmp = tsp[cx];
1391 tmp1 = tsp[cx + 1];
1392 tmp2 = tsp[cx + 2];
1393 tmp3 = tsp[cx + 3];
1394 x += dx;
1395
1396 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
1397 x += dx;
1398
1399#ifdef __SUNPRO_C
1400#pragma pipeloop(0)
1401#endif /* __SUNPRO_C */
1402 for (i = 0; i < width - 1; i++) {
1403 dp[4 * i] = tmp;
1404 dp[4 * i + 1] = tmp1;
1405 dp[4 * i + 2] = tmp2;
1406 dp[4 * i + 3] = tmp3;
1407 tmp = tsp[cx];
1408 tmp1 = tsp[cx + 1];
1409 tmp2 = tsp[cx + 2];
1410 tmp3 = tsp[cx + 3];
1411 cx = (x >> (MLIB_SHIFT - 2)) & ~3;
1412 x += dx;
1413 }
1414
1415 dp[4 * i] = tmp;
1416 dp[4 * i + 1] = tmp1;
1417 dp[4 * i + 2] = tmp2;
1418 dp[4 * i + 3] = tmp3;
1419
1420 y_step = ((y + dy) - (y & ~MLIB_MASK)) >> MLIB_SHIFT;
1421 y += dy;
1422
1423 dp = (void *)((mlib_u8 *) dp + dst_stride);
1424 tsp = (void *)((mlib_u8 *) tsp + y_step * src_stride);
1425 }
1426
1427 return MLIB_SUCCESS;
1428}
1429
1430/***************************************************************/