move around - flatter.
[profile/ivi/evas.git] / src / lib / engines / common / evas_scale_smooth_scaler_downy.c
1 {
2    int Cy, j;
3    DATA32 *dptr, *pix, *pbuf, **yp;
4    int r, g, b, a, rr, gg, bb, aa;
5    int *xp, xap, yap, pos;
6    int dyy, dxx;
7    int w = dst_clip_w;
8 #ifdef EVAS_SLI
9    int ysli = dst_clip_y;
10 #endif
11
12    dptr = dst_ptr;
13    pos = (src_region_y * src_w) + src_region_x;
14    dyy = dst_clip_y - dst_region_y;
15    dxx = dst_clip_x - dst_region_x;
16
17    xp = xpoints + dxx;
18    yp = ypoints + dyy;
19    xapp = xapoints + dxx;
20    yapp = yapoints + dyy;
21    pbuf = buf;
22
23    if (src->cache_entry.flags.alpha)
24      {
25         while (dst_clip_h--)
26           {
27 #ifdef EVAS_SLI
28              if (((ysli) % dc->sli.h) == dc->sli.y)
29 #endif
30                {
31                   Cy = *yapp >> 16;
32                   yap = *yapp & 0xffff;
33
34                   while (dst_clip_w--)
35                     {
36                        pix = *yp + *xp + pos;
37
38                        a = (A_VAL(pix) * yap) >> 10;
39                        r = (R_VAL(pix) * yap) >> 10;
40                        g = (G_VAL(pix) * yap) >> 10;
41                        b = (B_VAL(pix) * yap) >> 10;
42                        for (j = (1 << 14) - yap; j > Cy; j -= Cy)
43                          {
44                             pix += src_w;
45                             a += (A_VAL(pix) * Cy) >> 10;
46                             r += (R_VAL(pix) * Cy) >> 10;
47                             g += (G_VAL(pix) * Cy) >> 10;
48                             b += (B_VAL(pix) * Cy) >> 10;
49                          }
50                        if (j > 0)
51                          {
52                             pix += src_w;
53                             a += (A_VAL(pix) * j) >> 10;
54                             r += (R_VAL(pix) * j) >> 10;
55                             g += (G_VAL(pix) * j) >> 10;
56                             b += (B_VAL(pix) * j) >> 10;
57                          }
58                        if ((xap = *xapp) > 0)
59                          {
60                             pix = *yp + *xp + 1 + pos;
61                             aa = (A_VAL(pix) * yap) >> 10;
62                             rr = (R_VAL(pix) * yap) >> 10;
63                             gg = (G_VAL(pix) * yap) >> 10;
64                             bb = (B_VAL(pix) * yap) >> 10;
65                             for (j = (1 << 14) - yap; j > Cy; j -= Cy)
66                               {
67                                  pix += src_w;
68                                  aa += (A_VAL(pix) * Cy) >> 10;
69                                  rr += (R_VAL(pix) * Cy) >> 10;
70                                  gg += (G_VAL(pix) * Cy) >> 10;
71                                  bb += (B_VAL(pix) * Cy) >> 10;
72                               }
73                             if (j > 0)
74                               {
75                                  pix += src_w;
76                                  aa += (A_VAL(pix) * j) >> 10;
77                                  rr += (R_VAL(pix) * j) >> 10;
78                                  gg += (G_VAL(pix) * j) >> 10;
79                                  bb += (B_VAL(pix) * j) >> 10;
80                               }
81                             a += ((aa - a) * xap) >> 8;
82                             r += ((rr - r) * xap) >> 8;
83                             g += ((gg - g) * xap) >> 8;
84                             b += ((bb - b) * xap) >> 8;
85                          }
86                        *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4);
87                        xp++;  xapp++;
88                     }
89
90                   func(buf, NULL, dc->mul.col, dptr, w);
91                }
92 #ifdef EVAS_SLI
93              ysli++;
94 #endif
95              pbuf = buf;
96              dptr += dst_w;  dst_clip_w = w;
97              yp++;  yapp++;
98              xp = xpoints + dxx;
99              xapp = xapoints + dxx;
100           }
101      }
102    else
103      {
104 #ifdef DIRECT_SCALE
105         if ((!src->cache_entry.flags.alpha) &&
106             (!dst->cache_entry.flags.alpha) &&
107             (!dc->mul.use))
108           {
109              while (dst_clip_h--)
110                {
111 #ifdef EVAS_SLI
112                   if (((ysli) % dc->sli.h) == dc->sli.y)
113 #endif
114                     {
115                        Cy = *yapp >> 16;
116                        yap = *yapp & 0xffff;
117
118                        pbuf = dptr;
119                        while (dst_clip_w--)
120                          {
121                             pix = *yp + *xp + pos;
122
123                             r = (R_VAL(pix) * yap) >> 10;
124                             g = (G_VAL(pix) * yap) >> 10;
125                             b = (B_VAL(pix) * yap) >> 10;
126                             for (j = (1 << 14) - yap; j > Cy; j -= Cy)
127                               {
128                                  pix += src_w;
129                                  r += (R_VAL(pix) * Cy) >> 10;
130                                  g += (G_VAL(pix) * Cy) >> 10;
131                                  b += (B_VAL(pix) * Cy) >> 10;
132                               }
133                             if (j > 0)
134                               {
135                                  pix += src_w;
136                                  r += (R_VAL(pix) * j) >> 10;
137                                  g += (G_VAL(pix) * j) >> 10;
138                                  b += (B_VAL(pix) * j) >> 10;
139                               }
140                             if ((xap = *xapp) > 0)
141                               {
142                                  pix = *yp + *xp + 1 + pos;
143                                  rr = (R_VAL(pix) * yap) >> 10;
144                                  gg = (G_VAL(pix) * yap) >> 10;
145                                  bb = (B_VAL(pix) * yap) >> 10;
146                                  for (j = (1 << 14) - yap; j > Cy; j -= Cy)
147                                    {
148                                       pix += src_w;
149                                       rr += (R_VAL(pix) * Cy) >> 10;
150                                       gg += (G_VAL(pix) * Cy) >> 10;
151                                       bb += (B_VAL(pix) * Cy) >> 10;
152                                    }
153                                  if (j > 0)
154                                    {
155                                       pix += src_w;
156                                       rr += (R_VAL(pix) * j) >> 10;
157                                       gg += (G_VAL(pix) * j) >> 10;
158                                       bb += (B_VAL(pix) * j) >> 10;
159                                    }
160                                  r += ((rr - r) * xap) >> 8;
161                                  g += ((gg - g) * xap) >> 8;
162                                  b += ((bb - b) * xap) >> 8;
163                               }
164                             *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
165                             xp++;  xapp++;
166                          }
167                     }
168 #ifdef EVAS_SLI
169                   ysli++;
170 #endif
171                   dptr += dst_w;  dst_clip_w = w;
172                   yp++;  yapp++;
173                   xp = xpoints + dxx;
174                   xapp = xapoints + dxx;
175                }
176           }
177         else
178 #endif
179           {
180              while (dst_clip_h--)
181                {
182 #ifdef EVAS_SLI
183                   if (((ysli) % dc->sli.h) == dc->sli.y)
184 #endif
185                     {
186                        Cy = *yapp >> 16;
187                        yap = *yapp & 0xffff;
188
189                        while (dst_clip_w--)
190                          {
191                             pix = *yp + *xp + pos;
192
193                             r = (R_VAL(pix) * yap) >> 10;
194                             g = (G_VAL(pix) * yap) >> 10;
195                             b = (B_VAL(pix) * yap) >> 10;
196                             for (j = (1 << 14) - yap; j > Cy; j -= Cy)
197                               {
198                                  pix += src_w;
199                                  r += (R_VAL(pix) * Cy) >> 10;
200                                  g += (G_VAL(pix) * Cy) >> 10;
201                                  b += (B_VAL(pix) * Cy) >> 10;
202                               }
203                             if (j > 0)
204                               {
205                                  pix += src_w;
206                                  r += (R_VAL(pix) * j) >> 10;
207                                  g += (G_VAL(pix) * j) >> 10;
208                                  b += (B_VAL(pix) * j) >> 10;
209                               }
210                             if ((xap = *xapp) > 0)
211                               {
212                                  pix = *yp + *xp + 1 + pos;
213                                  rr = (R_VAL(pix) * yap) >> 10;
214                                  gg = (G_VAL(pix) * yap) >> 10;
215                                  bb = (B_VAL(pix) * yap) >> 10;
216                                  for (j = (1 << 14) - yap; j > Cy; j -= Cy)
217                                    {
218                                       pix += src_w;
219                                       rr += (R_VAL(pix) * Cy) >> 10;
220                                       gg += (G_VAL(pix) * Cy) >> 10;
221                                       bb += (B_VAL(pix) * Cy) >> 10;
222                                    }
223                                  if (j > 0)
224                                    {
225                                       pix += src_w;
226                                       rr += (R_VAL(pix) * j) >> 10;
227                                       gg += (G_VAL(pix) * j) >> 10;
228                                       bb += (B_VAL(pix) * j) >> 10;
229                                    }
230                                  r += ((rr - r) * xap) >> 8;
231                                  g += ((gg - g) * xap) >> 8;
232                                  b += ((bb - b) * xap) >> 8;
233                               }
234                             *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
235                             xp++;  xapp++;
236                          }
237
238                        func(buf, NULL, dc->mul.col, dptr, w);
239                     }
240 #ifdef EVAS_SLI
241                   ysli++;
242 #endif
243                   pbuf = buf;
244                   dptr += dst_w;  dst_clip_w = w;
245                   yp++;  yapp++;
246                   xp = xpoints + dxx;
247                   xapp = xapoints + dxx;
248                }
249           }
250      }
251 }