libdmx: Add fso-specs to DEPENDS
[openembedded.git] / recipes / xorg-lib / pixman-0.17.8 / 0005-Support-of-overlapping-src-dst-for-pixman_blt_sse2.patch
blob3704fbf1cfa5a1327908a7e72315d4267051eadd
1 From edc80b41c6480b7c80ec5f7c835c92b2debb3774 Mon Sep 17 00:00:00 2001
2 From: Siarhei Siamashka <siarhei.siamashka@nokia.com>
3 Date: Thu, 22 Oct 2009 05:45:54 +0300
4 Subject: [PATCH 5/6] Support of overlapping src/dst for pixman_blt_sse2
6 ---
7 pixman/pixman-sse2.c | 55 +++++++++++++++++++++++++++++--------------------
8 1 files changed, 32 insertions(+), 23 deletions(-)
10 diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c
11 index 78b0ad1..b84636b 100644
12 --- a/pixman/pixman-sse2.c
13 +++ b/pixman/pixman-sse2.c
14 @@ -5300,34 +5300,43 @@ pixman_blt_sse2 (uint32_t *src_bits,
16 uint8_t * src_bytes;
17 uint8_t * dst_bytes;
18 - int byte_width;
19 + int bpp;
21 - if (src_bpp != dst_bpp)
22 + if (src_bpp != dst_bpp || src_bpp & 7)
23 return FALSE;
25 - if (src_bpp == 16)
26 - {
27 - src_stride = src_stride * (int) sizeof (uint32_t) / 2;
28 - dst_stride = dst_stride * (int) sizeof (uint32_t) / 2;
29 - src_bytes =(uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x));
30 - dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x));
31 - byte_width = 2 * width;
32 - src_stride *= 2;
33 - dst_stride *= 2;
34 - }
35 - else if (src_bpp == 32)
36 + bpp = src_bpp >> 3;
37 + width *= bpp;
38 + src_stride *= 4;
39 + dst_stride *= 4;
40 + src_bytes = (uint8_t *)src_bits + src_y * src_stride + src_x * bpp;
41 + dst_bytes = (uint8_t *)dst_bits + dst_y * dst_stride + dst_x * bpp;
43 + if (src_bpp != 16 && src_bpp != 32)
45 - src_stride = src_stride * (int) sizeof (uint32_t) / 4;
46 - dst_stride = dst_stride * (int) sizeof (uint32_t) / 4;
47 - src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x));
48 - dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x));
49 - byte_width = 4 * width;
50 - src_stride *= 4;
51 - dst_stride *= 4;
52 + pixman_blt_helper (src_bytes, dst_bytes, src_stride, dst_stride,
53 + width, height);
54 + return TRUE;
56 - else
58 + if (src_bytes < dst_bytes && src_bytes + src_stride * height > dst_bytes)
60 - return FALSE;
61 + src_bytes += src_stride * height - src_stride;
62 + dst_bytes += dst_stride * height - dst_stride;
63 + dst_stride = -dst_stride;
64 + src_stride = -src_stride;
66 + if (src_bytes + width > dst_bytes)
67 + {
68 + /* TODO: reverse scanline copy using SSE2 */
69 + while (--height >= 0)
70 + {
71 + memmove (dst_bytes, src_bytes, width);
72 + dst_bytes += dst_stride;
73 + src_bytes += src_stride;
74 + }
75 + return TRUE;
76 + }
79 cache_prefetch ((__m128i*)src_bytes);
80 @@ -5340,7 +5349,7 @@ pixman_blt_sse2 (uint32_t *src_bits,
81 uint8_t *d = dst_bytes;
82 src_bytes += src_stride;
83 dst_bytes += dst_stride;
84 - w = byte_width;
85 + w = width;
87 cache_prefetch_next ((__m128i*)s);
88 cache_prefetch_next ((__m128i*)d);
89 --
90 1.6.2.4