]> granicus.if.org Git - libvpx/blob - vpx_scale/generic/gen_scalers.c
vpx_mem: remove vpx_memcpy
[libvpx] / vpx_scale / generic / gen_scalers.c
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/vpx_scale.h"
13 #include "vpx_mem/vpx_mem.h"
14 /****************************************************************************
15 *  Imports
16 ****************************************************************************/
17
18 /****************************************************************************
19  *
20  *
21  *  INPUTS        : const unsigned char *source : Pointer to source data.
22  *                  unsigned int source_width    : Stride of source.
23  *                  unsigned char *dest         : Pointer to destination data.
24  *                  unsigned int dest_width      : Stride of destination (NOT USED).
25  *
26  *  OUTPUTS       : None.
27  *
28  *  RETURNS       : void
29  *
30  *  FUNCTION      : Copies horizontal line of pixels from source to
31  *                  destination scaling up by 4 to 5.
32  *
33  *  SPECIAL NOTES : None.
34  *
35  ****************************************************************************/
36 void vp8_horizontal_line_5_4_scale_c(const unsigned char *source,
37                                      unsigned int source_width,
38                                      unsigned char *dest,
39                                      unsigned int dest_width) {
40   unsigned i;
41   unsigned int a, b, c, d, e;
42   unsigned char *des = dest;
43   const unsigned char *src = source;
44
45   (void) dest_width;
46
47   for (i = 0; i < source_width; i += 5) {
48     a = src[0];
49     b = src[1];
50     c = src[2];
51     d = src[3];
52     e = src[4];
53
54     des[0] = (unsigned char) a;
55     des[1] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
56     des[2] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
57     des[3] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
58
59     src += 5;
60     des += 4;
61   }
62 }
63
64
65
66
67 void vp8_vertical_band_5_4_scale_c(unsigned char *source,
68                                    unsigned int src_pitch,
69                                    unsigned char *dest,
70                                    unsigned int dest_pitch,
71                                    unsigned int dest_width) {
72   unsigned int i;
73   unsigned int a, b, c, d, e;
74   unsigned char *des = dest;
75   unsigned char *src = source;
76
77   for (i = 0; i < dest_width; i++) {
78
79     a = src[0 * src_pitch];
80     b = src[1 * src_pitch];
81     c = src[2 * src_pitch];
82     d = src[3 * src_pitch];
83     e = src[4 * src_pitch];
84
85     des[0 * dest_pitch] = (unsigned char) a;
86     des[1 * dest_pitch] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
87     des[2 * dest_pitch] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
88     des[3 * dest_pitch] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
89
90     src++;
91     des++;
92
93   }
94 }
95
96
97 /*7***************************************************************************
98  *
99  *  ROUTINE       : vp8_horizontal_line_3_5_scale_c
100  *
101  *  INPUTS        : const unsigned char *source : Pointer to source data.
102  *                  unsigned int source_width    : Stride of source.
103  *                  unsigned char *dest         : Pointer to destination data.
104  *                  unsigned int dest_width      : Stride of destination (NOT USED).
105  *
106  *  OUTPUTS       : None.
107  *
108  *  RETURNS       : void
109  *
110  *  FUNCTION      : Copies horizontal line of pixels from source to
111  *                  destination scaling up by 3 to 5.
112  *
113  *  SPECIAL NOTES : None.
114  *
115  *
116  ****************************************************************************/
117 void vp8_horizontal_line_5_3_scale_c(const unsigned char *source,
118                                      unsigned int source_width,
119                                      unsigned char *dest,
120                                      unsigned int dest_width) {
121   unsigned int i;
122   unsigned int a, b, c, d, e;
123   unsigned char *des = dest;
124   const unsigned char *src = source;
125
126   (void) dest_width;
127
128   for (i = 0; i < source_width; i += 5) {
129     a = src[0];
130     b = src[1];
131     c = src[2];
132     d = src[3];
133     e = src[4];
134
135     des[0] = (unsigned char) a;
136     des[1] = (unsigned char)((b * 85  + c * 171 + 128) >> 8);
137     des[2] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
138
139     src += 5;
140     des += 3;
141   }
142
143 }
144
145 void vp8_vertical_band_5_3_scale_c(unsigned char *source,
146                                    unsigned int src_pitch,
147                                    unsigned char *dest,
148                                    unsigned int dest_pitch,
149                                    unsigned int dest_width) {
150   unsigned int i;
151   unsigned int a, b, c, d, e;
152   unsigned char *des = dest;
153   unsigned char *src = source;
154
155   for (i = 0; i < dest_width; i++) {
156
157     a = src[0 * src_pitch];
158     b = src[1 * src_pitch];
159     c = src[2 * src_pitch];
160     d = src[3 * src_pitch];
161     e = src[4 * src_pitch];
162
163     des[0 * dest_pitch] = (unsigned char) a;
164     des[1 * dest_pitch] = (unsigned char)((b * 85 + c * 171 + 128) >> 8);
165     des[2 * dest_pitch] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
166
167     src++;
168     des++;
169
170   }
171 }
172
173 /****************************************************************************
174  *
175  *  ROUTINE       : vp8_horizontal_line_1_2_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 1 to 2.
188  *
189  *  SPECIAL NOTES : None.
190  *
191  ****************************************************************************/
192 void vp8_horizontal_line_2_1_scale_c(const unsigned char *source,
193                                      unsigned int source_width,
194                                      unsigned char *dest,
195                                      unsigned int dest_width) {
196   unsigned int i;
197   unsigned int a;
198   unsigned char *des = dest;
199   const unsigned char *src = source;
200
201   (void) dest_width;
202
203   for (i = 0; i < source_width; i += 2) {
204     a = src[0];
205     des [0] = (unsigned char)(a);
206     src += 2;
207     des += 1;
208   }
209 }
210
211 void vp8_vertical_band_2_1_scale_c(unsigned char *source,
212                                    unsigned int src_pitch,
213                                    unsigned char *dest,
214                                    unsigned int dest_pitch,
215                                    unsigned int dest_width) {
216   (void) dest_pitch;
217   (void) src_pitch;
218   memcpy(dest, source, dest_width);
219 }
220
221 void vp8_vertical_band_2_1_scale_i_c(unsigned char *source,
222                                      unsigned int src_pitch,
223                                      unsigned char *dest,
224                                      unsigned int dest_pitch,
225                                      unsigned int dest_width) {
226   int i;
227   int temp;
228   int width = dest_width;
229
230   (void) dest_pitch;
231
232   for (i = 0; i < width; i++) {
233     temp = 8;
234     temp += source[i - (int)src_pitch] * 3;
235     temp += source[i] * 10;
236     temp += source[i + src_pitch] * 3;
237     temp >>= 4;
238     dest[i] = (unsigned char)(temp);
239   }
240 }