2 int srx = src_region_x, sry = src_region_y;
3 int srw = src_region_w, srh = src_region_h;
4 int drx = dst_region_x, dry = dst_region_y;
5 int drw = dst_region_w, drh = dst_region_h;
7 int dsxx, dsyy, sxx, syy, sx, sy;
9 int direct_scale = 0, buf_step = 0;
11 DATA32 *psrc, *pdst, *pdst_end;
12 DATA32 *buf, *pbuf, *pbuf_end;
15 /* a scanline buffer */
16 pdst = dst_ptr; // it's been set at (dst_clip_x, dst_clip_y)
17 pdst_end = pdst + (dst_clip_h * dst_w);
20 if ((dc->render_op == _EVAS_RENDER_BLEND) && !src->cache_entry.flags.alpha)
21 { direct_scale = 1; buf_step = dst->cache_entry.w; }
22 else if (dc->render_op == _EVAS_RENDER_COPY)
24 direct_scale = 1; buf_step = dst->cache_entry.w;
25 if (src->cache_entry.flags.alpha)
26 dst->cache_entry.flags.alpha = 1;
31 buf = alloca(dst_clip_w * sizeof(DATA32));
33 func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op);
35 func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op);
40 if ((srw > 1) && (drw > 1))
41 dsxx = ((srw - 1) << 16) / (drw - 1);
43 dsxx = (srw << 16) / drw;
44 if ((srh > 1) && (drh > 1))
45 dsyy = ((srh - 1) << 16) / (drh - 1);
47 dsyy = (srh << 16) / drh;
49 cx = dst_clip_x - drx;
50 cy = dst_clip_y - dry;
62 int ysli = dst_clip_y;
64 psrc = src->image.data + (src_w * (sry + cy)) + srx;
65 while (pdst < pdst_end)
68 if (((ysli) % dc->sli.h) == dc->sli.y)
71 pbuf = buf; pbuf_end = buf + dst_clip_w;
73 #ifdef SCALE_USING_MMX
75 MOV_A2R(ALPHA_255, mm5)
77 while (pbuf < pbuf_end)
83 ax = 1 + ((sxx - (sx << 16)) >> 8);
84 p0 = p1 = *(psrc + sx);
86 p1 = *(psrc + sx + 1);
87 #ifdef SCALE_USING_MMX
93 INTERP_256_R2R(mm3, mm2, mm1, mm5)
95 MOV_R2P(mm1, *pbuf, mm0)
99 p0 = INTERP_256(ax, p1, p0);
104 /* * blend here [clip_w *] buf -> dptr * */
106 func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
120 DATA32 *ps = src->image.data + (src_w * sry) + srx + cx;
122 int ysli = dst_clip_y;
125 while (pdst < pdst_end)
128 if (((ysli) % dc->sli.h) == dc->sli.y)
134 psrc = ps + (sy * src_w);
135 ay = 1 + ((syy - (sy << 16)) >> 8);
136 #ifdef SCALE_USING_MMX
138 MOV_A2R(ALPHA_255, mm5)
141 pbuf = buf; pbuf_end = buf + dst_clip_w;
142 while (pbuf < pbuf_end)
144 DATA32 p0 = *psrc, p2 = p0;
147 p2 = *(psrc + src_w);
148 #ifdef SCALE_USING_MMX
149 MOV_P2R(p0, mm1, mm0)
152 MOV_P2R(p2, mm2, mm0)
153 INTERP_256_R2R(mm4, mm2, mm1, mm5)
155 MOV_R2P(mm1, *pbuf, mm0)
159 p0 = INTERP_256(ay, p2, p0);
164 /* * blend here [clip_w *] buf -> dptr * */
166 func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
179 DATA32 *ps = src->image.data + (src_w * sry) + srx;
182 int ysli = dst_clip_y;
185 while (pdst < pdst_end)
188 if (((ysli) % dc->sli.h) == dc->sli.y)
194 psrc = ps + (sy * src_w);
195 ay = 1 + ((syy - (sy << 16)) >> 8);
196 #ifdef SCALE_USING_MMX
199 MOV_A2R(ALPHA_255, mm5)
201 pbuf = buf; pbuf_end = buf + dst_clip_w;
203 while (pbuf < pbuf_end)
207 DATA32 p0, p1, p2, p3;
210 ax = 1 + ((sxx - (sx << 16)) >> 8);
211 p = psrc + sx; q = p + src_w;
212 p0 = p1 = p2 = p3 = *p;
221 #ifdef SCALE_USING_MMX
223 MOV_P2R(p0, mm1, mm0)
226 MOV_P2R(p1, mm2, mm0)
227 INTERP_256_R2R(mm6, mm2, mm1, mm5)
229 MOV_P2R(p2, mm2, mm0)
232 MOV_P2R(p3, mm3, mm0)
233 INTERP_256_R2R(mm6, mm3, mm2, mm5)
235 INTERP_256_R2R(mm4, mm2, mm1, mm5)
236 MOV_R2P(mm1, *pbuf, mm0)
240 p0 = INTERP_256(ax, p1, p0);
242 p2 = INTERP_256(ax, p3, p2);
244 p0 = INTERP_256(ay, p2, p0);
249 /* * blend here [clip_w *] buf -> dptr * */
251 func(buf, NULL, dc->mul.col, pdst, dst_clip_w);