• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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