move around - flatter.
[profile/ivi/evas.git] / src / lib / engines / common / evas_scale_smooth_scaler_downx_downy.c
1 {
2    int Cx, Cy, i, j;
3    DATA32 *dptr, *sptr, *pix, *pbuf;
4    int a, r, g, b, rx, gx, bx, ax;
5    int xap, yap, pos;
6    int dyy, dxx;
7 #ifdef EVAS_SLI
8    int ysli = dst_clip_y;
9 #endif
10    
11    DATA32  **yp; 
12    int *xp;
13    int w = dst_clip_w;
14
15    dptr = dst_ptr;
16    pos = (src_region_y * src_w) + src_region_x;
17    dyy = dst_clip_y - dst_region_y;
18    dxx = dst_clip_x - dst_region_x;
19
20    xp = xpoints + dxx;
21    yp = ypoints + dyy;
22    xapp = xapoints + dxx;
23    yapp = yapoints + dyy;
24    pbuf = buf;
25 /*#ifndef SCALE_USING_MMX */
26 /* for now there's no mmx down scaling - so C only */
27 #if 1
28    if (src->cache_entry.flags.alpha)
29      {
30         while (dst_clip_h--)
31           {
32 #ifdef EVAS_SLI
33              if (((ysli) % dc->sli.h) == dc->sli.y)
34 #endif
35                {
36                   Cy = *yapp >> 16;
37                   yap = *yapp & 0xffff;
38                   
39                   while (dst_clip_w--)
40                     {
41                        Cx = *xapp >> 16;
42                        xap = *xapp & 0xffff;
43                        
44                        sptr = *yp + *xp + pos;
45                        pix = sptr;
46                        sptr += src_w;
47                        
48                        ax = (A_VAL(pix) * xap) >> 9;
49                        rx = (R_VAL(pix) * xap) >> 9;
50                        gx = (G_VAL(pix) * xap) >> 9;
51                        bx = (B_VAL(pix) * xap) >> 9;
52                        pix++;
53                        for (i = (1 << 14) - xap; i > Cx; i -= Cx)
54                          {
55                             ax += (A_VAL(pix) * Cx) >> 9;
56                             rx += (R_VAL(pix) * Cx) >> 9;
57                             gx += (G_VAL(pix) * Cx) >> 9;
58                             bx += (B_VAL(pix) * Cx) >> 9;
59                             pix++;
60                          }
61                        if (i > 0)
62                          {
63                             ax += (A_VAL(pix) * i) >> 9;
64                             rx += (R_VAL(pix) * i) >> 9;
65                             gx += (G_VAL(pix) * i) >> 9;
66                             bx += (B_VAL(pix) * i) >> 9;
67                          }
68                        
69                        a = (ax * yap) >> 14;
70                        r = (rx * yap) >> 14;
71                        g = (gx * yap) >> 14;
72                        b = (bx * yap) >> 14;
73                        
74                        for (j = (1 << 14) - yap; j > Cy; j -= Cy)
75                          {
76                             pix = sptr;
77                             sptr += src_w;
78                             ax = (A_VAL(pix) * xap) >> 9;
79                             rx = (R_VAL(pix) * xap) >> 9;
80                             gx = (G_VAL(pix) * xap) >> 9;
81                             bx = (B_VAL(pix) * xap) >> 9;
82                             pix++;
83                             for (i = (1 << 14) - xap; i > Cx; i -= Cx)
84                               {
85                                  ax += (A_VAL(pix) * Cx) >> 9;
86                                  rx += (R_VAL(pix) * Cx) >> 9;
87                                  gx += (G_VAL(pix) * Cx) >> 9;
88                                  bx += (B_VAL(pix) * Cx) >> 9;
89                                  pix++;
90                               }
91                             if (i > 0)
92                               {
93                                  ax += (A_VAL(pix) * i) >> 9;
94                                  rx += (R_VAL(pix) * i) >> 9;
95                                  gx += (G_VAL(pix) * i) >> 9;
96                                  bx += (B_VAL(pix) * i) >> 9;
97                               }
98                             
99                             a += (ax * Cy) >> 14;
100                             r += (rx * Cy) >> 14;
101                             g += (gx * Cy) >> 14;
102                             b += (bx * Cy) >> 14;
103                          }
104                        if (j > 0)
105                          {
106                             pix = sptr;
107                             sptr += src_w;
108                             ax = (A_VAL(pix) * xap) >> 9;
109                             rx = (R_VAL(pix) * xap) >> 9;
110                             gx = (G_VAL(pix) * xap) >> 9;
111                             bx = (B_VAL(pix) * xap) >> 9;
112                             pix++;
113                             for (i = (1 << 14) - xap; i > Cx; i -= Cx)
114                               {
115                                  ax += (A_VAL(pix) * Cx) >> 9;
116                                  rx += (R_VAL(pix) * Cx) >> 9;
117                                  gx += (G_VAL(pix) * Cx) >> 9;
118                                  bx += (B_VAL(pix) * Cx) >> 9;
119                                  pix++;
120                               }
121                             if (i > 0)
122                               {
123                                  ax += (A_VAL(pix) * i) >> 9;
124                                  rx += (R_VAL(pix) * i) >> 9;
125                                  gx += (G_VAL(pix) * i) >> 9;
126                                  bx += (B_VAL(pix) * i) >> 9;
127                               }
128                             
129                             a += (ax * j) >> 14;
130                             r += (rx * j) >> 14;
131                             g += (gx * j) >> 14;
132                             b += (bx * j) >> 14;
133                          }
134                        *pbuf++ = ARGB_JOIN(a >> 5, r >> 5, g >> 5, b >> 5);
135                        xp++;  xapp++;
136                     }
137                   
138                   func(buf, NULL, dc->mul.col, dptr, w);
139                }
140 #ifdef EVAS_SLI
141              ysli++;
142 #endif
143              pbuf = buf;
144              dptr += dst_w;   dst_clip_w = w;
145              xp = xpoints + dxx;
146              xapp = xapoints + dxx;
147              yp++;  yapp++;
148           }
149      }
150    else
151      {
152 #ifdef DIRECT_SCALE
153         if ((!src->cache_entry.flags.alpha) &&
154             (!dst->cache_entry.flags.alpha) &&
155             (!dc->mul.use))
156           {
157              while (dst_clip_h--)
158                {
159 #ifdef EVAS_SLI
160                   if (((ysli) % dc->sli.h) == dc->sli.y)
161 #endif
162                     {
163                        Cy = *yapp >> 16;
164                        yap = *yapp & 0xffff;
165                        
166                        pbuf = dptr;
167                        while (dst_clip_w--)
168                          {
169                             Cx = *xapp >> 16;
170                             xap = *xapp & 0xffff;
171                             
172                             sptr = *yp + *xp + pos;
173                             pix = sptr;
174                             sptr += src_w;
175                             
176                             rx = (R_VAL(pix) * xap) >> 9;
177                             gx = (G_VAL(pix) * xap) >> 9;
178                             bx = (B_VAL(pix) * xap) >> 9;
179                             pix++;
180                             for (i = (1 << 14) - xap; i > Cx; i -= Cx)
181                               {
182                                  rx += (R_VAL(pix) * Cx) >> 9;
183                                  gx += (G_VAL(pix) * Cx) >> 9;
184                                  bx += (B_VAL(pix) * Cx) >> 9;
185                                  pix++;
186                               }
187                             if (i > 0)
188                               {
189                                  rx += (R_VAL(pix) * i) >> 9;
190                                  gx += (G_VAL(pix) * i) >> 9;
191                                  bx += (B_VAL(pix) * i) >> 9;
192                               }
193                             
194                             r = (rx * yap) >> 14;
195                             g = (gx * yap) >> 14;
196                             b = (bx * yap) >> 14;
197                             
198                             for (j = (1 << 14) - yap; j > Cy; j -= Cy)
199                               {
200                                  pix = sptr;
201                                  sptr += src_w;
202                                  rx = (R_VAL(pix) * xap) >> 9;
203                                  gx = (G_VAL(pix) * xap) >> 9;
204                                  bx = (B_VAL(pix) * xap) >> 9;
205                                  pix++;
206                                  for (i = (1 << 14) - xap; i > Cx; i -= Cx)
207                                    {
208                                       rx += (R_VAL(pix) * Cx) >> 9;
209                                       gx += (G_VAL(pix) * Cx) >> 9;
210                                       bx += (B_VAL(pix) * Cx) >> 9;
211                                       pix++;
212                                    }
213                                  if (i > 0)
214                                    {
215                                       rx += (R_VAL(pix) * i) >> 9;
216                                       gx += (G_VAL(pix) * i) >> 9;
217                                       bx += (B_VAL(pix) * i) >> 9;
218                                    }
219                                  
220                                  r += (rx * Cy) >> 14;
221                                  g += (gx * Cy) >> 14;
222                                  b += (bx * Cy) >> 14;
223                               }
224                             if (j > 0)
225                               {
226                                  pix = sptr;
227                                  sptr += src_w;
228                                  rx = (R_VAL(pix) * xap) >> 9;
229                                  gx = (G_VAL(pix) * xap) >> 9;
230                                  bx = (B_VAL(pix) * xap) >> 9;
231                                  pix++;
232                                  for (i = (1 << 14) - xap; i > Cx; i -= Cx)
233                                    {
234                                       rx += (R_VAL(pix) * Cx) >> 9;
235                                       gx += (G_VAL(pix) * Cx) >> 9;
236                                       bx += (B_VAL(pix) * Cx) >> 9;
237                                       pix++;
238                                    }
239                                  if (i > 0)
240                                    {
241                                       rx += (R_VAL(pix) * i) >> 9;
242                                       gx += (G_VAL(pix) * i) >> 9;
243                                       bx += (B_VAL(pix) * i) >> 9;
244                                    }
245                                  
246                                  r += (rx * j) >> 14;
247                                  g += (gx * j) >> 14;
248                                  b += (bx * j) >> 14;
249                               }
250                             *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
251                             xp++;  xapp++;
252                          }
253                     }
254 #ifdef EVAS_SLI
255                   ysli++;
256 #endif
257                   dptr += dst_w;   dst_clip_w = w;
258                   xp = xpoints + dxx;
259                   xapp = xapoints + dxx;
260                   yp++;  yapp++;
261                }
262           }
263         else
264 #endif    
265           {
266              while (dst_clip_h--)
267                {
268 #ifdef EVAS_SLI
269                   if (((ysli) % dc->sli.h) == dc->sli.y)
270 #endif
271                     {
272                        Cy = *yapp >> 16;
273                        yap = *yapp & 0xffff;
274                        
275                        while (dst_clip_w--)
276                          {
277                             Cx = *xapp >> 16;
278                             xap = *xapp & 0xffff;
279                             
280                             sptr = *yp + *xp + pos;
281                             pix = sptr;
282                             sptr += src_w;
283                             
284                             rx = (R_VAL(pix) * xap) >> 9;
285                             gx = (G_VAL(pix) * xap) >> 9;
286                             bx = (B_VAL(pix) * xap) >> 9;
287                             pix++;
288                             for (i = (1 << 14) - xap; i > Cx; i -= Cx)
289                               {
290                                  rx += (R_VAL(pix) * Cx) >> 9;
291                                  gx += (G_VAL(pix) * Cx) >> 9;
292                                  bx += (B_VAL(pix) * Cx) >> 9;
293                                  pix++;
294                               }
295                             if (i > 0)
296                               {
297                                  rx += (R_VAL(pix) * i) >> 9;
298                                  gx += (G_VAL(pix) * i) >> 9;
299                                  bx += (B_VAL(pix) * i) >> 9;
300                               }
301                             
302                             r = (rx * yap) >> 14;
303                             g = (gx * yap) >> 14;
304                             b = (bx * yap) >> 14;
305                             
306                             for (j = (1 << 14) - yap; j > Cy; j -= Cy)
307                               {
308                                  pix = sptr;
309                                  sptr += src_w;
310                                  rx = (R_VAL(pix) * xap) >> 9;
311                                  gx = (G_VAL(pix) * xap) >> 9;
312                                  bx = (B_VAL(pix) * xap) >> 9;
313                                  pix++;
314                                  for (i = (1 << 14) - xap; i > Cx; i -= Cx)
315                                    {
316                                       rx += (R_VAL(pix) * Cx) >> 9;
317                                       gx += (G_VAL(pix) * Cx) >> 9;
318                                       bx += (B_VAL(pix) * Cx) >> 9;
319                                       pix++;
320                                    }
321                                  if (i > 0)
322                                    {
323                                       rx += (R_VAL(pix) * i) >> 9;
324                                       gx += (G_VAL(pix) * i) >> 9;
325                                       bx += (B_VAL(pix) * i) >> 9;
326                                    }
327                                  
328                                  r += (rx * Cy) >> 14;
329                                  g += (gx * Cy) >> 14;
330                                  b += (bx * Cy) >> 14;
331                               }
332                             if (j > 0)
333                               {
334                                  pix = sptr;
335                                  sptr += src_w;
336                                  rx = (R_VAL(pix) * xap) >> 9;
337                                  gx = (G_VAL(pix) * xap) >> 9;
338                                  bx = (B_VAL(pix) * xap) >> 9;
339                                  pix++;
340                                  for (i = (1 << 14) - xap; i > Cx; i -= Cx)
341                                    {
342                                       rx += (R_VAL(pix) * Cx) >> 9;
343                                       gx += (G_VAL(pix) * Cx) >> 9;
344                                       bx += (B_VAL(pix) * Cx) >> 9;
345                                       pix++;
346                                    }
347                                  if (i > 0)
348                                    {
349                                       rx += (R_VAL(pix) * i) >> 9;
350                                       gx += (G_VAL(pix) * i) >> 9;
351                                       bx += (B_VAL(pix) * i) >> 9;
352                                    }
353                                  
354                                  r += (rx * j) >> 14;
355                                  g += (gx * j) >> 14;
356                                  b += (bx * j) >> 14;
357                               }
358                             *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
359                             xp++;  xapp++;
360                          }
361                        
362                        func(buf, NULL, dc->mul.col, dptr, w);
363                     }
364 #ifdef EVAS_SLI
365                   ysli++;
366 #endif
367                   pbuf = buf;
368                   dptr += dst_w;   dst_clip_w = w;
369                   xp = xpoints + dxx;
370                   xapp = xapoints + dxx;
371                   yp++;  yapp++;
372                }
373           }
374      }
375 #else
376    /* MMX scaling down would go here */
377 #endif
378 }