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().

{
SDL_BlitFunc blit = NULL;
SDL_BlitMap *map = surface->map;
SDL_Surface *dst = map->dst;
/* We don't currently support blitting to < 8 bpp surfaces */
if (dst->format->BitsPerPixel < 8) {
SDL_InvalidateMap(map);
return SDL_SetError("Blit combination not supported");
}
/* Clean everything out to start */
if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {
SDL_UnRLESurface(surface, 1);
}
map->blit = SDL_SoftBlit;
map->info.src_fmt = surface->format;
map->info.src_pitch = surface->pitch;
map->info.dst_fmt = dst->format;
map->info.dst_pitch = dst->pitch;
/* See if we can do RLE acceleration */
if (map->info.flags & SDL_COPY_RLE_DESIRED) {
if (SDL_RLESurface(surface) == 0) {
return 0;
}
}
/* Choose a standard blit function */
if (map->identity && !(map->info.flags & ~SDL_COPY_RLE_DESIRED)) {
blit = SDL_BlitCopy;
} else if (surface->format->Rloss > 8 || dst->format->Rloss > 8) {
/* Greater than 8 bits per channel not supported yet */
SDL_InvalidateMap(map);
return SDL_SetError("Blit combination not supported");
} else if (surface->format->BitsPerPixel < 8 &&
SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
blit = SDL_CalculateBlit0(surface);
} else if (surface->format->BytesPerPixel == 1 &&
SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
blit = SDL_CalculateBlit1(surface);
} else if (map->info.flags & SDL_COPY_BLEND) {
blit = SDL_CalculateBlitA(surface);
} else {
blit = SDL_CalculateBlitN(surface);
}
if (blit == NULL) {
Uint32 src_format = surface->format->format;
Uint32 dst_format = dst->format->format;
blit =
SDL_ChooseBlitFunc(src_format, dst_format, map->info.flags,
SDL_GeneratedBlitFuncTable);
}
#ifndef TEST_SLOW_BLIT
if (blit == NULL)
#endif
{
Uint32 src_format = surface->format->format;
Uint32 dst_format = dst->format->format;
if (!SDL_ISPIXELFORMAT_INDEXED(src_format) &&
!SDL_ISPIXELFORMAT_FOURCC(src_format) &&
!SDL_ISPIXELFORMAT_INDEXED(dst_format) &&
!SDL_ISPIXELFORMAT_FOURCC(dst_format)) {
blit = SDL_Blit_Slow;
}
}
map->data = blit;
/* Make sure we have a blit function */
if (blit == NULL) {
SDL_InvalidateMap(map);
return SDL_SetError("Blit combination not supported");
}
return 0;
}
SDL_CalculateBlitN
SDL_BlitFunc SDL_CalculateBlitN(SDL_Surface *surface)
Definition: SDL_blit_N.c:2537
SDL_BlitMap::blit
SDL_blit blit
Definition: SDL_blit.h:90
dst
GLenum GLenum dst
Definition: SDL_opengl_glext.h:1737
SDL_ISPIXELFORMAT_INDEXED
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:134
SDL_PixelFormat::BytesPerPixel
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_BlitInfo::src_fmt
SDL_PixelFormat * src_fmt
Definition: SDL_blit.h:65
SDL_Blit_Slow
void SDL_Blit_Slow(SDL_BlitInfo *info)
Definition: SDL_blit_slow.c:31
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
SDL_UnRLESurface
void SDL_UnRLESurface(SDL_Surface *surface, int recode)
Definition: SDL_RLEaccel.c:1540
SDL_PixelFormat::Rloss
Uint8 Rloss
Definition: SDL_pixels.h:326
SDL_BlitInfo::dst_pitch
int dst_pitch
Definition: SDL_blit.h:63
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_Surface::flags
Uint32 flags
Definition: SDL_surface.h:71
SDL_COPY_RLE_DESIRED
#define SDL_COPY_RLE_DESIRED
Definition: SDL_blit.h:41
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:972
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_BlitCopy
void SDL_BlitCopy(SDL_BlitInfo *info)
Definition: SDL_blit_copy.c:91
SDL_ChooseBlitFunc
static SDL_BlitFunc SDL_ChooseBlitFunc(Uint32 src_format, Uint32 dst_format, int flags, SDL_BlitFuncEntry *entries)
Definition: SDL_blit.c:128
SDL_PixelFormat::BitsPerPixel
Uint8 BitsPerPixel
Definition: SDL_pixels.h:319
SDL_BlitInfo::dst_fmt
SDL_PixelFormat * dst_fmt
Definition: SDL_blit.h:66
SDL_GeneratedBlitFuncTable
SDL_BlitFuncEntry SDL_GeneratedBlitFuncTable[]
Definition: SDL_blit_auto.c:7287
SDL_BlitInfo::src_pitch
int src_pitch
Definition: SDL_blit.h:59
SDL_RLESurface
int SDL_RLESurface(SDL_Surface *surface)
Definition: SDL_RLEaccel.c:1403
SDL_BlitMap::dst
SDL_Surface * dst
Definition: SDL_blit.h:88
NULL
#define NULL
Definition: begin_code.h:164
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_CalculateBlit0
SDL_BlitFunc SDL_CalculateBlit0(SDL_Surface *surface)
Definition: SDL_blit_0.c:454
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_CalculateBlit1
SDL_BlitFunc SDL_CalculateBlit1(SDL_Surface *surface)
Definition: SDL_blit_1.c:522
SDL_BlitFunc
void(* SDL_BlitFunc)(SDL_BlitInfo *info)
Definition: SDL_blit.h:73
SDL_Surface::pitch
int pitch
Definition: SDL_surface.h:74
SDL_SoftBlit
static int SDL_SoftBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_blit.c:34
SDL_BlitMap::data
void * data
Definition: SDL_blit.h:91
SDL_ISPIXELFORMAT_FOURCC
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:167
SDL_BlitMap
Definition: SDL_blit.h:86
SDL_PixelFormat::format
Uint32 format
Definition: SDL_pixels.h:317
map
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_CalculateBlitA
SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
Definition: SDL_blit_A.c:1269
SDL_BlitMap::identity
int identity
Definition: SDL_blit.h:89
SDL_COPY_BLEND
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:92
SDL_RLEACCEL
#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().

