SDL  2.0
SDL_blit.c File Reference
#include "../SDL_internal.h"
#include "SDL_video.h"
#include "SDL_sysvideo.h"
#include "SDL_blit.h"
#include "SDL_blit_auto.h"
#include "SDL_blit_copy.h"
#include "SDL_blit_slow.h"
#include "SDL_RLEaccel_c.h"
#include "SDL_pixels_c.h"
+ Include dependency graph for SDL_blit.c:

Go to the source code of this file.

Functions

static int SDL_SoftBlit (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
 
static SDL_bool SDL_UseAltivecPrefetch ()
 
static SDL_BlitFunc SDL_ChooseBlitFunc (Uint32 src_format, Uint32 dst_format, int flags, SDL_BlitFuncEntry *entries)
 
int SDL_CalculateBlit (SDL_Surface *surface)
 

Function Documentation

◆ SDL_CalculateBlit()

int SDL_CalculateBlit ( SDL_Surface surface)

Definition at line 216 of file SDL_blit.c.

References SDL_PixelFormat::BitsPerPixel, SDL_BlitMap::blit, SDL_PixelFormat::BytesPerPixel, SDL_BlitMap::data, SDL_BlitMap::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_pitch, SDL_BlitInfo::flags, SDL_Surface::flags, SDL_Surface::format, SDL_PixelFormat::format, SDL_BlitMap::identity, SDL_BlitMap::info, SDL_Surface::map, map, NULL, SDL_Surface::pitch, SDL_PixelFormat::Rloss, SDL_Blit_Slow(), SDL_BlitCopy(), SDL_CalculateBlit0(), SDL_CalculateBlit1(), SDL_CalculateBlitA(), SDL_CalculateBlitN(), SDL_ChooseBlitFunc(), SDL_COPY_BLEND, SDL_COPY_RLE_DESIRED, SDL_GeneratedBlitFuncTable, SDL_InvalidateMap(), SDL_ISPIXELFORMAT_FOURCC, SDL_ISPIXELFORMAT_INDEXED, SDL_RLEACCEL, SDL_RLESurface(), SDL_SetError, SDL_SoftBlit(), SDL_UnRLESurface(), SDL_BlitInfo::src_fmt, and SDL_BlitInfo::src_pitch.

Referenced by SDL_MapSurface().

217 {
218  SDL_BlitFunc blit = NULL;
219  SDL_BlitMap *map = surface->map;
220  SDL_Surface *dst = map->dst;
221 
222  /* We don't currently support blitting to < 8 bpp surfaces */
223  if (dst->format->BitsPerPixel < 8) {
224  SDL_InvalidateMap(map);
225  return SDL_SetError("Blit combination not supported");
226  }
227 
228  /* Clean everything out to start */
229  if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {
230  SDL_UnRLESurface(surface, 1);
231  }
232  map->blit = SDL_SoftBlit;
233  map->info.src_fmt = surface->format;
234  map->info.src_pitch = surface->pitch;
235  map->info.dst_fmt = dst->format;
236  map->info.dst_pitch = dst->pitch;
237 
238  /* See if we can do RLE acceleration */
239  if (map->info.flags & SDL_COPY_RLE_DESIRED) {
240  if (SDL_RLESurface(surface) == 0) {
241  return 0;
242  }
243  }
244 
245  /* Choose a standard blit function */
246  if (map->identity && !(map->info.flags & ~SDL_COPY_RLE_DESIRED)) {
247  blit = SDL_BlitCopy;
248  } else if (surface->format->Rloss > 8 || dst->format->Rloss > 8) {
249  /* Greater than 8 bits per channel not supported yet */
250  SDL_InvalidateMap(map);
251  return SDL_SetError("Blit combination not supported");
252  } else if (surface->format->BitsPerPixel < 8 &&
254  blit = SDL_CalculateBlit0(surface);
255  } else if (surface->format->BytesPerPixel == 1 &&
257  blit = SDL_CalculateBlit1(surface);
258  } else if (map->info.flags & SDL_COPY_BLEND) {
259  blit = SDL_CalculateBlitA(surface);
260  } else {
261  blit = SDL_CalculateBlitN(surface);
262  }
263  if (blit == NULL) {
264  Uint32 src_format = surface->format->format;
265  Uint32 dst_format = dst->format->format;
266 
267  blit =
268  SDL_ChooseBlitFunc(src_format, dst_format, map->info.flags,
270  }
271 #ifndef TEST_SLOW_BLIT
272  if (blit == NULL)
273 #endif
274  {
275  Uint32 src_format = surface->format->format;
276  Uint32 dst_format = dst->format->format;
277 
278  if (!SDL_ISPIXELFORMAT_INDEXED(src_format) &&
279  !SDL_ISPIXELFORMAT_FOURCC(src_format) &&
280  !SDL_ISPIXELFORMAT_INDEXED(dst_format) &&
281  !SDL_ISPIXELFORMAT_FOURCC(dst_format)) {
282  blit = SDL_Blit_Slow;
283  }
284  }
285  map->data = blit;
286 
287  /* Make sure we have a blit function */
288  if (blit == NULL) {
289  SDL_InvalidateMap(map);
290  return SDL_SetError("Blit combination not supported");
291  }
292 
293  return 0;
294 }
SDL_BlitFunc SDL_CalculateBlitN(SDL_Surface *surface)
Definition: SDL_blit_N.c:2537
SDL_blit blit
Definition: SDL_blit.h:90
GLenum GLenum dst
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:134
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
SDL_PixelFormat * src_fmt
Definition: SDL_blit.h:65
void SDL_Blit_Slow(SDL_BlitInfo *info)
Definition: SDL_blit_slow.c:31
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
void SDL_UnRLESurface(SDL_Surface *surface, int recode)
int dst_pitch
Definition: SDL_blit.h:63
uint32_t Uint32
Definition: SDL_stdinc.h:181
Uint32 flags
Definition: SDL_surface.h:71
#define SDL_COPY_RLE_DESIRED
Definition: SDL_blit.h:41
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:972
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
void SDL_BlitCopy(SDL_BlitInfo *info)
Definition: SDL_blit_copy.c:91
static SDL_BlitFunc SDL_ChooseBlitFunc(Uint32 src_format, Uint32 dst_format, int flags, SDL_BlitFuncEntry *entries)
Definition: SDL_blit.c:128
Uint8 BitsPerPixel
Definition: SDL_pixels.h:319
SDL_PixelFormat * dst_fmt
Definition: SDL_blit.h:66
SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[]
int src_pitch
Definition: SDL_blit.h:59
int SDL_RLESurface(SDL_Surface *surface)
SDL_Surface * dst
Definition: SDL_blit.h:88
#define NULL
Definition: begin_code.h:164
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_BlitFunc SDL_CalculateBlit0(SDL_Surface *surface)
Definition: SDL_blit_0.c:454
#define SDL_SetError
SDL_BlitFunc SDL_CalculateBlit1(SDL_Surface *surface)
Definition: SDL_blit_1.c:522
void(* SDL_BlitFunc)(SDL_BlitInfo *info)
Definition: SDL_blit.h:73
static int SDL_SoftBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_blit.c:34
void * data
Definition: SDL_blit.h:91
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:167
const GLubyte GLuint GLuint GLuint GLuint alpha GLboolean GLboolean GLboolean GLboolean alpha GLint GLint GLsizei GLsizei GLenum type GLenum GLint GLenum GLint GLint GLsizei GLsizei GLint border GLenum GLint GLint GLint GLint GLint GLsizei GLsizei height GLsizei GLsizei GLenum GLenum const GLvoid *pixels GLenum GLint GLint GLint GLint j2 GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble zFar GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLint *params GLenum GLenum GLfloat *params GLenum GLint GLenum GLenum GLvoid *pixels GLenum GLint GLenum GLint *params GLenum GLenum GLint *params GLenum GLsizei const GLvoid *pointer GLenum GLenum const GLint *params GLenum GLfloat GLfloat GLint GLint const GLfloat *points GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat *points GLint GLfloat GLfloat GLint GLfloat GLfloat v2 GLenum GLenum const GLint *params GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble zFar GLenum map
Definition: SDL_glfuncs.h:290
SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
Definition: SDL_blit_A.c:1269
int identity
Definition: SDL_blit.h:89
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitInfo info
Definition: SDL_blit.h:92
#define SDL_RLEACCEL
Definition: SDL_surface.h:54

◆ SDL_ChooseBlitFunc()

static SDL_BlitFunc SDL_ChooseBlitFunc ( Uint32  src_format,
Uint32  dst_format,
int  flags,
SDL_BlitFuncEntry entries 
)
static

Definition at line 128 of file SDL_blit.c.

References SDL_BlitFuncEntry::cpu, SDL_BlitFuncEntry::func, i, NULL, SDL_COPY_ADD, SDL_COPY_BLEND, SDL_COPY_COLORKEY, SDL_COPY_MOD, SDL_COPY_MODULATE_ALPHA, SDL_COPY_MODULATE_COLOR, SDL_COPY_NEAREST, SDL_CPU_3DNOW, SDL_CPU_ALTIVEC_NOPREFETCH, SDL_CPU_ALTIVEC_PREFETCH, SDL_CPU_ANY, SDL_CPU_MMX, SDL_CPU_SSE, SDL_CPU_SSE2, SDL_getenv, SDL_Has3DNow, SDL_HasAltiVec, SDL_HasMMX, SDL_HasSSE, SDL_HasSSE2, SDL_sscanf, and SDL_UseAltivecPrefetch().

Referenced by SDL_CalculateBlit().

130 {
131  int i, flagcheck;
132  static Uint32 features = 0xffffffff;
133 
134  /* Get the available CPU features */
135  if (features == 0xffffffff) {
136  const char *override = SDL_getenv("SDL_BLIT_CPU_FEATURES");
137 
138  features = SDL_CPU_ANY;
139 
140  /* Allow an override for testing .. */
141  if (override) {
142  SDL_sscanf(override, "%u", &features);
143  } else {
144  if (SDL_HasMMX()) {
145  features |= SDL_CPU_MMX;
146  }
147  if (SDL_Has3DNow()) {
148  features |= SDL_CPU_3DNOW;
149  }
150  if (SDL_HasSSE()) {
151  features |= SDL_CPU_SSE;
152  }
153  if (SDL_HasSSE2()) {
154  features |= SDL_CPU_SSE2;
155  }
156  if (SDL_HasAltiVec()) {
157  if (SDL_UseAltivecPrefetch()) {
158  features |= SDL_CPU_ALTIVEC_PREFETCH;
159  } else {
160  features |= SDL_CPU_ALTIVEC_NOPREFETCH;
161  }
162  }
163  }
164  }
165 
166  for (i = 0; entries[i].func; ++i) {
167  /* Check for matching pixel formats */
168  if (src_format != entries[i].src_format) {
169  continue;
170  }
171  if (dst_format != entries[i].dst_format) {
172  continue;
173  }
174 
175  /* Check modulation flags */
176  flagcheck =
178  if ((flagcheck & entries[i].flags) != flagcheck) {
179  continue;
180  }
181 
182  /* Check blend flags */
183  flagcheck =
184  (flags &
186  if ((flagcheck & entries[i].flags) != flagcheck) {
187  continue;
188  }
189 
190  /* Check colorkey flag */
191  flagcheck = (flags & SDL_COPY_COLORKEY);
192  if ((flagcheck & entries[i].flags) != flagcheck) {
193  continue;
194  }
195 
196  /* Check scaling flags */
197  flagcheck = (flags & SDL_COPY_NEAREST);
198  if ((flagcheck & entries[i].flags) != flagcheck) {
199  continue;
200  }
201 
202  /* Check CPU features */
203  flagcheck = entries[i].cpu;
204  if ((flagcheck & features) != flagcheck) {
205  continue;
206  }
207 
208  /* We found the best one! */
209  return entries[i].func;
210  }
211  return NULL;
212 }
SDL_BlitFunc func
Definition: SDL_blit.h:82
#define SDL_CPU_MMX
Definition: SDL_blit.h:48
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
#define SDL_HasAltiVec
#define SDL_Has3DNow
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
uint32_t Uint32
Definition: SDL_stdinc.h:181
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
#define SDL_COPY_NEAREST
Definition: SDL_blit.h:40
int cpu
Definition: SDL_blit.h:81
#define SDL_CPU_ALTIVEC_PREFETCH
Definition: SDL_blit.h:52
#define SDL_CPU_3DNOW
Definition: SDL_blit.h:49
#define SDL_sscanf
#define SDL_HasMMX
#define SDL_getenv
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_CPU_SSE2
Definition: SDL_blit.h:51
#define NULL
Definition: begin_code.h:164
GLbitfield flags
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
#define SDL_HasSSE2
#define SDL_CPU_SSE
Definition: SDL_blit.h:50
#define SDL_CPU_ANY
Definition: SDL_blit.h:47
static SDL_bool SDL_UseAltivecPrefetch()
Definition: SDL_blit.c:120
#define SDL_HasSSE
#define SDL_CPU_ALTIVEC_NOPREFETCH
Definition: SDL_blit.h:53
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36

◆ SDL_SoftBlit()

static int SDL_SoftBlit ( SDL_Surface src,
SDL_Rect srcrect,
SDL_Surface dst,
SDL_Rect dstrect 
)
static

Definition at line 34 of file SDL_blit.c.

References SDL_PixelFormat::BytesPerPixel, SDL_BlitMap::data, SDL_BlitInfo::dst, SDL_BlitInfo::dst_fmt, SDL_BlitInfo::dst_h, SDL_BlitInfo::dst_pitch, SDL_BlitInfo::dst_skip, SDL_BlitInfo::dst_w, SDL_Rect::h, SDL_BlitMap::info, SDL_Surface::map, NULL, SDL_Surface::pitch, SDL_Surface::pixels, SDL_FALSE, SDL_LockSurface, SDL_MUSTLOCK, SDL_RectEmpty(), SDL_TRUE, SDL_UnlockSurface, SDL_UseAltivecPrefetch(), SDL_BlitInfo::src, SDL_BlitInfo::src_fmt, SDL_BlitInfo::src_h, SDL_BlitInfo::src_pitch, SDL_BlitInfo::src_skip, SDL_BlitInfo::src_w, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SDL_CalculateBlit().

36 {
37  int okay;
38  int src_locked;
39  int dst_locked;
40 
41  /* Everything is okay at the beginning... */
42  okay = 1;
43 
44  /* Lock the destination if it's in hardware */
45  dst_locked = 0;
46  if (SDL_MUSTLOCK(dst)) {
47  if (SDL_LockSurface(dst) < 0) {
48  okay = 0;
49  } else {
50  dst_locked = 1;
51  }
52  }
53  /* Lock the source if it's in hardware */
54  src_locked = 0;
55  if (SDL_MUSTLOCK(src)) {
56  if (SDL_LockSurface(src) < 0) {
57  okay = 0;
58  } else {
59  src_locked = 1;
60  }
61  }
62 
63  /* Set up source and destination buffer pointers, and BLIT! */
64  if (okay && !SDL_RectEmpty(srcrect)) {
65  SDL_BlitFunc RunBlit;
66  SDL_BlitInfo *info = &src->map->info;
67 
68  /* Set up the blit information */
69  info->src = (Uint8 *) src->pixels +
70  (Uint16) srcrect->y * src->pitch +
71  (Uint16) srcrect->x * info->src_fmt->BytesPerPixel;
72  info->src_w = srcrect->w;
73  info->src_h = srcrect->h;
74  info->src_pitch = src->pitch;
75  info->src_skip =
76  info->src_pitch - info->src_w * info->src_fmt->BytesPerPixel;
77  info->dst =
78  (Uint8 *) dst->pixels + (Uint16) dstrect->y * dst->pitch +
79  (Uint16) dstrect->x * info->dst_fmt->BytesPerPixel;
80  info->dst_w = dstrect->w;
81  info->dst_h = dstrect->h;
82  info->dst_pitch = dst->pitch;
83  info->dst_skip =
84  info->dst_pitch - info->dst_w * info->dst_fmt->BytesPerPixel;
85  RunBlit = (SDL_BlitFunc) src->map->data;
86 
87  /* Run the actual software blit */
88  RunBlit(info);
89  }
90 
91  /* We need to unlock the surfaces if they're locked */
92  if (dst_locked) {
93  SDL_UnlockSurface(dst);
94  }
95  if (src_locked) {
96  SDL_UnlockSurface(src);
97  }
98  /* Blit is done! */
99  return (okay ? 0 : -1);
100 }
#define SDL_UnlockSurface
int src_skip
Definition: SDL_blit.h:60
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
SDL_PixelFormat * src_fmt
Definition: SDL_blit.h:65
int dst_pitch
Definition: SDL_blit.h:63
int dst_skip
Definition: SDL_blit.h:64
SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
Returns true if the rectangle has no area.
Definition: SDL_rect.h:82
Uint8 * dst
Definition: SDL_blit.h:61
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
void * pixels
Definition: SDL_surface.h:75
uint8_t Uint8
Definition: SDL_stdinc.h:157
int x
Definition: SDL_rect.h:66
Uint8 * src
Definition: SDL_blit.h:57
int w
Definition: SDL_rect.h:67
SDL_PixelFormat * dst_fmt
Definition: SDL_blit.h:66
int src_pitch
Definition: SDL_blit.h:59
#define SDL_LockSurface
#define SDL_MUSTLOCK(S)
Definition: SDL_surface.h:61
int h
Definition: SDL_rect.h:67
void(* SDL_BlitFunc)(SDL_BlitInfo *info)
Definition: SDL_blit.h:73
uint16_t Uint16
Definition: SDL_stdinc.h:169
void * data
Definition: SDL_blit.h:91
int y
Definition: SDL_rect.h:66
SDL_BlitInfo info
Definition: SDL_blit.h:92

◆ SDL_UseAltivecPrefetch()

static SDL_bool SDL_UseAltivecPrefetch ( )
static

Definition at line 120 of file SDL_blit.c.

References SDL_TRUE.

Referenced by SDL_ChooseBlitFunc(), and SDL_SoftBlit().

121 {
122  /* Just guess G4 */
123  return SDL_TRUE;
124 }