2 * This file is part of the Scale2x project.
4 * Copyright (C) 2001, 2002, 2003, 2004 Andrea Mazzoleni
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * This file contains a C and MMX implementation of the Scale2x effect.
24 * You can find an high level description of the effect at :
26 * http://scale2x.sourceforge.net/
28 * Alternatively at the previous license terms, you are allowed to use this
29 * code in your program with these conditions:
30 * - the program is not used in commercial activities.
31 * - the whole source code of the program is released with the binary.
32 * - derivative works of the program are allowed.
43 /***************************************************************************/
44 /* Scale3x C implementation */
47 * Define the macro USE_SCALE_RANDOMWRITE to enable
48 * an optimized version which writes memory in random order.
49 * This version is a little faster if you write in system memory.
50 * But it's a lot slower if you write in video memory.
51 * So, enable it only if you are sure to never write directly in video memory.
53 /* #define USE_SCALE_RANDOMWRITE */
55 #ifdef USE_SCALE_RANDOMWRITE
57 static inline void scale3x_8_def_whole(scale3x_uint8
* restrict dst0
, scale3x_uint8
* restrict dst1
, scale3x_uint8
* restrict dst2
, const scale3x_uint8
* restrict src0
, const scale3x_uint8
* restrict src1
, const scale3x_uint8
* restrict src2
, unsigned count
)
62 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
64 dst0
[1] = (src1
[0] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[0]) ? src0
[0] : src1
[0];
65 dst0
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
66 dst1
[0] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
68 dst1
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
70 dst2
[1] = (src1
[0] == src2
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src2
[0]) ? src2
[0] : src1
[0];
71 dst2
[2] = src1
[1] == src2
[0] ? src1
[1] : src1
[0];
93 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
94 dst0
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
95 dst0
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
96 dst0
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
97 dst1
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
99 dst1
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
100 dst2
[0] = src1
[-1] == src2
[0] ? src1
[-1] : src1
[0];
101 dst2
[1] = (src1
[-1] == src2
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src2
[-1]) ? src2
[0] : src1
[0];
102 dst2
[2] = src1
[1] == src2
[0] ? src1
[1] : src1
[0];
125 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
126 dst0
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
127 dst0
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[0]) || (src1
[0] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
129 dst1
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
131 dst1
[2] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
132 dst2
[0] = src1
[-1] == src2
[0] ? src1
[-1] : src1
[0];
133 dst2
[1] = (src1
[-1] == src2
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src2
[-1]) ? src2
[0] : src1
[0];
148 #else /* USE_SCALE_RANDOMWRITE */
150 static inline void scale3x_8_def_border(scale3x_uint8
* restrict dst
, const scale3x_uint8
* restrict src0
, const scale3x_uint8
* restrict src1
, const scale3x_uint8
* restrict src2
, unsigned count
)
155 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
157 dst
[1] = (src1
[0] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[0]) ? src0
[0] : src1
[0];
158 dst
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
172 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
173 dst
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
174 dst
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
175 dst
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
190 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
191 dst
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
192 dst
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[0]) || (src1
[0] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
201 static inline void scale3x_8_def_center(scale3x_uint8
* restrict dst
, const scale3x_uint8
* restrict src0
, const scale3x_uint8
* restrict src1
, const scale3x_uint8
* restrict src2
, unsigned count
)
206 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
207 dst
[0] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
209 dst
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
223 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
224 dst
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
226 dst
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
241 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
242 dst
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
244 dst
[2] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
252 #endif /* USE_SCALE_RANDOMWRITE */
254 #ifdef USE_SCALE_RANDOMWRITE
256 static inline void scale3x_16_def_whole(scale3x_uint16
* restrict dst0
, scale3x_uint16
* restrict dst1
, scale3x_uint16
* restrict dst2
, const scale3x_uint16
* restrict src0
, const scale3x_uint16
* restrict src1
, const scale3x_uint16
* restrict src2
, unsigned count
)
261 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
263 dst0
[1] = (src1
[0] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[0]) ? src0
[0] : src1
[0];
264 dst0
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
265 dst1
[0] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
267 dst1
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
269 dst2
[1] = (src1
[0] == src2
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src2
[0]) ? src2
[0] : src1
[0];
270 dst2
[2] = src1
[1] == src2
[0] ? src1
[1] : src1
[0];
292 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
293 dst0
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
294 dst0
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
295 dst0
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
296 dst1
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
298 dst1
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
299 dst2
[0] = src1
[-1] == src2
[0] ? src1
[-1] : src1
[0];
300 dst2
[1] = (src1
[-1] == src2
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src2
[-1]) ? src2
[0] : src1
[0];
301 dst2
[2] = src1
[1] == src2
[0] ? src1
[1] : src1
[0];
324 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
325 dst0
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
326 dst0
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[0]) || (src1
[0] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
328 dst1
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
330 dst1
[2] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
331 dst2
[0] = src1
[-1] == src2
[0] ? src1
[-1] : src1
[0];
332 dst2
[1] = (src1
[-1] == src2
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src2
[-1]) ? src2
[0] : src1
[0];
347 #else /* USE_SCALE_RANDOMWRITE */
349 static inline void scale3x_16_def_border(scale3x_uint16
* restrict dst
, const scale3x_uint16
* restrict src0
, const scale3x_uint16
* restrict src1
, const scale3x_uint16
* restrict src2
, unsigned count
)
354 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
356 dst
[1] = (src1
[0] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[0]) ? src0
[0] : src1
[0];
357 dst
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
371 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
372 dst
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
373 dst
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
374 dst
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
389 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
390 dst
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
391 dst
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[0]) || (src1
[0] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
400 static inline void scale3x_16_def_center(scale3x_uint16
* restrict dst
, const scale3x_uint16
* restrict src0
, const scale3x_uint16
* restrict src1
, const scale3x_uint16
* restrict src2
, unsigned count
)
405 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
406 dst
[0] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
408 dst
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
422 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
423 dst
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
425 dst
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
440 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
441 dst
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
443 dst
[2] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
451 #endif /* USE_SCALE_RANDOMWRITE */
453 #ifdef USE_SCALE_RANDOMWRITE
455 static inline void scale3x_32_def_whole(scale3x_uint32
* restrict dst0
, scale3x_uint32
* restrict dst1
, scale3x_uint32
* restrict dst2
, const scale3x_uint32
* restrict src0
, const scale3x_uint32
* restrict src1
, const scale3x_uint32
* restrict src2
, unsigned count
)
460 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
462 dst0
[1] = (src1
[0] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[0]) ? src0
[0] : src1
[0];
463 dst0
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
464 dst1
[0] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
466 dst1
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
468 dst2
[1] = (src1
[0] == src2
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src2
[0]) ? src2
[0] : src1
[0];
469 dst2
[2] = src1
[1] == src2
[0] ? src1
[1] : src1
[0];
491 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
492 dst0
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
493 dst0
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
494 dst0
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
495 dst1
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
497 dst1
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
498 dst2
[0] = src1
[-1] == src2
[0] ? src1
[-1] : src1
[0];
499 dst2
[1] = (src1
[-1] == src2
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src2
[-1]) ? src2
[0] : src1
[0];
500 dst2
[2] = src1
[1] == src2
[0] ? src1
[1] : src1
[0];
523 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
524 dst0
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
525 dst0
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[0]) || (src1
[0] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
527 dst1
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
529 dst1
[2] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
530 dst2
[0] = src1
[-1] == src2
[0] ? src1
[-1] : src1
[0];
531 dst2
[1] = (src1
[-1] == src2
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src2
[-1]) ? src2
[0] : src1
[0];
546 #else /* USE_SCALE_RANDOMWRITE */
548 static inline void scale3x_32_def_border(scale3x_uint32
* restrict dst
, const scale3x_uint32
* restrict src0
, const scale3x_uint32
* restrict src1
, const scale3x_uint32
* restrict src2
, unsigned count
)
553 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
555 dst
[1] = (src1
[0] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[0]) ? src0
[0] : src1
[0];
556 dst
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
570 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
571 dst
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
572 dst
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[1]) || (src1
[1] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
573 dst
[2] = src1
[1] == src0
[0] ? src1
[1] : src1
[0];
588 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
589 dst
[0] = src1
[-1] == src0
[0] ? src1
[-1] : src1
[0];
590 dst
[1] = (src1
[-1] == src0
[0] && src1
[0] != src0
[0]) || (src1
[0] == src0
[0] && src1
[0] != src0
[-1]) ? src0
[0] : src1
[0];
599 static inline void scale3x_32_def_center(scale3x_uint32
* restrict dst
, const scale3x_uint32
* restrict src0
, const scale3x_uint32
* restrict src1
, const scale3x_uint32
* restrict src2
, unsigned count
)
604 if (src0
[0] != src2
[0] && src1
[0] != src1
[1]) {
605 dst
[0] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
607 dst
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
621 if (src0
[0] != src2
[0] && src1
[-1] != src1
[1]) {
622 dst
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
624 dst
[2] = (src1
[1] == src0
[0] && src1
[0] != src2
[1]) || (src1
[1] == src2
[0] && src1
[0] != src0
[1]) ? src1
[1] : src1
[0];
639 if (src0
[0] != src2
[0] && src1
[-1] != src1
[0]) {
640 dst
[0] = (src1
[-1] == src0
[0] && src1
[0] != src2
[-1]) || (src1
[-1] == src2
[0] && src1
[0] != src0
[-1]) ? src1
[-1] : src1
[0];
642 dst
[2] = (src1
[0] == src0
[0] && src1
[0] != src2
[0]) || (src1
[0] == src2
[0] && src1
[0] != src0
[0]) ? src1
[0] : src1
[0];
650 #endif /* USE_SCALE_RANDOMWRITE */
653 * Scale by a factor of 3 a row of pixels of 8 bits.
654 * The function is implemented in C.
655 * The pixels over the left and right borders are assumed of the same color of
656 * the pixels on the border.
657 * \param src0 Pointer at the first pixel of the previous row.
658 * \param src1 Pointer at the first pixel of the current row.
659 * \param src2 Pointer at the first pixel of the next row.
660 * \param count Length in pixels of the src0, src1 and src2 rows.
661 * It must be at least 2.
662 * \param dst0 First destination row, triple length in pixels.
663 * \param dst1 Second destination row, triple length in pixels.
664 * \param dst2 Third destination row, triple length in pixels.
666 void scale3x_8_def(scale3x_uint8
* dst0
, scale3x_uint8
* dst1
, scale3x_uint8
* dst2
, const scale3x_uint8
* src0
, const scale3x_uint8
* src1
, const scale3x_uint8
* src2
, unsigned count
)
668 #ifdef USE_SCALE_RANDOMWRITE
669 scale3x_8_def_whole(dst0
, dst1
, dst2
, src0
, src1
, src2
, count
);
671 scale3x_8_def_border(dst0
, src0
, src1
, src2
, count
);
672 scale3x_8_def_center(dst1
, src0
, src1
, src2
, count
);
673 scale3x_8_def_border(dst2
, src2
, src1
, src0
, count
);
678 * Scale by a factor of 3 a row of pixels of 16 bits.
679 * This function operates like scale3x_8_def() but for 16 bits pixels.
680 * \param src0 Pointer at the first pixel of the previous row.
681 * \param src1 Pointer at the first pixel of the current row.
682 * \param src2 Pointer at the first pixel of the next row.
683 * \param count Length in pixels of the src0, src1 and src2 rows.
684 * It must be at least 2.
685 * \param dst0 First destination row, triple length in pixels.
686 * \param dst1 Second destination row, triple length in pixels.
687 * \param dst2 Third destination row, triple length in pixels.
689 void scale3x_16_def(scale3x_uint16
* dst0
, scale3x_uint16
* dst1
, scale3x_uint16
* dst2
, const scale3x_uint16
* src0
, const scale3x_uint16
* src1
, const scale3x_uint16
* src2
, unsigned count
)
691 #ifdef USE_SCALE_RANDOMWRITE
692 scale3x_16_def_whole(dst0
, dst1
, dst2
, src0
, src1
, src2
, count
);
694 scale3x_16_def_border(dst0
, src0
, src1
, src2
, count
);
695 scale3x_16_def_center(dst1
, src0
, src1
, src2
, count
);
696 scale3x_16_def_border(dst2
, src2
, src1
, src0
, count
);
701 * Scale by a factor of 3 a row of pixels of 32 bits.
702 * This function operates like scale3x_8_def() but for 32 bits pixels.
703 * \param src0 Pointer at the first pixel of the previous row.
704 * \param src1 Pointer at the first pixel of the current row.
705 * \param src2 Pointer at the first pixel of the next row.
706 * \param count Length in pixels of the src0, src1 and src2 rows.
707 * It must be at least 2.
708 * \param dst0 First destination row, triple length in pixels.
709 * \param dst1 Second destination row, triple length in pixels.
710 * \param dst2 Third destination row, triple length in pixels.
712 void scale3x_32_def(scale3x_uint32
* dst0
, scale3x_uint32
* dst1
, scale3x_uint32
* dst2
, const scale3x_uint32
* src0
, const scale3x_uint32
* src1
, const scale3x_uint32
* src2
, unsigned count
)
714 #ifdef USE_SCALE_RANDOMWRITE
715 scale3x_32_def_whole(dst0
, dst1
, dst2
, src0
, src1
, src2
, count
);
717 scale3x_32_def_border(dst0
, src0
, src1
, src2
, count
);
718 scale3x_32_def_center(dst1
, src0
, src1
, src2
, count
);
719 scale3x_32_def_border(dst2
, src2
, src1
, src0
, count
);