{
int i, flagcheck;
static Uint32 features = 0xffffffff;
/* Get the available CPU features */
if (features == 0xffffffff) {
const char *override = SDL_getenv("SDL_BLIT_CPU_FEATURES");
features = SDL_CPU_ANY;
/* Allow an override for testing .. */
if (override) {
SDL_sscanf(override, "%u", &features);
} else {
if (SDL_HasMMX()) {
features |= SDL_CPU_MMX;
}
if (SDL_Has3DNow()) {
features |= SDL_CPU_3DNOW;
}
if (SDL_HasSSE()) {
features |= SDL_CPU_SSE;
}
if (SDL_HasSSE2()) {
features |= SDL_CPU_SSE2;
}
if (SDL_HasAltiVec()) {
if (SDL_UseAltivecPrefetch()) {
features |= SDL_CPU_ALTIVEC_PREFETCH;
} else {
features |= SDL_CPU_ALTIVEC_NOPREFETCH;
}
}
}
}
for (i = 0; entries[i].func; ++i) {
/* Check for matching pixel formats */
if (src_format != entries[i].src_format) {
continue;
}
if (dst_format != entries[i].dst_format) {
continue;
}
/* Check modulation flags */
flagcheck =
(flags & (SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA));
if ((flagcheck & entries[i].flags) != flagcheck) {
continue;
}
/* Check blend flags */
flagcheck =
(flags &
(SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD));
if ((flagcheck & entries[i].flags) != flagcheck) {
continue;
}
/* Check colorkey flag */
flagcheck = (flags & SDL_COPY_COLORKEY);
if ((flagcheck & entries[i].flags) != flagcheck) {
continue;
}
/* Check scaling flags */
flagcheck = (flags & SDL_COPY_NEAREST);
if ((flagcheck & entries[i].flags) != flagcheck) {
continue;
}
/* Check CPU features */
flagcheck = entries[i].cpu;
if ((flagcheck & features) != flagcheck) {
continue;
}
/* We found the best one! */
return entries[i].func;
}
return NULL;
}
SDL_BlitFuncEntry::func
SDL_BlitFunc func
Definition: SDL_blit.h:82
SDL_CPU_MMX
#define SDL_CPU_MMX
Definition: SDL_blit.h:48
SDL_COPY_MODULATE_COLOR
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
SDL_HasAltiVec
#define SDL_HasAltiVec
Definition: SDL_dynapi_overrides.h:104
SDL_Has3DNow
#define SDL_Has3DNow
Definition: SDL_dynapi_overrides.h:106
SDL_COPY_COLORKEY
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
SDL_COPY_MOD
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_COPY_ADD
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
SDL_COPY_NEAREST
#define SDL_COPY_NEAREST
Definition: SDL_blit.h:40
SDL_BlitFuncEntry::cpu
int cpu
Definition: SDL_blit.h:81
SDL_CPU_ALTIVEC_PREFETCH
#define SDL_CPU_ALTIVEC_PREFETCH
Definition: SDL_blit.h:52
SDL_CPU_3DNOW
#define SDL_CPU_3DNOW
Definition: SDL_blit.h:49
SDL_sscanf
#define SDL_sscanf
Definition: SDL_dynapi_overrides.h:39
SDL_HasMMX
#define SDL_HasMMX
Definition: SDL_dynapi_overrides.h:105
SDL_getenv
#define SDL_getenv
Definition: SDL_dynapi_overrides.h:378
i
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
SDL_CPU_SSE2
#define SDL_CPU_SSE2
Definition: SDL_blit.h:51
NULL
#define NULL
Definition: begin_code.h:164
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
SDL_COPY_MODULATE_ALPHA
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
SDL_HasSSE2
#define SDL_HasSSE2
Definition: SDL_dynapi_overrides.h:108
SDL_CPU_SSE
#define SDL_CPU_SSE
Definition: SDL_blit.h:50
SDL_CPU_ANY
#define SDL_CPU_ANY
Definition: SDL_blit.h:47
SDL_UseAltivecPrefetch
static SDL_bool SDL_UseAltivecPrefetch()
Definition: SDL_blit.c:120
SDL_HasSSE
#define SDL_HasSSE
Definition: SDL_dynapi_overrides.h:107
SDL_CPU_ALTIVEC_NOPREFETCH
#define SDL_CPU_ALTIVEC_NOPREFETCH
Definition: SDL_blit.h:53
SDL_COPY_BLEND
#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().

