1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11
12 #include "vpx_scale/vpxscale.h"
13 #include "vpx_mem/vpx_mem.h"
14 /****************************************************************************
15 * Imports
16 ****************************************************************************/
17
18 /****************************************************************************
19 *
20 * ROUTINE : vp8cx_horizontal_line_4_5_scale_c
21 *
22 * INPUTS : const unsigned char *source : Pointer to source data.
23 * unsigned int source_width : Stride of source.
24 * unsigned char *dest : Pointer to destination data.
25 * unsigned int dest_width : Stride of destination (NOT USED).
26 *
27 * OUTPUTS : None.
28 *
29 * RETURNS : void
30 *
31 * FUNCTION : Copies horizontal line of pixels from source to
32 * destination scaling up by 4 to 5.
33 *
34 * SPECIAL NOTES : None.
35 *
36 ****************************************************************************/
vp8cx_horizontal_line_4_5_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)37 void vp8cx_horizontal_line_4_5_scale_c
38 (
39 const unsigned char *source,
40 unsigned int source_width,
41 unsigned char *dest,
42 unsigned int dest_width
43 )
44 {
45 unsigned i;
46 unsigned int a, b, c;
47 unsigned char *des = dest;
48 const unsigned char *src = source;
49
50 (void) dest_width;
51
52 for (i = 0; i < source_width - 4; i += 4)
53 {
54 a = src[0];
55 b = src[1];
56 des [0] = (unsigned char) a;
57 des [1] = (unsigned char)((a * 51 + 205 * b + 128) >> 8);
58 c = src[2] * 154;
59 a = src[3];
60 des [2] = (unsigned char)((b * 102 + c + 128) >> 8);
61 des [3] = (unsigned char)((c + 102 * a + 128) >> 8);
62 b = src[4];
63 des [4] = (unsigned char)((a * 205 + 51 * b + 128) >> 8);
64
65 src += 4;
66 des += 5;
67 }
68
69 a = src[0];
70 b = src[1];
71 des [0] = (unsigned char)(a);
72 des [1] = (unsigned char)((a * 51 + 205 * b + 128) >> 8);
73 c = src[2] * 154;
74 a = src[3];
75 des [2] = (unsigned char)((b * 102 + c + 128) >> 8);
76 des [3] = (unsigned char)((c + 102 * a + 128) >> 8);
77 des [4] = (unsigned char)(a);
78
79 }
80
81 /****************************************************************************
82 *
83 * ROUTINE : vp8cx_vertical_band_4_5_scale_c
84 *
85 * INPUTS : unsigned char *dest : Pointer to destination data.
86 * unsigned int dest_pitch : Stride of destination data.
87 * unsigned int dest_width : Width of destination data.
88 *
89 * OUTPUTS : None.
90 *
91 * RETURNS : void
92 *
93 * FUNCTION : Scales vertical band of pixels by scale 4 to 5. The
94 * height of the band scaled is 4-pixels.
95 *
96 * SPECIAL NOTES : The routine uses the first line of the band below
97 * the current band.
98 *
99 ****************************************************************************/
vp8cx_vertical_band_4_5_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)100 void vp8cx_vertical_band_4_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
101 {
102 unsigned int i;
103 unsigned int a, b, c, d;
104 unsigned char *des = dest;
105
106 for (i = 0; i < dest_width; i++)
107 {
108 a = des [0];
109 b = des [dest_pitch];
110
111 des[dest_pitch] = (unsigned char)((a * 51 + 205 * b + 128) >> 8);
112
113 c = des[dest_pitch*2] * 154;
114 d = des[dest_pitch*3];
115
116 des [dest_pitch*2] = (unsigned char)((b * 102 + c + 128) >> 8);
117 des [dest_pitch*3] = (unsigned char)((c + 102 * d + 128) >> 8);
118
119 /* First line in next band */
120 a = des [dest_pitch * 5];
121 des [dest_pitch * 4] = (unsigned char)((d * 205 + 51 * a + 128) >> 8);
122
123 des ++;
124 }
125 }
126
127 /****************************************************************************
128 *
129 * ROUTINE : vp8cx_last_vertical_band_4_5_scale_c
130 *
131 * INPUTS : unsigned char *dest : Pointer to destination data.
132 * unsigned int dest_pitch : Stride of destination data.
133 * unsigned int dest_width : Width of destination data.
134 *
135 * OUTPUTS : None.
136 *
137 * RETURNS : void
138 *
139 * FUNCTION : Scales last vertical band of pixels by scale 4 to 5. The
140 * height of the band scaled is 4-pixels.
141 *
142 * SPECIAL NOTES : The routine does not have available the first line of
143 * the band below the current band, since this is the
144 * last band.
145 *
146 ****************************************************************************/
vp8cx_last_vertical_band_4_5_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)147 void vp8cx_last_vertical_band_4_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
148 {
149 unsigned int i;
150 unsigned int a, b, c, d;
151 unsigned char *des = dest;
152
153 for (i = 0; i < dest_width; ++i)
154 {
155 a = des[0];
156 b = des[dest_pitch];
157
158 des[dest_pitch] = (unsigned char)((a * 51 + 205 * b + 128) >> 8);
159
160 c = des[dest_pitch*2] * 154;
161 d = des[dest_pitch*3];
162
163 des [dest_pitch*2] = (unsigned char)((b * 102 + c + 128) >> 8);
164 des [dest_pitch*3] = (unsigned char)((c + 102 * d + 128) >> 8);
165
166 /* No other line for interplation of this line, so .. */
167 des[dest_pitch*4] = (unsigned char) d;
168
169 des++;
170 }
171 }
172
173 /****************************************************************************
174 *
175 * ROUTINE : vp8cx_horizontal_line_2_3_scale_c
176 *
177 * INPUTS : const unsigned char *source : Pointer to source data.
178 * unsigned int source_width : Stride of source.
179 * unsigned char *dest : Pointer to destination data.
180 * unsigned int dest_width : Stride of destination (NOT USED).
181 *
182 * OUTPUTS : None.
183 *
184 * RETURNS : void
185 *
186 * FUNCTION : Copies horizontal line of pixels from source to
187 * destination scaling up by 2 to 3.
188 *
189 * SPECIAL NOTES : None.
190 *
191 *
192 ****************************************************************************/
vp8cx_horizontal_line_2_3_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)193 void vp8cx_horizontal_line_2_3_scale_c
194 (
195 const unsigned char *source,
196 unsigned int source_width,
197 unsigned char *dest,
198 unsigned int dest_width
199 )
200 {
201 unsigned int i;
202 unsigned int a, b, c;
203 unsigned char *des = dest;
204 const unsigned char *src = source;
205
206 (void) dest_width;
207
208 for (i = 0; i < source_width - 2; i += 2)
209 {
210 a = src[0];
211 b = src[1];
212 c = src[2];
213
214 des [0] = (unsigned char)(a);
215 des [1] = (unsigned char)((a * 85 + 171 * b + 128) >> 8);
216 des [2] = (unsigned char)((b * 171 + 85 * c + 128) >> 8);
217
218 src += 2;
219 des += 3;
220 }
221
222 a = src[0];
223 b = src[1];
224 des [0] = (unsigned char)(a);
225 des [1] = (unsigned char)((a * 85 + 171 * b + 128) >> 8);
226 des [2] = (unsigned char)(b);
227 }
228
229
230 /****************************************************************************
231 *
232 * ROUTINE : vp8cx_vertical_band_2_3_scale_c
233 *
234 * INPUTS : unsigned char *dest : Pointer to destination data.
235 * unsigned int dest_pitch : Stride of destination data.
236 * unsigned int dest_width : Width of destination data.
237 *
238 * OUTPUTS : None.
239 *
240 * RETURNS : void
241 *
242 * FUNCTION : Scales vertical band of pixels by scale 2 to 3. The
243 * height of the band scaled is 2-pixels.
244 *
245 * SPECIAL NOTES : The routine uses the first line of the band below
246 * the current band.
247 *
248 ****************************************************************************/
vp8cx_vertical_band_2_3_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)249 void vp8cx_vertical_band_2_3_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
250 {
251 unsigned int i;
252 unsigned int a, b, c;
253 unsigned char *des = dest;
254
255 for (i = 0; i < dest_width; i++)
256 {
257 a = des [0];
258 b = des [dest_pitch];
259 c = des[dest_pitch*3];
260 des [dest_pitch ] = (unsigned char)((a * 85 + 171 * b + 128) >> 8);
261 des [dest_pitch*2] = (unsigned char)((b * 171 + 85 * c + 128) >> 8);
262
263 des++;
264 }
265 }
266
267 /****************************************************************************
268 *
269 * ROUTINE : vp8cx_last_vertical_band_2_3_scale_c
270 *
271 * INPUTS : unsigned char *dest : Pointer to destination data.
272 * unsigned int dest_pitch : Stride of destination data.
273 * unsigned int dest_width : Width of destination data.
274 *
275 * OUTPUTS : None.
276 *
277 * RETURNS : void
278 *
279 * FUNCTION : Scales last vertical band of pixels by scale 2 to 3. The
280 * height of the band scaled is 2-pixels.
281 *
282 * SPECIAL NOTES : The routine does not have available the first line of
283 * the band below the current band, since this is the
284 * last band.
285 *
286 ****************************************************************************/
vp8cx_last_vertical_band_2_3_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)287 void vp8cx_last_vertical_band_2_3_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
288 {
289 unsigned int i;
290 unsigned int a, b;
291 unsigned char *des = dest;
292
293 for (i = 0; i < dest_width; ++i)
294 {
295 a = des [0];
296 b = des [dest_pitch];
297
298 des [dest_pitch ] = (unsigned char)((a * 85 + 171 * b + 128) >> 8);
299 des [dest_pitch*2] = (unsigned char)(b);
300 des++;
301 }
302 }
303
304 /****************************************************************************
305 *
306 * ROUTINE : vp8cx_horizontal_line_3_5_scale_c
307 *
308 * INPUTS : const unsigned char *source : Pointer to source data.
309 * unsigned int source_width : Stride of source.
310 * unsigned char *dest : Pointer to destination data.
311 * unsigned int dest_width : Stride of destination (NOT USED).
312 *
313 * OUTPUTS : None.
314 *
315 * RETURNS : void
316 *
317 * FUNCTION : Copies horizontal line of pixels from source to
318 * destination scaling up by 3 to 5.
319 *
320 * SPECIAL NOTES : None.
321 *
322 *
323 ****************************************************************************/
vp8cx_horizontal_line_3_5_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)324 void vp8cx_horizontal_line_3_5_scale_c
325 (
326 const unsigned char *source,
327 unsigned int source_width,
328 unsigned char *dest,
329 unsigned int dest_width
330 )
331 {
332 unsigned int i;
333 unsigned int a, b, c;
334 unsigned char *des = dest;
335 const unsigned char *src = source;
336
337 (void) dest_width;
338
339 for (i = 0; i < source_width - 3; i += 3)
340 {
341 a = src[0];
342 b = src[1];
343 des [0] = (unsigned char)(a);
344 des [1] = (unsigned char)((a * 102 + 154 * b + 128) >> 8);
345
346 c = src[2] ;
347 des [2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8);
348 des [3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8);
349
350 a = src[3];
351 des [4] = (unsigned char)((c * 154 + a * 102 + 128) >> 8);
352
353 src += 3;
354 des += 5;
355 }
356
357 a = src[0];
358 b = src[1];
359 des [0] = (unsigned char)(a);
360
361 des [1] = (unsigned char)((a * 102 + 154 * b + 128) >> 8);
362 c = src[2] ;
363 des [2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8);
364 des [3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8);
365
366 des [4] = (unsigned char)(c);
367 }
368
369 /****************************************************************************
370 *
371 * ROUTINE : vp8cx_vertical_band_3_5_scale_c
372 *
373 * INPUTS : unsigned char *dest : Pointer to destination data.
374 * unsigned int dest_pitch : Stride of destination data.
375 * unsigned int dest_width : Width of destination data.
376 *
377 * OUTPUTS : None.
378 *
379 * RETURNS : void
380 *
381 * FUNCTION : Scales vertical band of pixels by scale 3 to 5. The
382 * height of the band scaled is 3-pixels.
383 *
384 * SPECIAL NOTES : The routine uses the first line of the band below
385 * the current band.
386 *
387 ****************************************************************************/
vp8cx_vertical_band_3_5_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)388 void vp8cx_vertical_band_3_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
389 {
390 unsigned int i;
391 unsigned int a, b, c;
392 unsigned char *des = dest;
393
394 for (i = 0; i < dest_width; i++)
395 {
396 a = des [0];
397 b = des [dest_pitch];
398 des [dest_pitch] = (unsigned char)((a * 102 + 154 * b + 128) >> 8);
399
400 c = des[dest_pitch*2];
401 des [dest_pitch*2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8);
402 des [dest_pitch*3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8);
403
404 /* First line in next band... */
405 a = des [dest_pitch * 5];
406 des [dest_pitch * 4] = (unsigned char)((c * 154 + a * 102 + 128) >> 8);
407
408 des++;
409 }
410 }
411
412 /****************************************************************************
413 *
414 * ROUTINE : vp8cx_last_vertical_band_3_5_scale_c
415 *
416 * INPUTS : unsigned char *dest : Pointer to destination data.
417 * unsigned int dest_pitch : Stride of destination data.
418 * unsigned int dest_width : Width of destination data.
419 *
420 * OUTPUTS : None.
421 *
422 * RETURNS : void
423 *
424 * FUNCTION : Scales last vertical band of pixels by scale 3 to 5. The
425 * height of the band scaled is 3-pixels.
426 *
427 * SPECIAL NOTES : The routine does not have available the first line of
428 * the band below the current band, since this is the
429 * last band.
430 *
431 ****************************************************************************/
vp8cx_last_vertical_band_3_5_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)432 void vp8cx_last_vertical_band_3_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
433 {
434 unsigned int i;
435 unsigned int a, b, c;
436 unsigned char *des = dest;
437
438 for (i = 0; i < dest_width; ++i)
439 {
440 a = des [0];
441 b = des [dest_pitch];
442
443 des [ dest_pitch ] = (unsigned char)((a * 102 + 154 * b + 128) >> 8);
444
445 c = des[dest_pitch*2];
446 des [dest_pitch*2] = (unsigned char)((b * 205 + c * 51 + 128) >> 8);
447 des [dest_pitch*3] = (unsigned char)((b * 51 + c * 205 + 128) >> 8);
448
449 /* No other line for interplation of this line, so .. */
450 des [ dest_pitch * 4 ] = (unsigned char)(c) ;
451
452 des++;
453 }
454 }
455
456 /****************************************************************************
457 *
458 * ROUTINE : vp8cx_horizontal_line_3_4_scale_c
459 *
460 * INPUTS : const unsigned char *source : Pointer to source data.
461 * unsigned int source_width : Stride of source.
462 * unsigned char *dest : Pointer to destination data.
463 * unsigned int dest_width : Stride of destination (NOT USED).
464 *
465 * OUTPUTS : None.
466 *
467 * RETURNS : void
468 *
469 * FUNCTION : Copies horizontal line of pixels from source to
470 * destination scaling up by 3 to 4.
471 *
472 * SPECIAL NOTES : None.
473 *
474 *
475 ****************************************************************************/
vp8cx_horizontal_line_3_4_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)476 void vp8cx_horizontal_line_3_4_scale_c
477 (
478 const unsigned char *source,
479 unsigned int source_width,
480 unsigned char *dest,
481 unsigned int dest_width
482 )
483 {
484 unsigned int i;
485 unsigned int a, b, c;
486 unsigned char *des = dest;
487 const unsigned char *src = source;
488
489 (void) dest_width;
490
491 for (i = 0; i < source_width - 3; i += 3)
492 {
493 a = src[0];
494 b = src[1];
495 des [0] = (unsigned char)(a);
496 des [1] = (unsigned char)((a * 64 + b * 192 + 128) >> 8);
497
498 c = src[2];
499 des [2] = (unsigned char)((b + c + 1) >> 1);
500
501 a = src[3];
502 des [3] = (unsigned char)((c * 192 + a * 64 + 128) >> 8);
503
504 src += 3;
505 des += 4;
506 }
507
508 a = src[0];
509 b = src[1];
510 des [0] = (unsigned char)(a);
511 des [1] = (unsigned char)((a * 64 + b * 192 + 128) >> 8);
512
513 c = src[2] ;
514 des [2] = (unsigned char)((b + c + 1) >> 1);
515 des [3] = (unsigned char)(c);
516 }
517
518 /****************************************************************************
519 *
520 * ROUTINE : vp8cx_vertical_band_3_4_scale_c
521 *
522 * INPUTS : unsigned char *dest : Pointer to destination data.
523 * unsigned int dest_pitch : Stride of destination data.
524 * unsigned int dest_width : Width of destination data.
525 *
526 * OUTPUTS : None.
527 *
528 * RETURNS : void
529 *
530 * FUNCTION : Scales vertical band of pixels by scale 3 to 4. The
531 * height of the band scaled is 3-pixels.
532 *
533 * SPECIAL NOTES : The routine uses the first line of the band below
534 * the current band.
535 *
536 ****************************************************************************/
vp8cx_vertical_band_3_4_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)537 void vp8cx_vertical_band_3_4_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
538 {
539 unsigned int i;
540 unsigned int a, b, c;
541 unsigned char *des = dest;
542
543 for (i = 0; i < dest_width; i++)
544 {
545 a = des [0];
546 b = des [dest_pitch];
547 des [dest_pitch] = (unsigned char)((a * 64 + b * 192 + 128) >> 8);
548
549 c = des[dest_pitch*2];
550 des [dest_pitch*2] = (unsigned char)((b + c + 1) >> 1);
551
552 /* First line in next band... */
553 a = des [dest_pitch*4];
554 des [dest_pitch*3] = (unsigned char)((c * 192 + a * 64 + 128) >> 8);
555
556 des++;
557 }
558 }
559
560 /****************************************************************************
561 *
562 * ROUTINE : vp8cx_last_vertical_band_3_4_scale_c
563 *
564 * INPUTS : unsigned char *dest : Pointer to destination data.
565 * unsigned int dest_pitch : Stride of destination data.
566 * unsigned int dest_width : Width of destination data.
567 *
568 * OUTPUTS : None.
569 *
570 * RETURNS : void
571 *
572 * FUNCTION : Scales last vertical band of pixels by scale 3 to 4. The
573 * height of the band scaled is 3-pixels.
574 *
575 * SPECIAL NOTES : The routine does not have available the first line of
576 * the band below the current band, since this is the
577 * last band.
578 *
579 ****************************************************************************/
vp8cx_last_vertical_band_3_4_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)580 void vp8cx_last_vertical_band_3_4_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
581 {
582 unsigned int i;
583 unsigned int a, b, c;
584 unsigned char *des = dest;
585
586 for (i = 0; i < dest_width; ++i)
587 {
588 a = des [0];
589 b = des [dest_pitch];
590
591 des [dest_pitch] = (unsigned char)((a * 64 + b * 192 + 128) >> 8);
592
593 c = des[dest_pitch*2];
594 des [dest_pitch*2] = (unsigned char)((b + c + 1) >> 1);
595
596 /* No other line for interplation of this line, so .. */
597 des [dest_pitch*3] = (unsigned char)(c);
598
599 des++;
600 }
601 }
602
603 /****************************************************************************
604 *
605 * ROUTINE : vp8cx_horizontal_line_1_2_scale_c
606 *
607 * INPUTS : const unsigned char *source : Pointer to source data.
608 * unsigned int source_width : Stride of source.
609 * unsigned char *dest : Pointer to destination data.
610 * unsigned int dest_width : Stride of destination (NOT USED).
611 *
612 * OUTPUTS : None.
613 *
614 * RETURNS : void
615 *
616 * FUNCTION : Copies horizontal line of pixels from source to
617 * destination scaling up by 1 to 2.
618 *
619 * SPECIAL NOTES : None.
620 *
621 ****************************************************************************/
vp8cx_horizontal_line_1_2_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)622 void vp8cx_horizontal_line_1_2_scale_c
623 (
624 const unsigned char *source,
625 unsigned int source_width,
626 unsigned char *dest,
627 unsigned int dest_width
628 )
629 {
630 unsigned int i;
631 unsigned int a, b;
632 unsigned char *des = dest;
633 const unsigned char *src = source;
634
635 (void) dest_width;
636
637 for (i = 0; i < source_width - 1; i += 1)
638 {
639 a = src[0];
640 b = src[1];
641 des [0] = (unsigned char)(a);
642 des [1] = (unsigned char)((a + b + 1) >> 1);
643 src += 1;
644 des += 2;
645 }
646
647 a = src[0];
648 des [0] = (unsigned char)(a);
649 des [1] = (unsigned char)(a);
650 }
651
652 /****************************************************************************
653 *
654 * ROUTINE : vp8cx_vertical_band_1_2_scale_c
655 *
656 * INPUTS : unsigned char *dest : Pointer to destination data.
657 * unsigned int dest_pitch : Stride of destination data.
658 * unsigned int dest_width : Width of destination data.
659 *
660 * OUTPUTS : None.
661 *
662 * RETURNS : void
663 *
664 * FUNCTION : Scales vertical band of pixels by scale 1 to 2. The
665 * height of the band scaled is 1-pixel.
666 *
667 * SPECIAL NOTES : The routine uses the first line of the band below
668 * the current band.
669 *
670 ****************************************************************************/
vp8cx_vertical_band_1_2_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)671 void vp8cx_vertical_band_1_2_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
672 {
673 unsigned int i;
674 unsigned int a, b;
675 unsigned char *des = dest;
676
677 for (i = 0; i < dest_width; i++)
678 {
679 a = des [0];
680 b = des [dest_pitch * 2];
681
682 des[dest_pitch] = (unsigned char)((a + b + 1) >> 1);
683
684 des++;
685 }
686 }
687
688 /****************************************************************************
689 *
690 * ROUTINE : vp8cx_last_vertical_band_1_2_scale_c
691 *
692 * INPUTS : unsigned char *dest : Pointer to destination data.
693 * unsigned int dest_pitch : Stride of destination data.
694 * unsigned int dest_width : Width of destination data.
695 *
696 * OUTPUTS : None.
697 *
698 * RETURNS : void
699 *
700 * FUNCTION : Scales last vertical band of pixels by scale 1 to 2. The
701 * height of the band scaled is 1-pixel.
702 *
703 * SPECIAL NOTES : The routine does not have available the first line of
704 * the band below the current band, since this is the
705 * last band.
706 *
707 ****************************************************************************/
vp8cx_last_vertical_band_1_2_scale_c(unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)708 void vp8cx_last_vertical_band_1_2_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
709 {
710 unsigned int i;
711 unsigned char *des = dest;
712
713 for (i = 0; i < dest_width; ++i)
714 {
715 des[dest_pitch] = des[0];
716 des++;
717 }
718 }
719
720
721
722
723
724 /****************************************************************************
725 *
726 * ROUTINE : vp8cx_horizontal_line_4_5_scale_c
727 *
728 * INPUTS : const unsigned char *source : Pointer to source data.
729 * unsigned int source_width : Stride of source.
730 * unsigned char *dest : Pointer to destination data.
731 * unsigned int dest_width : Stride of destination (NOT USED).
732 *
733 * OUTPUTS : None.
734 *
735 * RETURNS : void
736 *
737 * FUNCTION : Copies horizontal line of pixels from source to
738 * destination scaling up by 4 to 5.
739 *
740 * SPECIAL NOTES : None.
741 *
742 ****************************************************************************/
vp8cx_horizontal_line_5_4_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)743 void vp8cx_horizontal_line_5_4_scale_c
744 (
745 const unsigned char *source,
746 unsigned int source_width,
747 unsigned char *dest,
748 unsigned int dest_width
749 )
750 {
751 unsigned i;
752 unsigned int a, b, c, d, e;
753 unsigned char *des = dest;
754 const unsigned char *src = source;
755
756 (void) dest_width;
757
758 for (i = 0; i < source_width; i += 5)
759 {
760 a = src[0];
761 b = src[1];
762 c = src[2];
763 d = src[3];
764 e = src[4];
765
766 des[0] = (unsigned char) a;
767 des[1] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
768 des[2] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
769 des[3] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
770
771 src += 5;
772 des += 4;
773 }
774 }
775
776
777
778
vp8cx_vertical_band_5_4_scale_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)779 void vp8cx_vertical_band_5_4_scale_c(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
780 {
781 unsigned int i;
782 unsigned int a, b, c, d, e;
783 unsigned char *des = dest;
784 unsigned char *src = source;
785
786 for (i = 0; i < dest_width; i++)
787 {
788
789 a = src[0 * src_pitch];
790 b = src[1 * src_pitch];
791 c = src[2 * src_pitch];
792 d = src[3 * src_pitch];
793 e = src[4 * src_pitch];
794
795 des[0 * dest_pitch] = (unsigned char) a;
796 des[1 * dest_pitch] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
797 des[2 * dest_pitch] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
798 des[3 * dest_pitch] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
799
800 src ++;
801 des ++;
802
803 }
804 }
805
806
807 /*7***************************************************************************
808 *
809 * ROUTINE : vp8cx_horizontal_line_3_5_scale_c
810 *
811 * INPUTS : const unsigned char *source : Pointer to source data.
812 * unsigned int source_width : Stride of source.
813 * unsigned char *dest : Pointer to destination data.
814 * unsigned int dest_width : Stride of destination (NOT USED).
815 *
816 * OUTPUTS : None.
817 *
818 * RETURNS : void
819 *
820 * FUNCTION : Copies horizontal line of pixels from source to
821 * destination scaling up by 3 to 5.
822 *
823 * SPECIAL NOTES : None.
824 *
825 *
826 ****************************************************************************/
vp8cx_horizontal_line_5_3_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)827 void vp8cx_horizontal_line_5_3_scale_c
828 (
829 const unsigned char *source,
830 unsigned int source_width,
831 unsigned char *dest,
832 unsigned int dest_width
833 )
834 {
835 unsigned int i;
836 unsigned int a, b, c, d , e;
837 unsigned char *des = dest;
838 const unsigned char *src = source;
839
840 (void) dest_width;
841
842 for (i = 0; i < source_width; i += 5)
843 {
844 a = src[0];
845 b = src[1];
846 c = src[2];
847 d = src[3];
848 e = src[4];
849
850 des[0] = (unsigned char) a;
851 des[1] = (unsigned char)((b * 85 + c * 171 + 128) >> 8);
852 des[2] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
853
854 src += 5;
855 des += 3;
856 }
857
858 }
859
vp8cx_vertical_band_5_3_scale_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)860 void vp8cx_vertical_band_5_3_scale_c(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
861 {
862 unsigned int i;
863 unsigned int a, b, c, d, e;
864 unsigned char *des = dest;
865 unsigned char *src = source;
866
867 for (i = 0; i < dest_width; i++)
868 {
869
870 a = src[0 * src_pitch];
871 b = src[1 * src_pitch];
872 c = src[2 * src_pitch];
873 d = src[3 * src_pitch];
874 e = src[4 * src_pitch];
875
876 des[0 * dest_pitch] = (unsigned char) a;
877 des[1 * dest_pitch] = (unsigned char)((b * 85 + c * 171 + 128) >> 8);
878 des[2 * dest_pitch] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
879
880 src ++;
881 des ++;
882
883 }
884 }
885
886 /****************************************************************************
887 *
888 * ROUTINE : vp8cx_horizontal_line_1_2_scale_c
889 *
890 * INPUTS : const unsigned char *source : Pointer to source data.
891 * unsigned int source_width : Stride of source.
892 * unsigned char *dest : Pointer to destination data.
893 * unsigned int dest_width : Stride of destination (NOT USED).
894 *
895 * OUTPUTS : None.
896 *
897 * RETURNS : void
898 *
899 * FUNCTION : Copies horizontal line of pixels from source to
900 * destination scaling up by 1 to 2.
901 *
902 * SPECIAL NOTES : None.
903 *
904 ****************************************************************************/
vp8cx_horizontal_line_2_1_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)905 void vp8cx_horizontal_line_2_1_scale_c
906 (
907 const unsigned char *source,
908 unsigned int source_width,
909 unsigned char *dest,
910 unsigned int dest_width
911 )
912 {
913 unsigned int i;
914 unsigned int a;
915 unsigned char *des = dest;
916 const unsigned char *src = source;
917
918 (void) dest_width;
919
920 for (i = 0; i < source_width; i += 2)
921 {
922 a = src[0];
923 des [0] = (unsigned char)(a);
924 src += 2;
925 des += 1;
926 }
927
928
929
930 }
vp8cx_vertical_band_2_1_scale_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)931 void vp8cx_vertical_band_2_1_scale_c(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
932 {
933 (void) dest_pitch;
934 (void) src_pitch;
935 vpx_memcpy(dest, source, dest_width);
936 }
937
vp8cx_vertical_band_2_1_scale_i_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)938 void vp8cx_vertical_band_2_1_scale_i_c(unsigned char *source, unsigned int src_pitch, unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width)
939 {
940 int i;
941 int temp;
942 int width = dest_width;
943
944 (void) dest_pitch;
945
946 for (i = 0; i < width; i++)
947 {
948 temp = 8;
949 temp += source[i-(int)src_pitch] * 3;
950 temp += source[i] * 10;
951 temp += source[i+src_pitch] * 3;
952 temp >>= 4 ;
953 dest[i] = (unsigned char)(temp);
954 }
955
956 }
957