summaryrefslogtreecommitdiff
path: root/src/lib/evas/common/evas_scale_sample.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/evas/common/evas_scale_sample.c194
1 files changed, 189 insertions, 5 deletions
diff --git a/src/lib/evas/common/evas_scale_sample.c b/src/lib/evas/common/evas_scale_sample.c
index 5a11af8a6d..f9fc650376 100644
--- a/src/lib/evas/common/evas_scale_sample.c
+++ b/src/lib/evas/common/evas_scale_sample.c
@@ -58,13 +58,197 @@ evas_common_scale_rgba_in_to_out_clip_sample_do(const Cutout_Rects *reuse,
58 } 58 }
59} 59}
60 60
61EAPI void
62evas_common_scale_rgba_sample_draw(RGBA_Image *src, RGBA_Image *dst, int dst_clip_x, int dst_clip_y, int dst_clip_w, int dst_clip_h, DATA32 mul_col, int render_op, 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)
63{
64 int x, y;
65 int *lin_ptr;
66 DATA32 *buf, *dptr;
67 DATA32 **row_ptr;
68 DATA32 *ptr, *dst_ptr, *src_data, *dst_data;
69 int src_w, src_h, dst_w, dst_h;
70 RGBA_Gfx_Func func;
71
72 if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h,
73 0, 0, dst->cache_entry.w, dst->cache_entry.h))) return;
74 if (!(RECTS_INTERSECT(src_region_x, src_region_y, src_region_w, src_region_h,
75 0, 0, src->cache_entry.w, src->cache_entry.h))) return;
76
77 src_w = src->cache_entry.w;
78 src_h = src->cache_entry.h;
79 dst_w = dst->cache_entry.w;
80 dst_h = dst->cache_entry.h;
81
82 src_data = src->image.data;
83 dst_data = dst->image.data;
84
85 if (dst_clip_x < 0)
86 {
87 dst_clip_w += dst_clip_x;
88 dst_clip_x = 0;
89 }
90 if (dst_clip_y < 0)
91 {
92 dst_clip_h += dst_clip_y;
93 dst_clip_y = 0;
94 }
95 if ((dst_clip_x + dst_clip_w) > dst_w)
96 dst_clip_w = dst_w - dst_clip_x;
97 if ((dst_clip_y + dst_clip_h) > dst_h)
98 dst_clip_h = dst_h - dst_clip_y;
99
100 if (dst_clip_x < dst_region_x)
101 {
102 dst_clip_w += dst_clip_x - dst_region_x;
103 dst_clip_x = dst_region_x;
104 }
105 if ((dst_clip_x + dst_clip_w) > (dst_region_x + dst_region_w))
106 dst_clip_w = dst_region_x + dst_region_w - dst_clip_x;
107 if (dst_clip_y < dst_region_y)
108 {
109 dst_clip_h += dst_clip_y - dst_region_y;
110 dst_clip_y = dst_region_y;
111 }
112 if ((dst_clip_y + dst_clip_h) > (dst_region_y + dst_region_h))
113 dst_clip_h = dst_region_y + dst_region_h - dst_clip_y;
114
115 if ((src_region_w <= 0) || (src_region_h <= 0) ||
116 (dst_region_w <= 0) || (dst_region_h <= 0) ||
117 (dst_clip_w <= 0) || (dst_clip_h <= 0))
118 return;
119
120 /* sanitise x */
121 if (src_region_x < 0)
122 {
123 dst_region_x -= (src_region_x * dst_region_w) / src_region_w;
124 dst_region_w += (src_region_x * dst_region_w) / src_region_w;
125 src_region_w += src_region_x;
126 src_region_x = 0;
127 }
128 if (src_region_x >= src_w) return;
129 if ((src_region_x + src_region_w) > src_w)
130 {
131 dst_region_w = (dst_region_w * (src_w - src_region_x)) / (src_region_w);
132 src_region_w = src_w - src_region_x;
133 }
134 if (dst_region_w <= 0) return;
135 if (src_region_w <= 0) return;
136 if (dst_clip_x < 0)
137 {
138 dst_clip_w += dst_clip_x;
139 dst_clip_x = 0;
140 }
141 if (dst_clip_w <= 0) return;
142 if (dst_clip_x >= dst_w) return;
143 if (dst_clip_x < dst_region_x)
144 {
145 dst_clip_w += (dst_clip_x - dst_region_x);
146 dst_clip_x = dst_region_x;
147 }
148 if ((dst_clip_x + dst_clip_w) > dst_w)
149 {
150 dst_clip_w = dst_w - dst_clip_x;
151 }
152 if (dst_clip_w <= 0) return;
153
154 /* sanitise y */
155 if (src_region_y < 0)
156 {
157 dst_region_y -= (src_region_y * dst_region_h) / src_region_h;
158 dst_region_h += (src_region_y * dst_region_h) / src_region_h;
159 src_region_h += src_region_y;
160 src_region_y = 0;
161 }
162 if (src_region_y >= src_h) return;
163 if ((src_region_y + src_region_h) > src_h)
164 {
165 dst_region_h = (dst_region_h * (src_h - src_region_y)) / (src_region_h);
166 src_region_h = src_h - src_region_y;
167 }
168 if (dst_region_h <= 0) return;
169 if (src_region_h <= 0) return;
170 if (dst_clip_y < 0)
171 {
172 dst_clip_h += dst_clip_y;
173 dst_clip_y = 0;
174 }
175 if (dst_clip_h <= 0) return;
176 if (dst_clip_y >= dst_h) return;
177 if (dst_clip_y < dst_region_y)
178 {
179 dst_clip_h += (dst_clip_y - dst_region_y);
180 dst_clip_y = dst_region_y;
181 }
182 if ((dst_clip_y + dst_clip_h) > dst_h)
183 {
184 dst_clip_h = dst_h - dst_clip_y;
185 }
186 if (dst_clip_h <= 0) return;
187
188 /* allocate scale lookup tables */
189 lin_ptr = alloca(dst_clip_w * sizeof(int));
190 row_ptr = alloca(dst_clip_h * sizeof(DATA32 *));
191
192 /* figure out dst jump */
193 //dst_jump = dst_w - dst_clip_w;
194
195 /* figure out dest start ptr */
196 dst_ptr = dst_data + dst_clip_x + (dst_clip_y * dst_w);
197
198 if (mul_col != 0xffffffff)
199 func = evas_common_gfx_func_composite_pixel_color_span_get(src, mul_col, dst, dst_clip_w, render_op);
200 else
201 func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, render_op);
202
203 if ((dst_region_w == src_region_w) && (dst_region_h == src_region_h))
204 {
205 ptr = src_data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x;
206 for (y = 0; y < dst_clip_h; y++)
207 {
208 /* * blend here [clip_w *] ptr -> dst_ptr * */
209 func(ptr, NULL, mul_col, dst_ptr, dst_clip_w);
210
211 ptr += src_w;
212 dst_ptr += dst_w;
213 }
214 }
215 else
216 {
217 /* fill scale tables */
218 for (x = 0; x < dst_clip_w; x++)
219 lin_ptr[x] = (((x + dst_clip_x - dst_region_x) * src_region_w) / dst_region_w) + src_region_x;
220 for (y = 0; y < dst_clip_h; y++)
221 row_ptr[y] = src_data + (((((y + dst_clip_y - dst_region_y) * src_region_h) / dst_region_h)
222 + src_region_y) * src_w);
223 /* scale to dst */
224 dptr = dst_ptr;
225
226 /* a scanline buffer */
227 buf = alloca(dst_clip_w * sizeof(DATA32));
228 for (y = 0; y < dst_clip_h; y++)
229 {
230 dst_ptr = buf;
231 for (x = 0; x < dst_clip_w; x++)
232 {
233 ptr = row_ptr[y] + lin_ptr[x];
234 *dst_ptr = *ptr;
235 dst_ptr++;
236 }
237 /* * blend here [clip_w *] buf -> dptr * */
238 func(buf, NULL, mul_col, dptr, dst_clip_w);
239
240 dptr += dst_w;
241 }
242 }
243}
244
61static void 245static void
62scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, 246scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst,
63 RGBA_Draw_Context *dc, 247 RGBA_Draw_Context *dc,
64 int src_region_x, int src_region_y, 248 int src_region_x, int src_region_y,
65 int src_region_w, int src_region_h, 249 int src_region_w, int src_region_h,
66 int dst_region_x, int dst_region_y, 250 int dst_region_x, int dst_region_y,
67 int dst_region_w, int dst_region_h) 251 int dst_region_w, int dst_region_h)
68{ 252{
69 int x, y; 253 int x, y;
70 int *lin_ptr; 254 int *lin_ptr;