{
int okay;
int src_locked;
int dst_locked;
/* Everything is okay at the beginning... */
okay = 1;
/* Lock the destination if it's in hardware */
dst_locked = 0;
if (SDL_MUSTLOCK(dst)) {
if (SDL_LockSurface(dst) < 0) {
okay = 0;
} else {
dst_locked = 1;
}
}
/* Lock the source if it's in hardware */
src_locked = 0;
if (SDL_MUSTLOCK(src)) {
if (SDL_LockSurface(src) < 0) {
okay = 0;
} else {
src_locked = 1;
}
}
/* Set up source and destination buffer pointers, and BLIT! */
if (okay && !SDL_RectEmpty(srcrect)) {
SDL_BlitFunc RunBlit;
SDL_BlitInfo *info = &src->map->info;
/* Set up the blit information */
info->src = (Uint8 *) src->pixels +
(Uint16) srcrect->y * src->pitch +
(Uint16) srcrect->x * info->src_fmt->BytesPerPixel;
info->src_w = srcrect->w;
info->src_h = srcrect->h;
info->src_pitch = src->pitch;
info->src_skip =
info->src_pitch - info->src_w * info->src_fmt->BytesPerPixel;
info->dst =
(Uint8 *) dst->pixels + (Uint16) dstrect->y * dst->pitch +
(Uint16) dstrect->x * info->dst_fmt->BytesPerPixel;
info->dst_w = dstrect->w;
info->dst_h = dstrect->h;
info->dst_pitch = dst->pitch;
info->dst_skip =
info->dst_pitch - info->dst_w * info->dst_fmt->BytesPerPixel;
RunBlit = (SDL_BlitFunc) src->map->data;
/* Run the actual software blit */
RunBlit(info);
}
/* We need to unlock the surfaces if they're locked */
if (dst_locked) {
SDL_UnlockSurface(dst);
}
if (src_locked) {
SDL_UnlockSurface(src);
}
/* Blit is done! */
return (okay ? 0 : -1);
}
SDL_UnlockSurface
#define SDL_UnlockSurface
Definition: SDL_dynapi_overrides.h:449
SDL_BlitInfo::src_skip
int src_skip
Definition: SDL_blit.h:60
SDL_PixelFormat::BytesPerPixel
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
SDL_BlitInfo::src_fmt
SDL_PixelFormat * src_fmt
Definition: SDL_blit.h:65
SDL_BlitInfo::src_h
int src_h
Definition: SDL_blit.h:58
SDL_BlitInfo::dst_pitch
int dst_pitch
Definition: SDL_blit.h:63
SDL_BlitInfo::dst_skip
int dst_skip
Definition: SDL_blit.h:64
SDL_BlitInfo::src_w
int src_w
Definition: SDL_blit.h:58
SDL_RectEmpty
SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
Returns true if the rectangle has no area.
Definition: SDL_rect.h:82
SDL_BlitInfo::dst_h
int dst_h
Definition: SDL_blit.h:62
SDL_BlitInfo::dst
Uint8 * dst
Definition: SDL_blit.h:61
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_BlitInfo
Definition: SDL_blit.h:55
SDL_Surface::pixels
void * pixels
Definition: SDL_surface.h:75
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_Rect::x
int x
Definition: SDL_rect.h:66
SDL_BlitInfo::src
Uint8 * src
Definition: SDL_blit.h:57
SDL_Rect::w
int w
Definition: SDL_rect.h:67
SDL_BlitInfo::dst_fmt
SDL_PixelFormat * dst_fmt
Definition: SDL_blit.h:66
SDL_BlitInfo::src_pitch
int src_pitch
Definition: SDL_blit.h:59
SDL_LockSurface
#define SDL_LockSurface
Definition: SDL_dynapi_overrides.h:448
SDL_MUSTLOCK
#define SDL_MUSTLOCK(S)
Definition: SDL_surface.h:61
SDL_Rect::h
int h
Definition: SDL_rect.h:67
SDL_BlitFunc
void(* SDL_BlitFunc)(SDL_BlitInfo *info)
Definition: SDL_blit.h:73
SDL_Surface::pitch
int pitch
Definition: SDL_surface.h:74
Uint16
uint16_t Uint16
Definition: SDL_stdinc.h:169
SDL_BlitMap::data
void * data
Definition: SDL_blit.h:91
SDL_BlitInfo::dst_w
int dst_w
Definition: SDL_blit.h:62
SDL_Rect::y
int y
Definition: SDL_rect.h:66
SDL_BlitMap::info
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().

{
/* Just guess G4 */
return SDL_TRUE;
}
SDL_TRUE
Definition: SDL_stdinc.h:142