summaryrefslogtreecommitdiff
path: root/src/lib/evas/common/evas_scale_smooth_scaler_downy.c
blob: 7e1c741f2e59b72a397fb1019f66e1a0415a899f (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
235
236
{
   int Cy, j;
   DATA32 *dptr, *pix, *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--)
	  {
	    Cy = *yapp >> 16;
	    yap = *yapp & 0xffff;

	    while (dst_clip_w--)
	      {
		pix = *yp + *xp + pos;

		a = (A_VAL(pix) * yap) >> 10;
		r = (R_VAL(pix) * yap) >> 10;
		g = (G_VAL(pix) * yap) >> 10;
		b = (B_VAL(pix) * yap) >> 10;
		for (j = (1 << 14) - yap; j > Cy; j -= Cy)
		  {
		    pix += src_w;
		    a += (A_VAL(pix) * Cy) >> 10;
		    r += (R_VAL(pix) * Cy) >> 10;
		    g += (G_VAL(pix) * Cy) >> 10;
		    b += (B_VAL(pix) * Cy) >> 10;
		  }
		if (j > 0)
		  {
		    pix += src_w;
		    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 ((xap = *xapp) > 0)
		  {
		    pix = *yp + *xp + 1 + pos;
		    aa = (A_VAL(pix) * yap) >> 10;
		    rr = (R_VAL(pix) * yap) >> 10;
		    gg = (G_VAL(pix) * yap) >> 10;
		    bb = (B_VAL(pix) * yap) >> 10;
		    for (j = (1 << 14) - yap; j > Cy; j -= Cy)
		      {
			pix += src_w;
			aa += (A_VAL(pix) * Cy) >> 10;
			rr += (R_VAL(pix) * Cy) >> 10;
			gg += (G_VAL(pix) * Cy) >> 10;
			bb += (B_VAL(pix) * Cy) >> 10;
		      }
		    if (j > 0)
		      {
			pix += src_w;
			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) * xap) >> 8;
		    r += ((rr - r) * xap) >> 8;
		    g += ((gg - g) * xap) >> 8;
		    b += ((bb - b) * xap) >> 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, 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) &&
	    (mul_col == 0xffffffff))
	  {
	     while (dst_clip_h--)
	       {
		 Cy = *yapp >> 16;
		 yap = *yapp & 0xffff;

		 pbuf = dptr;
		 while (dst_clip_w--)
		   {
		     pix = *yp + *xp + pos;

		     r = (R_VAL(pix) * yap) >> 10;
		     g = (G_VAL(pix) * yap) >> 10;
		     b = (B_VAL(pix) * yap) >> 10;
		     for (j = (1 << 14) - yap; j > Cy; j -= Cy)
		       {
			 pix += src_w;
			 r += (R_VAL(pix) * Cy) >> 10;
			 g += (G_VAL(pix) * Cy) >> 10;
			 b += (B_VAL(pix) * Cy) >> 10;
		       }
		     if (j > 0)
		       {
			 pix += src_w;
			 r += (R_VAL(pix) * j) >> 10;
			 g += (G_VAL(pix) * j) >> 10;
			 b += (B_VAL(pix) * j) >> 10;
		       }
		     if ((xap = *xapp) > 0)
		       {
			 pix = *yp + *xp + 1 + pos;
			 rr = (R_VAL(pix) * yap) >> 10;
			 gg = (G_VAL(pix) * yap) >> 10;
			 bb = (B_VAL(pix) * yap) >> 10;
			 for (j = (1 << 14) - yap; j > Cy; j -= Cy)
			   {
			     pix += src_w;
			     rr += (R_VAL(pix) * Cy) >> 10;
			     gg += (G_VAL(pix) * Cy) >> 10;
			     bb += (B_VAL(pix) * Cy) >> 10;
			   }
			 if (j > 0)
			   {
			     pix += src_w;
			     rr += (R_VAL(pix) * j) >> 10;
			     gg += (G_VAL(pix) * j) >> 10;
			     bb += (B_VAL(pix) * j) >> 10;
			   }
			 r += ((rr - r) * xap) >> 8;
			 g += ((gg - g) * xap) >> 8;
			 b += ((bb - b) * xap) >> 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--)
	       {
		 Cy = *yapp >> 16;
		 yap = *yapp & 0xffff;

		 while (dst_clip_w--)
		   {
		     pix = *yp + *xp + pos;

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

		 func(buf, NULL, mul_col, dptr, w);

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