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