summaryrefslogtreecommitdiff
path: root/src/lib/evas/common/evas_scale_smooth_scaler_downx.c
blob: 544b8c271ea824b5b1ce37f0e6542e0a48eab535 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
{
   int Cx, j;
   DATA32 *pix, *dptr, *pbuf, **yp;
   int r, g, b, a, rr, gg, bb, aa;
   int *xp, xap, yap, pos;
   //int dyy, dxx;
   int w = dst_clip_w;

   dptr = dst_ptr;
   pos = (src_region_y * src_w) + src_region_x;
   //dyy = dst_clip_y - dst_region_y;
   //dxx = dst_clip_x - dst_region_x;

   xp = xpoints;// + dxx;
   yp = ypoints;// + dyy;
   xapp = xapoints;// + dxx;
   yapp = yapoints;// + dyy;
   pbuf = buf;

   if (src->cache_entry.flags.alpha)
     {
	while (dst_clip_h--)
	  {
	    while (dst_clip_w--)
	      {
		Cx = *xapp >> 16;
		xap = *xapp & 0xffff;
		pix = *yp + *xp + pos;

		a = (A_VAL(pix) * xap) >> 10;
		r = (R_VAL(pix) * xap) >> 10;
		g = (G_VAL(pix) * xap) >> 10;
		b = (B_VAL(pix) * xap) >> 10;
		for (j = (1 << 14) - xap; j > Cx; j -= Cx)
		  {
		    pix++;
		    a += (A_VAL(pix) * Cx) >> 10;
		    r += (R_VAL(pix) * Cx) >> 10;
		    g += (G_VAL(pix) * Cx) >> 10;
		    b += (B_VAL(pix) * Cx) >> 10;
		  }
		if (j > 0)
		  {
		    pix++;
		    a += (A_VAL(pix) * j) >> 10;
		    r += (R_VAL(pix) * j) >> 10;
		    g += (G_VAL(pix) * j) >> 10;
		    b += (B_VAL(pix) * j) >> 10;
		  }
		if ((yap = *yapp) > 0)
		  {
		    pix = *yp + *xp + src_w + pos;
		    aa = (A_VAL(pix) * xap) >> 10;
		    rr = (R_VAL(pix) * xap) >> 10;
		    gg = (G_VAL(pix) * xap) >> 10;
		    bb = (B_VAL(pix) * xap) >> 10;
		    for (j = (1 << 14) - xap; j > Cx; j -= Cx)
		      {
			pix++;
			aa += (A_VAL(pix) * Cx) >> 10;
			rr += (R_VAL(pix) * Cx) >> 10;
			gg += (G_VAL(pix) * Cx) >> 10;
			bb += (B_VAL(pix) * Cx) >> 10;
		      }
		    if (j > 0)
		      {
			pix++;
			aa += (A_VAL(pix) * j) >> 10;
			rr += (R_VAL(pix) * j) >> 10;
			gg += (G_VAL(pix) * j) >> 10;
			bb += (B_VAL(pix) * j) >> 10;
		      }
		    a += ((aa - a) * yap) >> 8;
		    r += ((rr - r) * yap) >> 8;
		    g += ((gg - g) * yap) >> 8;
		    b += ((bb - b) * yap) >> 8;
		  }
		*pbuf++ = ARGB_JOIN(((a + (1 << 3)) >> 4),
				    ((r + (1 << 3)) >> 4),
				    ((g + (1 << 3)) >> 4),
				    ((b + (1 << 3)) >> 4));
		xp++;  xapp++;
	      }

	    func(buf, NULL, dc->mul.col, dptr, w);

	    pbuf = buf;
	    dptr += dst_w;  dst_clip_w = w;
	    yp++;  yapp++;
	    xp = xpoints;// + dxx;
	    xapp = xapoints;// + dxx;
	  }
     }
   else
     {
#ifdef DIRECT_SCALE
        if ((!src->cache_entry.flags.alpha) &&
	    (!dst->cache_entry.flags.alpha) &&
	    (!dc->mul.use))
	  {
	     while (dst_clip_h--)
	       {
                  pbuf = dptr;

		  while (dst_clip_w--)
		    {
		      Cx = *xapp >> 16;
		      xap = *xapp & 0xffff;
		      pix = *yp + *xp + pos;

		      r = (R_VAL(pix) * xap) >> 10;
		      g = (G_VAL(pix) * xap) >> 10;
		      b = (B_VAL(pix) * xap) >> 10;
		      for (j = (1 << 14) - xap; j > Cx; j -= Cx)
			{
			  pix++;
			  r += (R_VAL(pix) * Cx) >> 10;
			  g += (G_VAL(pix) * Cx) >> 10;
			  b += (B_VAL(pix) * Cx) >> 10;
			}
		      if (j > 0)
			{
			  pix++;
			  r += (R_VAL(pix) * j) >> 10;
			  g += (G_VAL(pix) * j) >> 10;
			  b += (B_VAL(pix) * j) >> 10;
			}
		      if ((yap = *yapp) > 0)
			{
			  pix = *yp + *xp + src_w + pos;
			  rr = (R_VAL(pix) * xap) >> 10;
			  gg = (G_VAL(pix) * xap) >> 10;
			  bb = (B_VAL(pix) * xap) >> 10;
			  for (j = (1 << 14) - xap; j > Cx; j -= Cx)
			    {
			      pix++;
			      rr += (R_VAL(pix) * Cx) >> 10;
			      gg += (G_VAL(pix) * Cx) >> 10;
			      bb += (B_VAL(pix) * Cx) >> 10;
			    }
			  if (j > 0)
			    {
			      pix++;
			      rr += (R_VAL(pix) * j) >> 10;
			      gg += (G_VAL(pix) * j) >> 10;
			      bb += (B_VAL(pix) * j) >> 10;
			    }
			  r += ((rr - r) * yap) >> 8;
			  g += ((gg - g) * yap) >> 8;
			  b += ((bb - b) * yap) >> 8;
			}
		      *pbuf++ = ARGB_JOIN(0xff,
					  ((r + (1 << 3)) >> 4),
					  ((g + (1 << 3)) >> 4),
					  ((b + (1 << 3)) >> 4));
		      xp++;  xapp++;
		    }
		  
		  dptr += dst_w;  dst_clip_w = w;
		  yp++;  yapp++;
		  xp = xpoints;// + dxx;
		  xapp = xapoints;// + dxx;
	       }
	  }
	else
#endif
	  {
	     while (dst_clip_h--)
	       {
		 while (dst_clip_w--)
		   {
		     Cx = *xapp >> 16;
		     xap = *xapp & 0xffff;
		     pix = *yp + *xp + pos;

		     r = (R_VAL(pix) * xap) >> 10;
		     g = (G_VAL(pix) * xap) >> 10;
		     b = (B_VAL(pix) * xap) >> 10;
		     for (j = (1 << 14) - xap; j > Cx; j -= Cx)
		       {
			 pix++;
			 r += (R_VAL(pix) * Cx) >> 10;
			 g += (G_VAL(pix) * Cx) >> 10;
			 b += (B_VAL(pix) * Cx) >> 10;
		       }
		     if (j > 0)
		       {
			 pix++;
			 r += (R_VAL(pix) * j) >> 10;
			 g += (G_VAL(pix) * j) >> 10;
			 b += (B_VAL(pix) * j) >> 10;
		       }
		     if ((yap = *yapp) > 0)
		       {
			 pix = *yp + *xp + src_w + pos;
			 rr = (R_VAL(pix) * xap) >> 10;
			 gg = (G_VAL(pix) * xap) >> 10;
			 bb = (B_VAL(pix) * xap) >> 10;
			 for (j = (1 << 14) - xap; j > Cx; j -= Cx)
			   {
			     pix++;
			     rr += (R_VAL(pix) * Cx) >> 10;
			     gg += (G_VAL(pix) * Cx) >> 10;
			     bb += (B_VAL(pix) * Cx) >> 10;
			   }
			 if (j > 0)
			   {
			     pix++;
			     rr += (R_VAL(pix) * j) >> 10;
			     gg += (G_VAL(pix) * j) >> 10;
			     bb += (B_VAL(pix) * j) >> 10;
			   }
			 r += ((rr - r) * yap) >> 8;
			 g += ((gg - g) * yap) >> 8;
			 b += ((bb - b) * yap) >> 8;
		       }
		     *pbuf++ = ARGB_JOIN(0xff,
					 ((r + (1 << 3)) >> 4),
					 ((g + (1 << 3)) >> 4),
					 ((b + (1 << 3)) >> 4));
		     xp++;  xapp++;
		   }
		 
		 func(buf, NULL, dc->mul.col, dptr, w);

		 pbuf = buf;
		 dptr += dst_w;  dst_clip_w = w;
		 yp++;  yapp++;
		 xp = xpoints;// + dxx;
		 xapp = xapoints;// + dxx;
	       }
	  }
     }
}