aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/lib/engines/common/evas_scale_sample.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/lib/engines/common/evas_scale_sample.c')
-rw-r--r--libraries/evas/src/lib/engines/common/evas_scale_sample.c418
1 files changed, 0 insertions, 418 deletions
diff --git a/libraries/evas/src/lib/engines/common/evas_scale_sample.c b/libraries/evas/src/lib/engines/common/evas_scale_sample.c
deleted file mode 100644
index c721c5e..0000000
--- a/libraries/evas/src/lib/engines/common/evas_scale_sample.c
+++ /dev/null
@@ -1,418 +0,0 @@
1#include "evas_common.h"
2#include "evas_blend_private.h"
3
4void scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h);
5
6#ifndef BUILD_SCALE_SMOOTH
7#ifdef BUILD_SCALE_SAMPLE
8EAPI void
9evas_common_scale_rgba_in_to_out_clip_smooth(RGBA_Image *src, RGBA_Image *dst,
10 RGBA_Draw_Context *dc,
11 int src_region_x, int src_region_y,
12 int src_region_w, int src_region_h,
13 int dst_region_x, int dst_region_y,
14 int dst_region_w, int dst_region_h)
15{
16 evas_common_scale_rgba_in_to_out_clip_sample(src, dst, dc,
17 src_region_x, src_region_y,
18 src_region_w, src_region_h,
19 dst_region_x, dst_region_y,
20 dst_region_w, dst_region_h);
21}
22#endif
23#endif
24
25#ifdef BUILD_SCALE_SAMPLE
26EAPI void
27evas_common_scale_rgba_in_to_out_clip_sample(RGBA_Image *src, RGBA_Image *dst,
28 RGBA_Draw_Context *dc,
29 int src_region_x, int src_region_y,
30 int src_region_w, int src_region_h,
31 int dst_region_x, int dst_region_y,
32 int dst_region_w, int dst_region_h)
33{
34 Cutout_Rects *rects;
35 Cutout_Rect *r;
36 int c, cx, cy, cw, ch;
37 int i;
38 /* handle cutouts here! */
39
40 if ((dst_region_w <= 0) || (dst_region_h <= 0)) return;
41 if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
42 return;
43 /* no cutouts - cut right to the chase */
44 if (!dc->cutout.rects)
45 {
46 scale_rgba_in_to_out_clip_sample_internal(src, dst, dc,
47 src_region_x, src_region_y,
48 src_region_w, src_region_h,
49 dst_region_x, dst_region_y,
50 dst_region_w, dst_region_h);
51 return;
52 }
53 /* save out clip info */
54 c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h;
55 evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
56 evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h);
57 /* our clip is 0 size.. abort */
58 if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
59 {
60 dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
61 return;
62 }
63 rects = evas_common_draw_context_apply_cutouts(dc);
64 for (i = 0; i < rects->active; ++i)
65 {
66 r = rects->rects + i;
67 evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
68 scale_rgba_in_to_out_clip_sample_internal(src, dst, dc,
69 src_region_x, src_region_y,
70 src_region_w, src_region_h,
71 dst_region_x, dst_region_y,
72 dst_region_w, dst_region_h);
73
74 }
75 evas_common_draw_context_apply_clear_cutouts(rects);
76 /* restore clip info */
77 dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch;
78}
79
80void
81scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst,
82 RGBA_Draw_Context *dc,
83 int src_region_x, int src_region_y,
84 int src_region_w, int src_region_h,
85 int dst_region_x, int dst_region_y,
86 int dst_region_w, int dst_region_h)
87{
88 int x, y;
89 int *lin_ptr;
90 DATA32 *buf, *dptr;
91 DATA32 **row_ptr;
92 DATA32 *ptr, *dst_ptr, *src_data, *dst_data;
93 int dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h;
94 int m_clip_x = 0, m_clip_y = 0, m_clip_w = 0, m_clip_h = 0, mdx = 0, mdy = 0;
95 int src_w, src_h, dst_w, dst_h;
96 RGBA_Gfx_Func func;
97 RGBA_Image *maskobj = NULL;
98 DATA8 *mask = NULL;
99
100 if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
101 return;
102 if (!(RECTS_INTERSECT(src_region_x, src_region_y, src_region_w, src_region_h, 0, 0, src->cache_entry.w, src->cache_entry.h)))
103 return;
104
105 src_w = src->cache_entry.w;
106 src_h = src->cache_entry.h;
107 dst_w = dst->cache_entry.w;
108 dst_h = dst->cache_entry.h;
109
110 src_data = src->image.data;
111 dst_data = dst->image.data;
112
113 if (dc->clip.use)
114 {
115 dst_clip_x = dc->clip.x;
116 dst_clip_y = dc->clip.y;
117 dst_clip_w = dc->clip.w;
118 dst_clip_h = dc->clip.h;
119 if (dst_clip_x < 0)
120 {
121 dst_clip_w += dst_clip_x;
122 dst_clip_x = 0;
123 }
124 if (dst_clip_y < 0)
125 {
126 dst_clip_h += dst_clip_y;
127 dst_clip_y = 0;
128 }
129 if ((dst_clip_x + dst_clip_w) > dst_w)
130 dst_clip_w = dst_w - dst_clip_x;
131 if ((dst_clip_y + dst_clip_h) > dst_h)
132 dst_clip_h = dst_h - dst_clip_y;
133 }
134 else
135 {
136 dst_clip_x = 0;
137 dst_clip_y = 0;
138 dst_clip_w = dst_w;
139 dst_clip_h = dst_h;
140 }
141
142 if (dc->mask.mask)
143 {
144 m_clip_x = dc->mask.x;
145 m_clip_y = dc->mask.y;
146 m_clip_w = dc->mask.mask->cache_entry.w;
147 m_clip_h = dc->mask.mask->cache_entry.h;
148 RECTS_CLIP_TO_RECT(m_clip_x, m_clip_y, m_clip_w, m_clip_h,
149 dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h);
150 if ((m_clip_w <= 0) || (m_clip_h <= 0)) return;
151 dst_clip_x = m_clip_x;
152 dst_clip_y = m_clip_y;
153 dst_clip_w = m_clip_w;
154 dst_clip_h = m_clip_h;
155 }
156
157 if (dst_clip_x < dst_region_x)
158 {
159 dst_clip_w += dst_clip_x - dst_region_x;
160 dst_clip_x = dst_region_x;
161 }
162 if ((dst_clip_x + dst_clip_w) > (dst_region_x + dst_region_w))
163 dst_clip_w = dst_region_x + dst_region_w - dst_clip_x;
164 if (dst_clip_y < dst_region_y)
165 {
166 dst_clip_h += dst_clip_y - dst_region_y;
167 dst_clip_y = dst_region_y;
168 }
169 if ((dst_clip_y + dst_clip_h) > (dst_region_y + dst_region_h))
170 dst_clip_h = dst_region_y + dst_region_h - dst_clip_y;
171
172 if ((src_region_w <= 0) || (src_region_h <= 0) ||
173 (dst_region_w <= 0) || (dst_region_h <= 0) ||
174 (dst_clip_w <= 0) || (dst_clip_h <= 0))
175 return;
176
177 /* sanitise x */
178 if (src_region_x < 0)
179 {
180 dst_region_x -= (src_region_x * dst_region_w) / src_region_w;
181 dst_region_w += (src_region_x * dst_region_w) / src_region_w;
182 src_region_w += src_region_x;
183 src_region_x = 0;
184 }
185 if (src_region_x >= src_w) return;
186 if ((src_region_x + src_region_w) > src_w)
187 {
188 dst_region_w = (dst_region_w * (src_w - src_region_x)) / (src_region_w);
189 src_region_w = src_w - src_region_x;
190 }
191 if (dst_region_w <= 0) return;
192 if (src_region_w <= 0) return;
193 if (dst_clip_x < 0)
194 {
195 dst_clip_w += dst_clip_x;
196 dst_clip_x = 0;
197 }
198 if (dst_clip_w <= 0) return;
199 if (dst_clip_x >= dst_w) return;
200 if (dst_clip_x < dst_region_x)
201 {
202 dst_clip_w += (dst_clip_x - dst_region_x);
203 dst_clip_x = dst_region_x;
204 }
205 if ((dst_clip_x + dst_clip_w) > dst_w)
206 {
207 dst_clip_w = dst_w - dst_clip_x;
208 }
209 if (dst_clip_w <= 0) return;
210
211 /* sanitise y */
212 if (src_region_y < 0)
213 {
214 dst_region_y -= (src_region_y * dst_region_h) / src_region_h;
215 dst_region_h += (src_region_y * dst_region_h) / src_region_h;
216 src_region_h += src_region_y;
217 src_region_y = 0;
218 }
219 if (src_region_y >= src_h) return;
220 if ((src_region_y + src_region_h) > src_h)
221 {
222 dst_region_h = (dst_region_h * (src_h - src_region_y)) / (src_region_h);
223 src_region_h = src_h - src_region_y;
224 }
225 if (dst_region_h <= 0) return;
226 if (src_region_h <= 0) return;
227 if (dst_clip_y < 0)
228 {
229 dst_clip_h += dst_clip_y;
230 dst_clip_y = 0;
231 }
232 if (dst_clip_h <= 0) return;
233 if (dst_clip_y >= dst_h) return;
234 if (dst_clip_y < dst_region_y)
235 {
236 dst_clip_h += (dst_clip_y - dst_region_y);
237 dst_clip_y = dst_region_y;
238 }
239 if ((dst_clip_y + dst_clip_h) > dst_h)
240 {
241 dst_clip_h = dst_h - dst_clip_y;
242 }
243 if (dst_clip_h <= 0) return;
244
245 /* allocate scale lookup tables */
246 lin_ptr = alloca(dst_clip_w * sizeof(int));
247 row_ptr = alloca(dst_clip_h * sizeof(DATA32 *));
248
249 /* figure out dst jump */
250 //dst_jump = dst_w - dst_clip_w;
251
252 /* figure out dest start ptr */
253 dst_ptr = dst_data + dst_clip_x + (dst_clip_y * dst_w);
254
255 if (dc->mask.mask)
256 {
257 func = evas_common_gfx_func_composite_pixel_mask_span_get(src, dst, dst_clip_w, dc->render_op);
258 maskobj = dc->mask.mask;
259 mask = maskobj->mask.mask;
260/*
261 if (1 || dst_region_w > src_region_w || dst_region_h > src_region_h){
262 printf("Mask w/h: %d/%d\n",maskobj->cache_entry.w,
263 maskobj->cache_entry.h);
264 printf("Warning: Unscaled mask (%d/%d) // (%d/%d)\n",
265 dst_region_w,src_region_w,
266 dst_region_h,src_region_h);
267 }
268 */
269 }
270 else if (dc->mul.use)
271 func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op);
272 else
273 func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op);
274
275 if ((dst_region_w == src_region_w) && (dst_region_h == src_region_h))
276 {
277#ifdef HAVE_PIXMAN
278# ifdef PIXMAN_IMAGE_SCALE_SAMPLE
279 if ((src->pixman.im) && (dst->pixman.im) && (!dc->mask.mask) &&
280 ((!dc->mul.use) ||
281 ((dc->mul.use) && (dc->mul.col == 0xffffffff))) &&
282 ((dc->render_op == _EVAS_RENDER_COPY) ||
283 (dc->render_op == _EVAS_RENDER_BLEND)))
284 {
285 pixman_op_t op = PIXMAN_OP_SRC; // _EVAS_RENDER_COPY
286 if (dc->render_op == _EVAS_RENDER_BLEND)
287 op = PIXMAN_OP_OVER;
288
289 pixman_image_composite(op,
290 src->pixman.im, NULL,
291 dst->pixman.im,
292 (dst_clip_x - dst_region_x) + src_region_x,
293 (dst_clip_y - dst_region_y) + src_region_y,
294 0, 0,
295 dst_clip_x, dst_clip_y,
296 dst_clip_w, dst_clip_h);
297 }
298 else if ((src->pixman.im) && (dst->pixman.im) &&
299 (dc->mask.mask) && (dc->mask.mask->pixman.im) &&
300 ((dc->render_op == _EVAS_RENDER_COPY) ||
301 (dc->render_op == _EVAS_RENDER_BLEND)))
302 {
303 // In case of pixel and color operation.
304 pixman_op_t op = PIXMAN_OP_SRC; // _EVAS_RENDER_COPY
305 if (dc->render_op == _EVAS_RENDER_BLEND)
306 op = PIXMAN_OP_OVER;
307
308 pixman_image_composite(op,
309 src->pixman.im, dc->mask.mask->pixman.im,
310 dst->pixman.im,
311 (dst_clip_x - dst_region_x) + src_region_x,
312 (dst_clip_y - dst_region_y) + src_region_y,
313 0, 0,
314 dst_clip_x, dst_clip_y,
315 dst_clip_w, dst_clip_h);
316 }
317 else
318# endif
319#endif
320 {
321 ptr = src_data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x;
322 if (mask)
323 {
324 mdx = (m_clip_x - dc->mask.x) + (m_clip_x - dst_clip_x);
325 mdy = (m_clip_y - dc->mask.y) + (m_clip_y - dst_clip_y);
326 mask += mdx + (mdy * maskobj->cache_entry.w);
327 }
328 for (y = 0; y < dst_clip_h; y++)
329 {
330 /* * blend here [clip_w *] ptr -> dst_ptr * */
331#ifdef EVAS_SLI
332 if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
333#endif
334 {
335 func(ptr, mask, dc->mul.col, dst_ptr, dst_clip_w);
336 }
337 ptr += src_w;
338 dst_ptr += dst_w;
339 if (mask) mask += maskobj->cache_entry.w;
340 }
341 }
342 }
343 else
344 {
345 /* fill scale tables */
346 for (x = 0; x < dst_clip_w; x++)
347 lin_ptr[x] = (((x + dst_clip_x - dst_region_x) * src_region_w) / dst_region_w) + src_region_x;
348 for (y = 0; y < dst_clip_h; y++)
349 row_ptr[y] = src_data + (((((y + dst_clip_y - dst_region_y) * src_region_h) / dst_region_h)
350 + src_region_y) * src_w);
351 /* scale to dst */
352 dptr = dst_ptr;
353#ifdef DIRECT_SCALE
354 if ((!src->cache_entry.flags.alpha) &&
355 (!dst->cache_entry.flags.alpha) &&
356 (!dc->mul.use))
357 {
358 for (y = 0; y < dst_clip_h; y++)
359 {
360# ifdef EVAS_SLI
361 if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
362# endif
363 {
364 dst_ptr = dptr;
365 for (x = 0; x < dst_clip_w; x++)
366 {
367 ptr = row_ptr[y] + lin_ptr[x];
368 *dst_ptr = *ptr;
369 dst_ptr++;
370 }
371 }
372 dptr += dst_w;
373 }
374 }
375 else
376#endif
377 {
378 /* a scanline buffer */
379 buf = alloca(dst_clip_w * sizeof(DATA32));
380 for (y = 0; y < dst_clip_h; y++)
381 {
382#ifdef EVAS_SLI
383 if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
384#endif
385 {
386 dst_ptr = buf;
387 for (x = 0; x < dst_clip_w; x++)
388 {
389 ptr = row_ptr[y] + lin_ptr[x];
390 *dst_ptr = *ptr;
391 dst_ptr++;
392 }
393 /* * blend here [clip_w *] buf -> dptr * */
394 func(buf, NULL, dc->mul.col, dptr, dst_clip_w);
395 }
396 dptr += dst_w;
397 }
398 }
399 }
400}
401#else
402#ifdef BUILD_SCALE_SMOOTH
403EAPI void
404evas_common_scale_rgba_in_to_out_clip_sample(RGBA_Image *src, RGBA_Image *dst,
405 RGBA_Draw_Context *dc,
406 int src_region_x, int src_region_y,
407 int src_region_w, int src_region_h,
408 int dst_region_x, int dst_region_y,
409 int dst_region_w, int dst_region_h)
410{
411 evas_common_scale_rgba_in_to_out_clip_smooth(src, dst, dc,
412 src_region_x, src_region_y,
413 src_region_w, src_region_h,
414 dst_region_x, dst_region_y,
415 dst_region_w, dst_region_h);
416}
417#endif
418#endif