annotate src/video/SDL_blit_copy.c @ 2249:5a58b57b6724

Added SSE and MMX optimization for SDL_FillRect()
author Sam Lantinga <slouken@libsdl.org>
date Thu, 16 Aug 2007 05:56:24 +0000
parents 5cd2a2293cf0
children e1d228456537
rev   line source
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
1 /*
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
2 SDL - Simple DirectMedia Layer
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
3 Copyright (C) 1997-2006 Sam Lantinga
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
4
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
6 modify it under the terms of the GNU Lesser General Public
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
7 License as published by the Free Software Foundation; either
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
8 version 2.1 of the License, or (at your option) any later version.
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
9
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
13 Lesser General Public License for more details.
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
14
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
15 You should have received a copy of the GNU Lesser General Public
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
16 License along with this library; if not, write to the Free Software
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
18
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
19 Sam Lantinga
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
20 slouken@libsdl.org
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
21 */
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
22 #include "SDL_config.h"
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
23
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
24 #include "SDL_video.h"
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
25 #include "SDL_blit.h"
2249
5a58b57b6724 Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents: 2248
diff changeset
26 #include "SDL_blit_copy.h"
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
27
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
28
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
29 #ifdef __MMX__
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
30 static __inline__ void
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
31 SDL_memcpyMMX(Uint8 * dst, const Uint8 * src, int len)
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
32 {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
33 int i;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
34
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
35 __m64 values[8];
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
36 for (i = len / 64; i--;) {
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
37 _mm_prefetch(src, _MM_HINT_NTA);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
38 values[0] = *(__m64 *) (src + 0);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
39 values[1] = *(__m64 *) (src + 8);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
40 values[2] = *(__m64 *) (src + 16);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
41 values[3] = *(__m64 *) (src + 24);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
42 values[4] = *(__m64 *) (src + 32);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
43 values[5] = *(__m64 *) (src + 40);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
44 values[6] = *(__m64 *) (src + 48);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
45 values[7] = *(__m64 *) (src + 56);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
46 _mm_stream_pi((__m64 *) (dst + 0), values[0]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
47 _mm_stream_pi((__m64 *) (dst + 8), values[1]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
48 _mm_stream_pi((__m64 *) (dst + 16), values[2]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
49 _mm_stream_pi((__m64 *) (dst + 24), values[3]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
50 _mm_stream_pi((__m64 *) (dst + 32), values[4]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
51 _mm_stream_pi((__m64 *) (dst + 40), values[5]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
52 _mm_stream_pi((__m64 *) (dst + 48), values[6]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
53 _mm_stream_pi((__m64 *) (dst + 56), values[7]);
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
54 src += 64;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
55 dst += 64;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
56 }
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
57
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
58 if (len & 63)
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
59 SDL_memcpy(dst, src, len & 63);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
60 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
61 #endif /* __MMX__ */
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
62
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
63 #ifdef __SSE__
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
64 static __inline__ void
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
65 SDL_memcpySSE(Uint8 * dst, const Uint8 * src, int len)
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
66 {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
67 int i;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
68
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
69 __m128 values[4];
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
70 for (i = len / 64; i--;) {
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
71 _mm_prefetch(src, _MM_HINT_NTA);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
72 values[0] = *(__m128 *) (src + 0);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
73 values[1] = *(__m128 *) (src + 16);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
74 values[2] = *(__m128 *) (src + 32);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
75 values[3] = *(__m128 *) (src + 48);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
76 _mm_stream_ps((float *) (dst + 0), values[0]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
77 _mm_stream_ps((float *) (dst + 16), values[1]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
78 _mm_stream_ps((float *) (dst + 32), values[2]);
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
79 _mm_stream_ps((float *) (dst + 48), values[3]);
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
80 src += 64;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
81 dst += 64;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
82 }
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
83
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
84 if (len & 63)
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
85 SDL_memcpy(dst, src, len & 63);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
86 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
87 #endif /* __SSE__ */
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
88
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
89 void
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
90 SDL_BlitCopy(SDL_BlitInfo * info)
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
91 {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
92 Uint8 *src, *dst;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
93 int w, h;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
94 int srcskip, dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
95
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
96 w = info->d_width * info->dst->BytesPerPixel;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
97 h = info->d_height;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
98 src = info->s_pixels;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
99 dst = info->d_pixels;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
100 srcskip = w + info->s_skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
101 dstskip = w + info->d_skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
102
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
103 #ifdef __SSE__
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
104 if (SDL_HasSSE() && !((uintptr_t) src & 15) && !((uintptr_t) dst & 15)) {
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
105 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
106 SDL_memcpySSE(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
107 src += srcskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
108 dst += dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
109 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
110 return;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
111 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
112 #endif
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
113
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
114 #ifdef __MMX__
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
115 if (SDL_HasMMX() && !((uintptr_t) src & 7) && !((uintptr_t) dst & 7)) {
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
116 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
117 SDL_memcpyMMX(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
118 src += srcskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
119 dst += dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
120 }
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
121 _mm_empty();
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
122 return;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
123 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
124 #endif
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
125
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
126 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
127 SDL_memcpy(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
128 src += srcskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
129 dst += dstskip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
130 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
131 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
132
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
133 void
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
134 SDL_BlitCopyOverlap(SDL_BlitInfo * info)
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
135 {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
136 Uint8 *src, *dst;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
137 int w, h;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
138 int skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
139
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
140 w = info->d_width * info->dst->BytesPerPixel;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
141 h = info->d_height;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
142 src = info->s_pixels;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
143 dst = info->d_pixels;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
144 skip = w + info->s_skip;
2248
5cd2a2293cf0 Okay, I figured out the intrinsics for SIMD memcpy
Sam Lantinga <slouken@libsdl.org>
parents: 2247
diff changeset
145 if ((dst < src) || (dst >= (src + h * skip))) {
2247
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
146 SDL_BlitCopy(info);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
147 } else {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
148 src += ((h - 1) * skip);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
149 dst += ((h - 1) * skip);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
150 while (h--) {
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
151 SDL_revcpy(dst, src, w);
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
152 src -= skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
153 dst -= skip;
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
154 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
155 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
156 }
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
157
93994f65c74c Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
158 /* vi: set ts=4 sw=4 expandtab: */