aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c')
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c428
1 files changed, 428 insertions, 0 deletions
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c b/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c
new file mode 100644
index 0000000..594041c
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c
@@ -0,0 +1,428 @@
1#include "evas_common.h"
2
3#include "evas_xlib_buffer.h"
4
5static int _x_err = 0;
6
7void
8evas_software_xlib_x_write_mask_line(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y)
9{
10 int x;
11 DATA32 *src_ptr;
12 DATA8 *dst_ptr;
13 int bpl = 0;
14
15 src_ptr = src;
16 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
17 dst_ptr = dst_ptr + (bpl * y);
18 w -= 7;
19 if (buf->priv.x11.xlib.bit_swap)
20 {
21 for (x = 0; x < w; x += 8)
22 {
23 *dst_ptr =
24 ((A_VAL(&(src_ptr[0])) >> 7) << 7) |
25 ((A_VAL(&(src_ptr[1])) >> 7) << 6) |
26 ((A_VAL(&(src_ptr[2])) >> 7) << 5) |
27 ((A_VAL(&(src_ptr[3])) >> 7) << 4) |
28 ((A_VAL(&(src_ptr[4])) >> 7) << 3) |
29 ((A_VAL(&(src_ptr[5])) >> 7) << 2) |
30 ((A_VAL(&(src_ptr[6])) >> 7) << 1) |
31 ((A_VAL(&(src_ptr[7])) >> 7) << 0);
32 src_ptr += 8;
33 dst_ptr++;
34 }
35 }
36 else
37 {
38 for (x = 0; x < w; x += 8)
39 {
40 *dst_ptr =
41 ((A_VAL(&(src_ptr[0])) >> 7) << 0) |
42 ((A_VAL(&(src_ptr[1])) >> 7) << 1) |
43 ((A_VAL(&(src_ptr[2])) >> 7) << 2) |
44 ((A_VAL(&(src_ptr[3])) >> 7) << 3) |
45 ((A_VAL(&(src_ptr[4])) >> 7) << 4) |
46 ((A_VAL(&(src_ptr[5])) >> 7) << 5) |
47 ((A_VAL(&(src_ptr[6])) >> 7) << 6) |
48 ((A_VAL(&(src_ptr[7])) >> 7) << 7);
49 src_ptr += 8;
50 dst_ptr++;
51 }
52 }
53 w += 7;
54 for (; x < w; x ++)
55 {
56 XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7);
57 src_ptr++;
58 }
59}
60
61void
62evas_software_xlib_x_write_mask_line_rev(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y)
63{
64 int x;
65 DATA32 *src_ptr;
66 DATA8 *dst_ptr;
67 int bpl = 0;
68
69 src_ptr = src + w - 1;
70 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
71 dst_ptr = dst_ptr + (bpl * y);
72 w -= 7;
73 if (buf->priv.x11.xlib.bit_swap)
74 {
75 for (x = 0; x < w; x += 8)
76 {
77 *dst_ptr =
78 ((A_VAL(&(src_ptr[ 0])) >> 7) << 7) |
79 ((A_VAL(&(src_ptr[-1])) >> 7) << 6) |
80 ((A_VAL(&(src_ptr[-2])) >> 7) << 5) |
81 ((A_VAL(&(src_ptr[-3])) >> 7) << 4) |
82 ((A_VAL(&(src_ptr[-4])) >> 7) << 3) |
83 ((A_VAL(&(src_ptr[-5])) >> 7) << 2) |
84 ((A_VAL(&(src_ptr[-6])) >> 7) << 1) |
85 ((A_VAL(&(src_ptr[-7])) >> 7) << 0);
86 src_ptr -= 8;
87 dst_ptr++;
88 }
89 }
90 else
91 {
92 for (x = 0; x < w; x += 8)
93 {
94 *dst_ptr =
95 ((A_VAL(&(src_ptr[ 0])) >> 7) << 0) |
96 ((A_VAL(&(src_ptr[-1])) >> 7) << 1) |
97 ((A_VAL(&(src_ptr[-2])) >> 7) << 2) |
98 ((A_VAL(&(src_ptr[-3])) >> 7) << 3) |
99 ((A_VAL(&(src_ptr[-4])) >> 7) << 4) |
100 ((A_VAL(&(src_ptr[-5])) >> 7) << 5) |
101 ((A_VAL(&(src_ptr[-6])) >> 7) << 6) |
102 ((A_VAL(&(src_ptr[-7])) >> 7) << 7);
103 src_ptr -= 8;
104 dst_ptr++;
105 }
106 }
107 w += 7;
108 for (; x < w; x ++)
109 {
110 XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7);
111 src_ptr--;
112 }
113}
114
115void
116evas_software_xlib_x_write_mask_line_vert(Outbuf *buf, X_Output_Buffer *xob,
117 DATA32 *src,
118 int h, int ym, int w)
119{
120 int y;
121 DATA32 *src_ptr;
122 DATA8 *dst_ptr;
123 int bpl = 0;
124
125 src_ptr = src;
126 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
127 dst_ptr = dst_ptr + (bpl * ym);
128 h -= 7;
129 if (buf->priv.x11.xlib.bit_swap)
130 {
131 for (y = 0; y < h; y += 8)
132 {
133 *dst_ptr =
134 ((A_VAL(&(src_ptr[0 * w])) >> 7) << 7) |
135 ((A_VAL(&(src_ptr[1 * w])) >> 7) << 6) |
136 ((A_VAL(&(src_ptr[2 * w])) >> 7) << 5) |
137 ((A_VAL(&(src_ptr[3 * w])) >> 7) << 4) |
138 ((A_VAL(&(src_ptr[4 * w])) >> 7) << 3) |
139 ((A_VAL(&(src_ptr[5 * w])) >> 7) << 2) |
140 ((A_VAL(&(src_ptr[6 * w])) >> 7) << 1) |
141 ((A_VAL(&(src_ptr[7 * w])) >> 7) << 0);
142 src_ptr += 8 * w;
143 dst_ptr++;
144 }
145 }
146 else
147 {
148 for (y = 0; y < h; y += 8)
149 {
150 *dst_ptr =
151 ((A_VAL(&(src_ptr[0 * w])) >> 7) << 0) |
152 ((A_VAL(&(src_ptr[1 * w])) >> 7) << 1) |
153 ((A_VAL(&(src_ptr[2 * w])) >> 7) << 2) |
154 ((A_VAL(&(src_ptr[3 * w])) >> 7) << 3) |
155 ((A_VAL(&(src_ptr[4 * w])) >> 7) << 4) |
156 ((A_VAL(&(src_ptr[5 * w])) >> 7) << 5) |
157 ((A_VAL(&(src_ptr[6 * w])) >> 7) << 6) |
158 ((A_VAL(&(src_ptr[7 * w])) >> 7) << 7);
159 src_ptr += 8 * w;
160 dst_ptr++;
161 }
162 }
163 h += 7;
164 for (; y < h; y ++)
165 {
166 XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
167 src_ptr += w;
168 }
169}
170
171void
172evas_software_xlib_x_write_mask_line_vert_rev(Outbuf *buf, X_Output_Buffer *xob,
173 DATA32 *src,
174 int h, int ym, int w)
175{
176 int y;
177 DATA32 *src_ptr;
178 DATA8 *dst_ptr;
179 int bpl = 0;
180
181 src_ptr = src + ((h - 1) * w);
182 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
183 dst_ptr = dst_ptr + (bpl * ym);
184 h -= 7;
185 if (buf->priv.x11.xlib.bit_swap)
186 {
187 for (y = 0; y < h; y += 8)
188 {
189 *dst_ptr =
190 ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 7) |
191 ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 6) |
192 ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 5) |
193 ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 4) |
194 ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 3) |
195 ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 2) |
196 ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 1) |
197 ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 0);
198 src_ptr -= 8 * w;
199 dst_ptr++;
200 }
201 }
202 else
203 {
204 for (y = 0; y < h; y += 8)
205 {
206 *dst_ptr =
207 ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 0) |
208 ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 1) |
209 ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 2) |
210 ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 3) |
211 ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 4) |
212 ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 5) |
213 ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 6) |
214 ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 7);
215 src_ptr -= 8 * w;
216 dst_ptr++;
217 }
218 }
219 h += 7;
220 for (; y < h; y ++)
221 {
222 XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
223 src_ptr -= w;
224 }
225}
226
227int
228evas_software_xlib_x_can_do_shm(Display *d)
229{
230 static Display *cached_d = NULL;
231 static int cached_result = 0;
232
233 if (d == cached_d) return cached_result;
234 cached_d = d;
235 if (XShmQueryExtension(d))
236 {
237 X_Output_Buffer *xob;
238
239 xob = evas_software_xlib_x_output_buffer_new
240 (d, DefaultVisual(d, DefaultScreen(d)),
241 DefaultDepth(d, DefaultScreen(d)), 16, 16, 2, NULL);
242 if (!xob)
243 {
244 cached_result = 0;
245 return 0;
246 }
247 evas_software_xlib_x_output_buffer_free(xob, 1);
248 cached_result = 1;
249 return 1;
250 }
251 cached_result = 0;
252 return 0;
253}
254
255static void
256x_output_tmp_x_err(Display *d __UNUSED__, XErrorEvent *ev __UNUSED__)
257{
258 _x_err = 1;
259 return;
260}
261
262//static int creates = 0;
263
264X_Output_Buffer *
265evas_software_xlib_x_output_buffer_new(Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data)
266{
267 X_Output_Buffer *xob;
268
269 xob = calloc(1, sizeof(X_Output_Buffer));
270 if (!xob) return NULL;
271
272 xob->display = d;
273 xob->visual = v;
274 xob->xim = NULL;
275 xob->shm_info = NULL;
276 xob->w = w;
277 xob->h = h;
278
279 if (try_shm > 0)
280 {
281 xob->shm_info = malloc(sizeof(XShmSegmentInfo));
282 if (xob->shm_info)
283 {
284 xob->xim = XShmCreateImage(d, v, depth, ZPixmap, NULL,
285 xob->shm_info, w, h);
286 if (xob->xim)
287 {
288 xob->shm_info->shmid = shmget(IPC_PRIVATE,
289 xob->xim->bytes_per_line *
290 xob->xim->height,
291 IPC_CREAT | 0777);
292 if (xob->shm_info->shmid >= 0)
293 {
294 xob->shm_info->readOnly = False;
295 xob->shm_info->shmaddr = xob->xim->data =
296 shmat(xob->shm_info->shmid, 0, 0);
297 if (xob->shm_info->shmaddr != ((void *)-1))
298 {
299 XErrorHandler ph;
300
301 if (try_shm == 2) // only needed during testing
302 {
303 XSync(d, False);
304 _x_err = 0;
305 ph = XSetErrorHandler((XErrorHandler)
306 x_output_tmp_x_err);
307 }
308#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
309 /* workaround for libXext of lower then 1.1.1 */
310 if (evas_common_frameq_enabled())
311 XLockDisplay(d);
312#endif
313 XShmAttach(d, xob->shm_info);
314#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
315 /* workaround for libXext of lower then 1.1.1 */
316 if (evas_common_frameq_enabled())
317 XUnlockDisplay(d);
318#endif
319
320 if (try_shm == 2) // only needed during testing
321 {
322 XSync(d, False);
323 XSetErrorHandler((XErrorHandler)ph);
324 }
325 if (!_x_err)
326 {
327 xob->bpl = xob->xim->bytes_per_line;
328 xob->psize = xob->bpl * xob->h;
329 return xob;
330 }
331 }
332 shmdt(xob->shm_info->shmaddr);
333 shmctl(xob->shm_info->shmid, IPC_RMID, 0);
334 }
335 if (xob->xim) XDestroyImage(xob->xim);
336 xob->xim = NULL;
337 }
338 if (xob->shm_info) free(xob->shm_info);
339 xob->shm_info = NULL;
340 }
341 }
342
343 if (try_shm > 1) return NULL;
344
345 xob->xim = XCreateImage(d, v, depth, ZPixmap, 0, data, w, h, 32, 0);
346 if (!xob->xim)
347 {
348 free(xob);
349 return NULL;
350 }
351
352 xob->data = data;
353
354 if (!xob->xim->data)
355 {
356 xob->xim->data = malloc(xob->xim->bytes_per_line * xob->xim->height);
357 if (!xob->xim->data)
358 {
359 XDestroyImage(xob->xim);
360 free(xob);
361 return NULL;
362 }
363 }
364 xob->bpl = xob->xim->bytes_per_line;
365 xob->psize = xob->bpl * xob->h;
366 return xob;
367}
368
369void
370evas_software_xlib_x_output_buffer_free(X_Output_Buffer *xob, int psync)
371{
372 if (xob->shm_info)
373 {
374 if (psync) XSync(xob->display, False);
375 XShmDetach(xob->display, xob->shm_info);
376 XDestroyImage(xob->xim);
377 shmdt(xob->shm_info->shmaddr);
378 shmctl(xob->shm_info->shmid, IPC_RMID, 0);
379 free(xob->shm_info);
380 }
381 else
382 {
383 if (xob->data) xob->xim->data = NULL;
384 XDestroyImage(xob->xim);
385 }
386 free(xob);
387}
388
389void
390evas_software_xlib_x_output_buffer_paste(X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int psync)
391{
392 if (xob->shm_info)
393 {
394 XShmPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y,
395 xob->w, xob->h, False);
396 if (psync) XSync(xob->display, False);
397 }
398 else
399 {
400 XPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y,
401 xob->w, xob->h);
402 }
403}
404
405DATA8 *
406evas_software_xlib_x_output_buffer_data(X_Output_Buffer *xob, int *bytes_per_line_ret)
407{
408 if (bytes_per_line_ret) *bytes_per_line_ret = xob->xim->bytes_per_line;
409 return (DATA8 *)xob->xim->data;
410}
411
412int
413evas_software_xlib_x_output_buffer_depth(X_Output_Buffer *xob)
414{
415 return xob->xim->bits_per_pixel;
416}
417
418int
419evas_software_xlib_x_output_buffer_byte_order(X_Output_Buffer *xob)
420{
421 return xob->xim->byte_order;
422}
423
424int
425evas_software_xlib_x_output_buffer_bit_order(X_Output_Buffer *xob)
426{
427 return xob->xim->bitmap_bit_order;
428}