SDL_surface.c File Reference
`#include "../SDL_internal.h"`
`#include "SDL_video.h"`
`#include "SDL_sysvideo.h"`
`#include "SDL_blit.h"`
`#include "SDL_RLEaccel_c.h"`
`#include "SDL_pixels_c.h"`
Include dependency graph for SDL_surface.c:

Go to the source code of this file.

## Functions

| SDL_COMPILE_TIME_ASSERT (surface_size_assumptions, sizeof(int)==sizeof(Sint32)&&sizeof(size_t) >=sizeof(Sint32))
SDL_Surface * | SDL_CreateRGBSurface (Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
SDL_Surface * | SDL_CreateRGBSurfaceFrom (void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
int | SDL_SetSurfacePalette (SDL_Surface *surface, SDL_Palette *palette)
| Set the palette used by a surface. More...
int | SDL_SetSurfaceRLE (SDL_Surface *surface, int flag)
| Sets the RLE acceleration hint for a surface. More...
int | SDL_SetColorKey (SDL_Surface *surface, int flag, Uint32 key)
| Sets the color key (transparent pixel) in a blittable surface. More...
int | SDL_GetColorKey (SDL_Surface *surface, Uint32 *key)
| Gets the color key (transparent pixel) in a blittable surface. More...
static void | SDL_ConvertColorkeyToAlpha (SDL_Surface *surface)
int | SDL_SetSurfaceColorMod (SDL_Surface *surface, Uint8 r, Uint8 g, Uint8 b)
| Set an additional color value used in blit operations. More...
int | SDL_GetSurfaceColorMod (SDL_Surface *surface, Uint8 *r, Uint8 *g, Uint8 *b)
| Get the additional color value used in blit operations. More...
int | SDL_SetSurfaceAlphaMod (SDL_Surface *surface, Uint8 alpha)
| Set an additional alpha value used in blit operations. More...
int | SDL_GetSurfaceAlphaMod (SDL_Surface *surface, Uint8 *alpha)
| Get the additional alpha value used in blit operations. More...
int | SDL_SetSurfaceBlendMode (SDL_Surface *surface, SDL_BlendMode blendMode)
| Set the blend mode used for blit operations. More...
int | SDL_GetSurfaceBlendMode (SDL_Surface *surface, SDL_BlendMode *blendMode)
| Get the blend mode used for blit operations. More...
SDL_bool | SDL_SetClipRect (SDL_Surface *surface, const SDL_Rect *rect)
void | SDL_GetClipRect (SDL_Surface *surface, SDL_Rect *rect)
int | SDL_LowerBlit (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
int | SDL_UpperBlit (SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
int | SDL_UpperBlitScaled (SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
int | SDL_LowerBlitScaled (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
int | SDL_LockSurface (SDL_Surface *surface)
| Sets up a surface for directly accessing the pixels. More...
void | SDL_UnlockSurface (SDL_Surface *surface)
SDL_Surface * | SDL_ConvertSurface (SDL_Surface *surface, const SDL_PixelFormat *format, Uint32 flags)
SDL_Surface * | SDL_ConvertSurfaceFormat (SDL_Surface *surface, Uint32 pixel_format, Uint32 flags)
static SDL_INLINE SDL_bool | SDL_CreateSurfaceOnStack (int width, int height, Uint32 pixel_format, void *pixels, int pitch, SDL_Surface *surface, SDL_PixelFormat *format, SDL_BlitMap *blitmap)
int | SDL_ConvertPixels (int width, int height, Uint32 src_format, const void *src, int src_pitch, Uint32 dst_format, void *dst, int dst_pitch)
| Copy a block of pixels of one format to another format. More...
void | SDL_FreeSurface (SDL_Surface *surface)

## Function Documentation

SDL_COMPILE_TIME_ASSERT | ( | surface_size_assumptions | ,
|  | sizeof(int) | = `=sizeof(Sint32)&&sizeof(size_t) >=sizeof(Sint32)`
| ) |  |

static void SDL_ConvertColorkeyToAlpha | ( | SDL_Surface * | surface | ) |

static

Definition at line 253 of file SDL_surface.c.

References SDL_PixelFormat::Amask, SDL_PixelFormat::BytesPerPixel, SDL_BlitInfo::colorkey, SDL_BlitInfo::flags, SDL_Surface::format, SDL_Surface::h, SDL_BlitMap::info, SDL_Surface::map, SDL_Surface::pitch, SDL_Surface::pixels, SDL_BLENDMODE_BLEND, SDL_COPY_COLORKEY, SDL_LockSurface(), SDL_SetColorKey(), SDL_SetSurfaceBlendMode(), SDL_UnlockSurface(), and SDL_Surface::w.

Referenced by SDL_ConvertSurface().

{
int x, y;
if (!surface) {
return;
}
if (!(surface->map->info.flags & SDL_COPY_COLORKEY) ||
!surface->format->Amask) {
return;
}
SDL_LockSurface(surface);
switch (surface->format->BytesPerPixel) {
case 2:
{
Uint16 *row, *spot;
Uint16 ckey = (Uint16) surface->map->info.colorkey;
Uint16 mask = (Uint16) (~surface->format->Amask);
/* Ignore alpha in colorkey comparison */
ckey &= mask;
row = (Uint16 *) surface->pixels;
for (y = surface->h; y--;) {
spot = row;
for (x = surface->w; x--;) {
if ((*spot & mask) == ckey) {
*spot &= mask;
}
++spot;
}
row += surface->pitch / 2;
}
}
break;
case 3:
/* FIXME */
break;
case 4:
{
Uint32 *row, *spot;
Uint32 ckey = surface->map->info.colorkey;
Uint32 mask = ~surface->format->Amask;
/* Ignore alpha in colorkey comparison */
ckey &= mask;
row = (Uint32 *) surface->pixels;
for (y = surface->h; y--;) {
spot = row;
for (x = surface->w; x--;) {
if ((*spot & mask) == ckey) {
*spot &= mask;
}
++spot;
}
row += surface->pitch / 4;
}
}
break;
}
SDL_UnlockSurface(surface);
SDL_SetColorKey(surface, 0, 0);
SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);
}
SDL_UnlockSurface
void SDL_UnlockSurface(SDL_Surface *surface)
Definition: SDL_surface.c:837
SDL_COPY_COLORKEY
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
Uint32
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
SDL_Surface::h
int h
Definition: SDL_surface.h:73
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1567
SDL_LockSurface
int SDL_LockSurface(SDL_Surface *surface)
Sets up a surface for directly accessing the pixels.
Definition: SDL_surface.c:816
SDL_PixelFormat::BytesPerPixel
Uint8 BytesPerPixel
Definition: SDL_pixels.h:304
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_SetSurfaceBlendMode
int SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode)
Set the blend mode used for blit operations.
Definition: SDL_surface.c:404
SDL_Surface::w
int w
Definition: SDL_surface.h:73
SDL_SetColorKey
int SDL_SetColorKey(SDL_Surface *surface, int flag, Uint32 key)
Sets the color key (transparent pixel) in a blittable surface.
Definition: SDL_surface.c:190
SDL_BlitInfo::colorkey
Uint32 colorkey
Definition: SDL_blit.h:69
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1567
SDL_Surface::pixels
void * pixels
Definition: SDL_surface.h:75
mask
GLenum GLint GLuint mask
Definition: SDL_opengl_glext.h:657
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_Surface::pitch
int pitch
Definition: SDL_surface.h:74
Uint16
uint16_t Uint16
An unsigned 16-bit integer type.
Definition: SDL_stdinc.h:147
SDL_PixelFormat::Amask
Uint32 Amask
Definition: SDL_pixels.h:309
row
GLenum GLenum void * row
Definition: SDL_opengl_glext.h:3138
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44

int SDL_ConvertPixels | ( | int | width,
|  | int | height,
|  | Uint32 | src_format,
|  | const void * | src,
|  | int | src_pitch,
|  | Uint32 | dst_format,
|  | void * | dst,
|  | int | dst_pitch
| ) |  |

Copy a block of pixels of one format to another format.

Returns
  0 on success, or -1 if there was an error

Definition at line 1035 of file SDL_surface.c.

References SDL_Rect::h, i, rect, SDL_BYTESPERPIXEL, SDL_CreateSurfaceOnStack(), SDL_InvalidParamError, SDL_ISPIXELFORMAT_FOURCC, SDL_LowerBlit(), SDL_memcpy, SDL_PIXELFORMAT_IYUV, SDL_PIXELFORMAT_NV12, SDL_PIXELFORMAT_NV21, SDL_PIXELFORMAT_UYVY, SDL_PIXELFORMAT_YUY2, SDL_PIXELFORMAT_YV12, SDL_PIXELFORMAT_YVYU, SDL_SetError, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

{
SDL_Surface src_surface, dst_surface;
SDL_PixelFormat src_fmt, dst_fmt;
SDL_BlitMap src_blitmap, dst_blitmap;
SDL_Rect rect;
void *nonconst_src = (void *) src;
/* Check to make sure we are blitting somewhere, so we don't crash */
if (!dst) {
return SDL_InvalidParamError("dst");
}
if (!dst_pitch) {
return SDL_InvalidParamError("dst_pitch");
}
/* Fast path for same format copy */
if (src_format == dst_format) {
int bpp, i;
if (SDL_ISPIXELFORMAT_FOURCC(src_format)) {
switch (src_format) {
case SDL_PIXELFORMAT_YUY2:
case SDL_PIXELFORMAT_UYVY:
case SDL_PIXELFORMAT_YVYU:
bpp = 2;
break;
case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV:
case SDL_PIXELFORMAT_NV12:
case SDL_PIXELFORMAT_NV21:
bpp = 1;
break;
default:
return SDL_SetError("Unknown FOURCC pixel format");
}
} else {
bpp = SDL_BYTESPERPIXEL(src_format);
}
width *= bpp;
for (i = height; i--;) {
SDL_memcpy(dst, src, width);
src = (Uint8*)src + src_pitch;
dst = (Uint8*)dst + dst_pitch;
}
if (src_format == SDL_PIXELFORMAT_YV12 || src_format == SDL_PIXELFORMAT_IYUV) {
/* U and V planes are a quarter the size of the Y plane */
width /= 2;
height /= 2;
src_pitch /= 2;
dst_pitch /= 2;
for (i = height * 2; i--;) {
SDL_memcpy(dst, src, width);
src = (Uint8*)src + src_pitch;
dst = (Uint8*)dst + dst_pitch;
}
} else if (src_format == SDL_PIXELFORMAT_NV12 || src_format == SDL_PIXELFORMAT_NV21) {
/* U/V plane is half the height of the Y plane */
height /= 2;
for (i = height; i--;) {
SDL_memcpy(dst, src, width);
src = (Uint8*)src + src_pitch;
dst = (Uint8*)dst + dst_pitch;
}
}
return 0;
}
if (!SDL_CreateSurfaceOnStack(width, height, src_format, nonconst_src,
src_pitch,
&src_surface, &src_fmt, &src_blitmap)) {
return -1;
}
if (!SDL_CreateSurfaceOnStack(width, height, dst_format, dst, dst_pitch,
&dst_surface, &dst_fmt, &dst_blitmap)) {
return -1;
}
/* Set up the rect and go! */
rect.x = 0;
rect.y = 0;
rect.w = width;
rect.h = height;
return SDL_LowerBlit(&src_surface, &rect, &dst_surface, &rect);
}
dst
GLenum GLenum dst
Definition: SDL_opengl_glext.h:1737
width
GLint GLint GLsizei width
Definition: SDL_opengl.h:1565
rect
SDL_Rect rect
Definition: testrelative.c:27
SDL_CreateSurfaceOnStack
static SDL_INLINE SDL_bool SDL_CreateSurfaceOnStack(int width, int height, Uint32 pixel_format, void *pixels, int pitch, SDL_Surface *surface, SDL_PixelFormat *format, SDL_BlitMap *blitmap)
Definition: SDL_surface.c:997
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
SDL_BYTESPERPIXEL
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:127
SDL_PIXELFORMAT_NV21
Definition: SDL_pixels.h:275
SDL_InvalidParamError
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
height
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1565
SDL_LowerBlit
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
SDL_PIXELFORMAT_YVYU
Definition: SDL_pixels.h:271
SDL_PIXELFORMAT_NV12
Definition: SDL_pixels.h:273
SDL_memcpy
#define SDL_memcpy
Definition: SDL_dynapi_overrides.h:393
Uint8
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
SDL_Rect::x
int x
Definition: SDL_rect.h:66
SDL_Rect::w
int w
Definition: SDL_rect.h:67
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:42
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
SDL_PIXELFORMAT_YV12
Definition: SDL_pixels.h:263
SDL_Rect::h
int h
Definition: SDL_rect.h:67
SDL_PIXELFORMAT_IYUV
Definition: SDL_pixels.h:265
SDL_PixelFormat
Definition: SDL_pixels.h:299
SDL_PIXELFORMAT_UYVY
Definition: SDL_pixels.h:269
SDL_PIXELFORMAT_YUY2
Definition: SDL_pixels.h:267
SDL_ISPIXELFORMAT_FOURCC
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:166
SDL_BlitMap
Definition: SDL_blit.h:85
src
GLenum src
Definition: SDL_opengl_glext.h:1737
SDL_Rect::y
int y
Definition: SDL_rect.h:66
SDL_Rect
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

SDL_Surface* SDL_ConvertSurface | ( | SDL_Surface * | src,
|  | const SDL_PixelFormat * | fmt,
|  | Uint32 | flags
| ) |  |

Creates a new surface of the specified format, and then copies and maps the given surface to it so the blit of the converted surface will be as fast as possible. If this function fails, it returns NULL.

The `flags` parameter is passed to SDL_CreateRGBSurface() and has those semantics. You can also pass SDL_RLEACCEL in the flags parameter and SDL will try to RLE accelerate colorkey and alpha blits in the resulting surface.

Definition at line 855 of file SDL_surface.c.

References SDL_BlitInfo::a, SDL_Color::a, SDL_PixelFormat::Amask, SDL_BlitInfo::b, SDL_Color::b, SDL_PixelFormat::BitsPerPixel, SDL_PixelFormat::Bmask, SDL_Surface::clip_rect, SDL_BlitInfo::colorkey, SDL_Palette::colors, SDL_BlitInfo::flags, SDL_Surface::format, SDL_BlitInfo::g, SDL_Color::g, SDL_PixelFormat::Gmask, SDL_Rect::h, SDL_Surface::h, i, SDL_BlitMap::info, SDL_Surface::map, SDL_Palette::ncolors, NULL, SDL_PixelFormat::palette, SDL_BlitInfo::r, SDL_Color::r, SDL_PixelFormat::Rmask, SDL_BLENDMODE_BLEND, SDL_ConvertColorkeyToAlpha(), SDL_COPY_BLEND, SDL_COPY_COLORKEY, SDL_COPY_MODULATE_ALPHA, SDL_COPY_RLE_ALPHAKEY, SDL_COPY_RLE_COLORKEY, SDL_COPY_RLE_DESIRED, SDL_CreateRGBSurface(), SDL_FALSE, SDL_GetRGBA, SDL_InvalidateMap(), SDL_LowerBlit(), SDL_MapRGBA, SDL_memcmp, SDL_memcpy, SDL_RLEACCEL, SDL_SetClipRect(), SDL_SetColorKey(), SDL_SetError, SDL_SetSurfaceBlendMode(), SDL_SetSurfaceRLE(), SDL_TRUE, SDL_Rect::w, SDL_Surface::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SDL_ConvertSurfaceFormat().

{
SDL_Surface *convert;
Uint32 copy_flags;
SDL_Color copy_color;
SDL_Rect bounds;
/* Check for empty destination palette! (results in empty image) */
if (format->palette != NULL) {
int i;
for (i = 0; i < format->palette->ncolors; ++i) {
if ((format->palette->colors[i].r != 0xFF) ||
(format->palette->colors[i].g != 0xFF) ||
(format->palette->colors[i].b != 0xFF))
break;
}
if (i == format->palette->ncolors) {
SDL_SetError("Empty destination palette");
return (NULL);
}
}
/* Create a new surface with the desired format */
convert = SDL_CreateRGBSurface(flags, surface->w, surface->h,
format->BitsPerPixel, format->Rmask,
format->Gmask, format->Bmask,
format->Amask);
if (convert == NULL) {
return (NULL);
}
/* Copy the palette if any */
if (format->palette && convert->format->palette) {
SDL_memcpy(convert->format->palette->colors,
format->palette->colors,
format->palette->ncolors * sizeof(SDL_Color));
convert->format->palette->ncolors = format->palette->ncolors;
}
/* Save the original copy flags */
copy_flags = surface->map->info.flags;
copy_color.r = surface->map->info.r;
copy_color.g = surface->map->info.g;
copy_color.b = surface->map->info.b;
copy_color.a = surface->map->info.a;
surface->map->info.r = 0xFF;
surface->map->info.g = 0xFF;
surface->map->info.b = 0xFF;
surface->map->info.a = 0xFF;
surface->map->info.flags = 0;
SDL_InvalidateMap(surface->map);
/* Copy over the image data */
bounds.x = 0;
bounds.y = 0;
bounds.w = surface->w;
bounds.h = surface->h;
SDL_LowerBlit(surface, &bounds, convert, &bounds);
/* Clean up the original surface, and update converted surface */
convert->map->info.r = copy_color.r;
convert->map->info.g = copy_color.g;
convert->map->info.b = copy_color.b;
convert->map->info.a = copy_color.a;
convert->map->info.flags =
(copy_flags &
~(SDL_COPY_COLORKEY | SDL_COPY_BLEND
| SDL_COPY_RLE_DESIRED | SDL_COPY_RLE_COLORKEY |
SDL_COPY_RLE_ALPHAKEY));
surface->map->info.r = copy_color.r;
surface->map->info.g = copy_color.g;
surface->map->info.b = copy_color.b;
surface->map->info.a = copy_color.a;
surface->map->info.flags = copy_flags;
SDL_InvalidateMap(surface->map);
if (copy_flags & SDL_COPY_COLORKEY) {
SDL_bool set_colorkey_by_color = SDL_FALSE;
if (surface->format->palette) {
if (format->palette &&
surface->format->palette->ncolors <= format->palette->ncolors &&
(SDL_memcmp(surface->format->palette->colors, format->palette->colors,
surface->format->palette->ncolors * sizeof(SDL_Color)) == 0)) {
/* The palette is identical, just set the same colorkey */
SDL_SetColorKey(convert, 1, surface->map->info.colorkey);
} else if (format->Amask) {
/* The alpha was set in the destination from the palette */
} else {
set_colorkey_by_color = SDL_TRUE;
}
} else {
set_colorkey_by_color = SDL_TRUE;
}
if (set_colorkey_by_color) {
/* Set the colorkey by color, which needs to be unique */
Uint8 keyR, keyG, keyB, keyA;
SDL_GetRGBA(surface->map->info.colorkey, surface->format, &keyR,
&keyG, &keyB, &keyA);
SDL_SetColorKey(convert, 1,
SDL_MapRGBA(convert->format, keyR, keyG, keyB, keyA));
/* This is needed when converting for 3D texture upload */
SDL_ConvertColorkeyToAlpha(convert);
}
}
SDL_SetClipRect(convert, &surface->clip_rect);
/* Enable alpha blending by default if the new surface has an
* alpha channel or alpha modulation */
if ((surface->format->Amask && format->Amask) ||
(copy_flags & (SDL_COPY_COLORKEY|SDL_COPY_MODULATE_ALPHA))) {
SDL_SetSurfaceBlendMode(convert, SDL_BLENDMODE_BLEND);
}
if ((copy_flags & SDL_COPY_RLE_DESIRED) || (flags & SDL_RLEACCEL)) {
SDL_SetSurfaceRLE(convert, SDL_RLEACCEL);
}
/* We're ready to go! */
return (convert);
}
SDL_BlitInfo::r
Uint8 r
Definition: SDL_blit.h:70
SDL_BlitInfo::b
Uint8 b
Definition: SDL_blit.h:70
SDL_SetClipRect
SDL_bool SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect)
Definition: SDL_surface.c:470
SDL_Color
Definition: SDL_pixels.h:279
SDL_COPY_COLORKEY
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
SDL_SetSurfaceRLE
int SDL_SetSurfaceRLE(SDL_Surface *surface, int flag)
Sets the RLE acceleration hint for a surface.
Definition: SDL_surface.c:169
Uint32
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
SDL_Color::g
Uint8 g
Definition: SDL_pixels.h:282
SDL_PixelFormat::Gmask
Uint32 Gmask
Definition: SDL_pixels.h:307
SDL_Surface::h
int h
Definition: SDL_surface.h:73
SDL_MapRGBA
#define SDL_MapRGBA
Definition: SDL_dynapi_overrides.h:293
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_BlitInfo::g
Uint8 g
Definition: SDL_blit.h:70
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
SDL_PixelFormat::Bmask
Uint32 Bmask
Definition: SDL_pixels.h:308
SDL_SetSurfaceBlendMode
int SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode)
Set the blend mode used for blit operations.
Definition: SDL_surface.c:404
SDL_ConvertColorkeyToAlpha
static void SDL_ConvertColorkeyToAlpha(SDL_Surface *surface)
Definition: SDL_surface.c:253
SDL_Color::b
Uint8 b
Definition: SDL_pixels.h:283
SDL_COPY_RLE_COLORKEY
#define SDL_COPY_RLE_COLORKEY
Definition: SDL_blit.h:42
SDL_Surface::w
int w
Definition: SDL_surface.h:73
SDL_LowerBlit
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
SDL_SetColorKey
int SDL_SetColorKey(SDL_Surface *surface, int flag, Uint32 key)
Sets the color key (transparent pixel) in a blittable surface.
Definition: SDL_surface.c:190
SDL_BlitInfo::colorkey
Uint32 colorkey
Definition: SDL_blit.h:69
SDL_COPY_RLE_DESIRED
#define SDL_COPY_RLE_DESIRED
Definition: SDL_blit.h:41
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:126
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_memcpy
#define SDL_memcpy
Definition: SDL_dynapi_overrides.h:393
SDL_Color::r
Uint8 r
Definition: SDL_pixels.h:281
SDL_Color::a
Uint8 a
Definition: SDL_pixels.h:284
Uint8
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
SDL_PixelFormat::BitsPerPixel
Uint8 BitsPerPixel
Definition: SDL_pixels.h:303
SDL_memcmp
#define SDL_memcmp
Definition: SDL_dynapi_overrides.h:395
SDL_Palette::ncolors
int ncolors
Definition: SDL_pixels.h:290
SDL_Rect::x
int x
Definition: SDL_rect.h:66
SDL_TRUE
Definition: SDL_stdinc.h:129
SDL_Rect::w
int w
Definition: SDL_rect.h:67
SDL_GetRGBA
#define SDL_GetRGBA
Definition: SDL_dynapi_overrides.h:295
SDL_Surface::clip_rect
SDL_Rect clip_rect
Definition: SDL_surface.h:85
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:42
NULL
#define NULL
Definition: begin_code.h:143
SDL_Palette::colors
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
SDL_CreateRGBSurface
SDL_Surface * SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
Definition: SDL_surface.c:38
SDL_PixelFormat::Rmask
Uint32 Rmask
Definition: SDL_pixels.h:306
SDL_COPY_MODULATE_ALPHA
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
SDL_Rect::h
int h
Definition: SDL_rect.h:67
SDL_COPY_RLE_ALPHAKEY
#define SDL_COPY_RLE_ALPHAKEY
Definition: SDL_blit.h:43
SDL_FALSE
Definition: SDL_stdinc.h:128
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
SDL_PixelFormat::Amask
Uint32 Amask
Definition: SDL_pixels.h:309
SDL_PixelFormat::palette
SDL_Palette * palette
Definition: SDL_pixels.h:302
SDL_Rect::y
int y
Definition: SDL_rect.h:66
SDL_COPY_BLEND
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_Rect
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64
SDL_RLEACCEL
#define SDL_RLEACCEL
Definition: SDL_surface.h:54
SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44
SDL_BlitInfo::a
Uint8 a
Definition: SDL_blit.h:70

SDL_Surface* SDL_ConvertSurfaceFormat | ( | SDL_Surface * | surface,
|  | Uint32 | pixel_format,
|  | Uint32 | flags
| ) |  |

Definition at line 979 of file SDL_surface.c.

References NULL, SDL_AllocFormat, SDL_ConvertSurface(), SDL_FreeFormat, and SDL_INLINE.

{
SDL_PixelFormat *fmt;
SDL_Surface *convert = NULL;
fmt = SDL_AllocFormat(pixel_format);
if (fmt) {
convert = SDL_ConvertSurface(surface, fmt, flags);
SDL_FreeFormat(fmt);
}
return convert;
}
SDL_ConvertSurface
SDL_Surface * SDL_ConvertSurface(SDL_Surface *surface, const SDL_PixelFormat *format, Uint32 flags)
Definition: SDL_surface.c:855
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
SDL_AllocFormat
#define SDL_AllocFormat
Definition: SDL_dynapi_overrides.h:286
SDL_FreeFormat
#define SDL_FreeFormat
Definition: SDL_dynapi_overrides.h:287
NULL
#define NULL
Definition: begin_code.h:143
SDL_PixelFormat
Definition: SDL_pixels.h:299
pixel_format
Uint32 pixel_format
Definition: testoverlay2.c:152
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480

SDL_Surface* SDL_CreateRGBSurface | ( | Uint32 | flags,
|  | int | width,
|  | int | height,
|  | int | depth,
|  | Uint32 | Rmask,
|  | Uint32 | Gmask,
|  | Uint32 | Bmask,
|  | Uint32 | Amask
| ) |  |

Allocate and free an RGB surface.

If the depth is 4 or 8 bits, an empty palette is allocated for the surface. If the depth is greater than 8 bits, the pixel format is set using the flags '[RGB]mask'.

If the function runs out of memory, it will return NULL.

Parameters

  flags | The `flags` are obsolete and should be set to 0.
  width | The width in pixels of the surface to create.
  height | The height in pixels of the surface to create.
  depth | The depth in bits of the surface to create.
  Rmask | The red mask of the surface to create.
  Gmask | The green mask of the surface to create.
  Bmask | The blue mask of the surface to create.
  Amask | The alpha mask of the surface to create.

Definition at line 38 of file SDL_surface.c.

References SDL_Color::b, SDL_PixelFormat::BitsPerPixel, SDL_Palette::colors, SDL_Surface::format, SDL_PixelFormat::format, SDL_Color::g, SDL_Surface::h, SDL_Surface::map, SDL_Palette::ncolors, NULL, SDL_Surface::pitch, SDL_Surface::pixels, SDL_Color::r, SDL_Surface::refcount, SDL_AllocBlitMap(), SDL_AllocFormat, SDL_AllocPalette, SDL_BLENDMODE_BLEND, SDL_CalculatePitch(), SDL_calloc(), SDL_FreePalette, SDL_FreeSurface(), SDL_ISPIXELFORMAT_INDEXED, SDL_malloc, SDL_MasksToPixelFormatEnum, SDL_MAX_SINT32, SDL_memset, SDL_OutOfMemory, SDL_PIXELFORMAT_UNKNOWN, SDL_SetClipRect(), SDL_SetError, SDL_SetSurfaceBlendMode(), SDL_SetSurfacePalette(), void, and SDL_Surface::w.

Referenced by SDL_ConvertSurface(), and SDL_CreateRGBSurfaceFrom().

{
SDL_Surface *surface;
Uint32 format;
/* The flags are no longer used, make the compiler happy */
(void)flags;
/* Get the pixel format */
format = SDL_MasksToPixelFormatEnum(depth, Rmask, Gmask, Bmask, Amask);
if (format == SDL_PIXELFORMAT_UNKNOWN) {
SDL_SetError("Unknown pixel format");
return NULL;
}
/* Allocate the surface */
surface = (SDL_Surface *) SDL_calloc(1, sizeof(*surface));
if (surface == NULL) {
SDL_OutOfMemory();
return NULL;
}
surface->format = SDL_AllocFormat(format);
if (!surface->format) {
SDL_FreeSurface(surface);
return NULL;
}
surface->w = width;
surface->h = height;
surface->pitch = SDL_CalculatePitch(surface);
SDL_SetClipRect(surface, NULL);
if (SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
SDL_Palette *palette =
SDL_AllocPalette((1 << surface->format->BitsPerPixel));
if (!palette) {
SDL_FreeSurface(surface);
return NULL;
}
if (palette->ncolors == 2) {
/* Create a black and white bitmap palette */
palette->colors[0].r = 0xFF;
palette->colors[0].g = 0xFF;
palette->colors[0].b = 0xFF;
palette->colors[1].r = 0x00;
palette->colors[1].g = 0x00;
palette->colors[1].b = 0x00;
}
SDL_SetSurfacePalette(surface, palette);
SDL_FreePalette(palette);
}
/* Get the pixels */
if (surface->w && surface->h) {
/* Assumptions checked in surface_size_assumptions assert above */
Sint64 size = ((Sint64)surface->h * surface->pitch);
if (size < 0 || size > SDL_MAX_SINT32) {
/* Overflow... */
SDL_FreeSurface(surface);
SDL_OutOfMemory();
return NULL;
}
surface->pixels = SDL_malloc((size_t)size);
if (!surface->pixels) {
SDL_FreeSurface(surface);
SDL_OutOfMemory();
return NULL;
}
/* This is important for bitmaps */
SDL_memset(surface->pixels, 0, surface->h * surface->pitch);
}
/* Allocate an empty mapping */
surface->map = SDL_AllocBlitMap();
if (!surface->map) {
SDL_FreeSurface(surface);
return NULL;
}
/* By default surface with an alpha mask are set up for blending */
if (Amask) {
SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);
}
/* The surface is ready to go */
surface->refcount = 1;
return surface;
}
format
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1565
SDL_SetClipRect
SDL_bool SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect)
Definition: SDL_surface.c:470
width
GLint GLint GLsizei width
Definition: SDL_opengl.h:1565
Uint32
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
SDL_Color::g
Uint8 g
Definition: SDL_pixels.h:282
SDL_Surface::h
int h
Definition: SDL_surface.h:73
SDL_ISPIXELFORMAT_INDEXED
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:133
SDL_MasksToPixelFormatEnum
#define SDL_MasksToPixelFormatEnum
Definition: SDL_dynapi_overrides.h:285
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
SDL_SetSurfaceBlendMode
int SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode)
Set the blend mode used for blit operations.
Definition: SDL_surface.c:404
SDL_Color::b
Uint8 b
Definition: SDL_pixels.h:283
SDL_AllocFormat
#define SDL_AllocFormat
Definition: SDL_dynapi_overrides.h:286
SDL_MAX_SINT32
#define SDL_MAX_SINT32
A signed 32-bit integer type.
Definition: SDL_stdinc.h:151
height
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1565
SDL_Surface::w
int w
Definition: SDL_surface.h:73
size
GLsizeiptr size
Definition: SDL_opengl_glext.h:537
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_Palette
Definition: SDL_pixels.h:288
SDL_calloc
void * SDL_calloc(size_t nmemb, size_t size)
SDL_Color::r
Uint8 r
Definition: SDL_pixels.h:281
SDL_Surface::pixels
void * pixels
Definition: SDL_surface.h:75
SDL_PixelFormat::BitsPerPixel
Uint8 BitsPerPixel
Definition: SDL_pixels.h:303
SDL_SetSurfacePalette
int SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette)
Set the palette used by a surface.
Definition: SDL_surface.c:155
SDL_Palette::ncolors
int ncolors
Definition: SDL_pixels.h:290
SDL_PIXELFORMAT_UNKNOWN
Definition: SDL_pixels.h:172
SDL_AllocPalette
#define SDL_AllocPalette
Definition: SDL_dynapi_overrides.h:288
SDL_FreeSurface
void SDL_FreeSurface(SDL_Surface *surface)
Definition: SDL_surface.c:1129
NULL
#define NULL
Definition: begin_code.h:143
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_Palette::colors
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
depth
GLint GLint GLsizei GLsizei GLsizei depth
Definition: SDL_opengl.h:1565
SDL_FreePalette
#define SDL_FreePalette
Definition: SDL_dynapi_overrides.h:291
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
void
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
Definition: SDL_dynapi_procs.h:93
SDL_Surface::refcount
int refcount
Definition: SDL_surface.h:91
SDL_Surface::pitch
int pitch
Definition: SDL_surface.h:74
SDL_AllocBlitMap
SDL_BlitMap * SDL_AllocBlitMap(void)
Definition: SDL_pixels.c:954
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
SDL_CalculatePitch
int SDL_CalculatePitch(SDL_Surface *surface)
Definition: SDL_pixels.c:748
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:380
Sint64
int64_t Sint64
A signed 64-bit integer type.
Definition: SDL_stdinc.h:162
SDL_PixelFormat::format
Uint32 format
Definition: SDL_pixels.h:301
SDL_memset
#define SDL_memset
Definition: SDL_dynapi_overrides.h:392
SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44

SDL_Surface* SDL_CreateRGBSurfaceFrom | ( | void * | pixels,
|  | int | width,
|  | int | height,
|  | int | depth,
|  | int | pitch,
|  | Uint32 | Rmask,
|  | Uint32 | Gmask,
|  | Uint32 | Bmask,
|  | Uint32 | Amask
| ) |  |

Definition at line 134 of file SDL_surface.c.

References SDL_Surface::flags, SDL_Surface::h, NULL, SDL_Surface::pitch, SDL_Surface::pixels, SDL_CreateRGBSurface(), SDL_PREALLOC, SDL_SetClipRect(), and SDL_Surface::w.

{
SDL_Surface *surface;
surface =
SDL_CreateRGBSurface(0, 0, 0, depth, Rmask, Gmask, Bmask, Amask);
if (surface != NULL) {
surface->flags |= SDL_PREALLOC;
surface->pixels = pixels;
surface->w = width;
surface->h = height;
surface->pitch = pitch;
SDL_SetClipRect(surface, NULL);
}
return surface;
}
SDL_SetClipRect
SDL_bool SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect)
Definition: SDL_surface.c:470
width
GLint GLint GLsizei width
Definition: SDL_opengl.h:1565
SDL_Surface::h
int h
Definition: SDL_surface.h:73
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
pixels
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1565
height
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1565
SDL_Surface::w
int w
Definition: SDL_surface.h:73
SDL_Surface::flags
Uint32 flags
Definition: SDL_surface.h:71
SDL_Surface::pixels
void * pixels
Definition: SDL_surface.h:75
NULL
#define NULL
Definition: begin_code.h:143
depth
GLint GLint GLsizei GLsizei GLsizei depth
Definition: SDL_opengl.h:1565
SDL_CreateRGBSurface
SDL_Surface * SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
Definition: SDL_surface.c:38
SDL_Surface::pitch
int pitch
Definition: SDL_surface.h:74
SDL_PREALLOC
#define SDL_PREALLOC
Definition: SDL_surface.h:53

static SDL_INLINE SDL_bool SDL_CreateSurfaceOnStack | ( | int | width,
|  | int | height,
|  | Uint32 | pixel_format,
|  | void * | pixels,
|  | int | pitch,
|  | SDL_Surface * | surface,
|  | SDL_PixelFormat * | format,
|  | SDL_BlitMap * | blitmap
| ) |  |

static

Definition at line 997 of file SDL_surface.c.

References SDL_BlitInfo::a, SDL_BlitInfo::b, SDL_Surface::flags, SDL_Surface::format, SDL_BlitInfo::g, SDL_Surface::h, SDL_BlitMap::info, SDL_Surface::map, SDL_Surface::pitch, SDL_Surface::pixels, SDL_BlitInfo::r, SDL_Surface::refcount, SDL_FALSE, SDL_InitFormat(), SDL_ISPIXELFORMAT_INDEXED, SDL_PREALLOC, SDL_SetError, SDL_TRUE, SDL_zerop, and SDL_Surface::w.

Referenced by SDL_ConvertPixels().

{
if (SDL_ISPIXELFORMAT_INDEXED(pixel_format)) {
SDL_SetError("Indexed pixel formats not supported");
return SDL_FALSE;
}
if (SDL_InitFormat(format, pixel_format) < 0) {
return SDL_FALSE;
}
SDL_zerop(surface);
surface->flags = SDL_PREALLOC;
surface->format = format;
surface->pixels = pixels;
surface->w = width;
surface->h = height;
surface->pitch = pitch;
/* We don't actually need to set up the clip rect for our purposes */
/* SDL_SetClipRect(surface, NULL); */
/* Allocate an empty mapping */
SDL_zerop(blitmap);
blitmap->info.r = 0xFF;
blitmap->info.g = 0xFF;
blitmap->info.b = 0xFF;
blitmap->info.a = 0xFF;
surface->map = blitmap;
/* The surface is ready to go */
surface->refcount = 1;
return SDL_TRUE;
}
SDL_BlitInfo::r
Uint8 r
Definition: SDL_blit.h:70
format
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1565
SDL_BlitInfo::b
Uint8 b
Definition: SDL_blit.h:70
width
GLint GLint GLsizei width
Definition: SDL_opengl.h:1565
SDL_Surface::h
int h
Definition: SDL_surface.h:73
SDL_ISPIXELFORMAT_INDEXED
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:133
SDL_BlitInfo::g
Uint8 g
Definition: SDL_blit.h:70
pixels
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1565
height
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1565
SDL_Surface::w
int w
Definition: SDL_surface.h:73
SDL_zerop
#define SDL_zerop(x)
Definition: SDL_stdinc.h:358
SDL_Surface::flags
Uint32 flags
Definition: SDL_surface.h:71
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_Surface::pixels
void * pixels
Definition: SDL_surface.h:75
SDL_TRUE
Definition: SDL_stdinc.h:129
SDL_InitFormat
int SDL_InitFormat(SDL_PixelFormat *format, Uint32 pixel_format)
Definition: SDL_pixels.c:521
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
SDL_Surface::refcount
int refcount
Definition: SDL_surface.h:91
SDL_FALSE
Definition: SDL_stdinc.h:128
SDL_Surface::pitch
int pitch
Definition: SDL_surface.h:74
pixel_format
Uint32 pixel_format
Definition: testoverlay2.c:152
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_PREALLOC
#define SDL_PREALLOC
Definition: SDL_surface.h:53
SDL_BlitInfo::a
Uint8 a
Definition: SDL_blit.h:70

void SDL_FreeSurface | ( | SDL_Surface * | surface | ) |

Definition at line 1129 of file SDL_surface.c.

References SDL_Surface::flags, SDL_Surface::format, SDL_Surface::locked, SDL_Surface::map, NULL, SDL_Surface::pixels, SDL_Surface::refcount, SDL_DONTFREE, SDL_free(), SDL_FreeBlitMap(), SDL_FreeFormat, SDL_PREALLOC, SDL_RLEACCEL, SDL_SetSurfacePalette(), SDL_UnlockSurface(), and SDL_UnRLESurface().

Referenced by SDL_CreateRGBSurface().

{
if (surface == NULL) {
return;
}
if (surface->flags & SDL_DONTFREE) {
return;
}
if (--surface->refcount > 0) {
return;
}
while (surface->locked > 0) {
SDL_UnlockSurface(surface);
}
if (surface->flags & SDL_RLEACCEL) {
SDL_UnRLESurface(surface, 0);
}
if (surface->format) {
SDL_SetSurfacePalette(surface, NULL);
SDL_FreeFormat(surface->format);
surface->format = NULL;
}
if (surface->map != NULL) {
SDL_FreeBlitMap(surface->map);
surface->map = NULL;
}
if (!(surface->flags & SDL_PREALLOC)) {
SDL_free(surface->pixels);
}
SDL_free(surface);
}
SDL_UnlockSurface
void SDL_UnlockSurface(SDL_Surface *surface)
Definition: SDL_surface.c:837
SDL_DONTFREE
#define SDL_DONTFREE
Definition: SDL_surface.h:55
SDL_UnRLESurface
void SDL_UnRLESurface(SDL_Surface *surface, int recode)
Definition: SDL_RLEaccel.c:1540
SDL_Surface::flags
Uint32 flags
Definition: SDL_surface.h:71
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_Surface::pixels
void * pixels
Definition: SDL_surface.h:75
SDL_SetSurfacePalette
int SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette)
Set the palette used by a surface.
Definition: SDL_surface.c:155
SDL_free
void SDL_free(void *mem)
SDL_FreeFormat
#define SDL_FreeFormat
Definition: SDL_dynapi_overrides.h:287
SDL_Surface::locked
int locked
Definition: SDL_surface.h:81
NULL
#define NULL
Definition: begin_code.h:143
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_Surface::refcount
int refcount
Definition: SDL_surface.h:91
SDL_FreeBlitMap
void SDL_FreeBlitMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:1079
SDL_PREALLOC
#define SDL_PREALLOC
Definition: SDL_surface.h:53
SDL_RLEACCEL
#define SDL_RLEACCEL
Definition: SDL_surface.h:54

void SDL_GetClipRect | ( | SDL_Surface * | surface,
|  | SDL_Rect * | rect
| ) |  |

Gets the clipping rectangle for the destination surface in a blit.

`rect` must be a pointer to a valid rectangle which will be filled with the correct values.

Definition at line 494 of file SDL_surface.c.

References SDL_Surface::clip_rect.

{
if (surface && rect) {
*rect = surface->clip_rect;
}
}
SDL_Surface::clip_rect
SDL_Rect clip_rect
Definition: SDL_surface.h:85

int SDL_GetColorKey | ( | SDL_Surface * | surface,
|  | Uint32 * | key
| ) |  |

Gets the color key (transparent pixel) in a blittable surface.

Parameters

  surface | The surface to update
  key | A pointer filled in with the transparent pixel in the native surface format

Returns
  0 on success, or -1 if the surface is not valid or colorkey is not enabled.

Definition at line 235 of file SDL_surface.c.

References SDL_BlitInfo::colorkey, SDL_BlitInfo::flags, SDL_BlitMap::info, SDL_Surface::map, and SDL_COPY_COLORKEY.

{
if (!surface) {
return -1;
}
if (!(surface->map->info.flags & SDL_COPY_COLORKEY)) {
return -1;
}
if (key) {
*key = surface->map->info.colorkey;
}
return 0;
}
SDL_COPY_COLORKEY
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_BlitInfo::colorkey
Uint32 colorkey
Definition: SDL_blit.h:69
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91

int SDL_GetSurfaceAlphaMod | ( | SDL_Surface * | surface,
|  | Uint8 * | alpha
| ) |  |

Get the additional alpha value used in blit operations.

Parameters

  surface | The surface to query.
  alpha | A pointer filled in with the current alpha value.

Returns
  0 on success, or -1 if the surface is not valid.

See also
  SDL_SetSurfaceAlphaMod()

Definition at line 391 of file SDL_surface.c.

References SDL_BlitInfo::a, SDL_BlitMap::info, and SDL_Surface::map.

{
if (!surface) {
return -1;
}
if (alpha) {
*alpha = surface->map->info.a;
}
return 0;
}
alpha
GLfloat GLfloat GLfloat alpha
Definition: SDL_opengl_glext.h:412
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_BlitInfo::a
Uint8 a
Definition: SDL_blit.h:70

int SDL_GetSurfaceBlendMode | ( | SDL_Surface * | surface,
|  | SDL_BlendMode * | blendMode
| ) |  |

Get the blend mode used for blit operations.

Parameters

  surface | The surface to query.
  blendMode | A pointer filled in with the current blend mode.

Returns
  0 on success, or -1 if the surface is not valid.

See also
  SDL_SetSurfaceBlendMode()

Definition at line 441 of file SDL_surface.c.

References SDL_Surface::map, SDL_BLENDMODE_ADD, SDL_BLENDMODE_BLEND, SDL_BLENDMODE_MOD, SDL_BLENDMODE_NONE, SDL_COPY_ADD, SDL_COPY_BLEND, and SDL_COPY_MOD.

{
if (!surface) {
return -1;
}
if (!blendMode) {
return 0;
}
switch (surface->map->
info.flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) {
case SDL_COPY_BLEND:
*blendMode = SDL_BLENDMODE_BLEND;
break;
case SDL_COPY_ADD:
*blendMode = SDL_BLENDMODE_ADD;
break;
case SDL_COPY_MOD:
*blendMode = SDL_BLENDMODE_MOD;
break;
default:
*blendMode = SDL_BLENDMODE_NONE;
break;
}
return 0;
}
SDL_BLENDMODE_NONE
Definition: SDL_blendmode.h:42
SDL_COPY_MOD
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
SDL_COPY_ADD
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
SDL_BLENDMODE_MOD
Definition: SDL_blendmode.h:50
blendMode
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_BLENDMODE_ADD
Definition: SDL_blendmode.h:47
SDL_COPY_BLEND
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44

int SDL_GetSurfaceColorMod | ( | SDL_Surface * | surface,
|  | Uint8 * | r,
|  | Uint8 * | g,
|  | Uint8 * | b
| ) |  |

Get the additional color value used in blit operations.

Parameters

  surface | The surface to query.
  r | A pointer filled in with the current red color value.
  g | A pointer filled in with the current green color value.
  b | A pointer filled in with the current blue color value.

Returns
  0 on success, or -1 if the surface is not valid.

See also
  SDL_SetSurfaceColorMod()

Definition at line 349 of file SDL_surface.c.

References SDL_BlitInfo::b, SDL_BlitInfo::g, SDL_BlitMap::info, SDL_Surface::map, and SDL_BlitInfo::r.

{
if (!surface) {
return -1;
}
if (r) {
*r = surface->map->info.r;
}
if (g) {
*g = surface->map->info.g;
}
if (b) {
*b = surface->map->info.b;
}
return 0;
}
SDL_BlitInfo::r
Uint8 r
Definition: SDL_blit.h:70
SDL_BlitInfo::b
Uint8 b
Definition: SDL_blit.h:70
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2072
SDL_BlitInfo::g
Uint8 g
Definition: SDL_blit.h:70
g
GLboolean GLboolean g
Definition: SDL_opengl_glext.h:1109
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
b
GLboolean GLboolean GLboolean b
Definition: SDL_opengl_glext.h:1109
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91

int SDL_LockSurface | ( | SDL_Surface * | surface | ) |

Sets up a surface for directly accessing the pixels.

Between calls to SDL_LockSurface() / SDL_UnlockSurface(), you can write to and read from `surface->pixels`, using the pixel format stored in `surface->format`. Once you are done accessing the surface, you should use SDL_UnlockSurface() to release it.

Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates to 0, then you can read and write to the surface at any time, and the pixel format of the surface will not change.

No operating system or library calls should be made between lock/unlock pairs, as critical system locks may be held during this time.

SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked.

See also
  SDL_UnlockSurface()

Definition at line 816 of file SDL_surface.c.

References SDL_Surface::flags, SDL_Surface::locked, SDL_RLEACCEL, and SDL_UnRLESurface().

Referenced by SDL_ConvertColorkeyToAlpha().

{
if (!surface->locked) {
/* Perform the lock */
if (surface->flags & SDL_RLEACCEL) {
SDL_UnRLESurface(surface, 1);
surface->flags |= SDL_RLEACCEL; /* save accel'd state */
}
}
/* Increment the surface lock count, for recursive locks */
++surface->locked;
/* Ready to go.. */
return (0);
}
SDL_UnRLESurface
void SDL_UnRLESurface(SDL_Surface *surface, int recode)
Definition: SDL_RLEaccel.c:1540
SDL_Surface::flags
Uint32 flags
Definition: SDL_surface.h:71
SDL_Surface::locked
int locked
Definition: SDL_surface.h:81
SDL_RLEACCEL
#define SDL_RLEACCEL
Definition: SDL_surface.h:54

int SDL_LowerBlit | ( | SDL_Surface * | src,
|  | SDL_Rect * | srcrect,
|  | SDL_Surface * | dst,
|  | SDL_Rect * | dstrect
| ) |  |

This is a semi-private blit function and it performs low-level surface blitting only.

Definition at line 513 of file SDL_surface.c.

References SDL_BlitMap::blit, SDL_BlitMap::dst, SDL_BlitMap::dst_palette_version, SDL_Surface::format, SDL_Surface::map, SDL_PixelFormat::palette, SDL_MapSurface(), SDL_BlitMap::src_palette_version, and SDL_Palette::version.

Referenced by SDL_ConvertPixels(), SDL_ConvertSurface(), SDL_LowerBlitScaled(), and SDL_UpperBlit().

{
/* Check to make sure the blit mapping is valid */
if ((src->map->dst != dst) ||
(dst->format->palette &&
src->map->dst_palette_version != dst->format->palette->version) ||
(src->format->palette &&
src->map->src_palette_version != src->format->palette->version)) {
if (SDL_MapSurface(src, dst) < 0) {
return (-1);
}
/* just here for debugging */
/* printf */
/* ("src = 0x%08X src->flags = %08X src->map->info.flags = %08x\ndst = 0x%08X dst->flags = %08X dst->map->info.flags = %08X\nsrc->map->blit = 0x%08x\n", */
/* src, dst->flags, src->map->info.flags, dst, dst->flags, */
/* dst->map->info.flags, src->map->blit); */
}
return (src->map->blit(src, srcrect, dst, dstrect));
}
SDL_Palette::version
Uint32 version
Definition: SDL_pixels.h:292
SDL_BlitMap::blit
SDL_blit blit
Definition: SDL_blit.h:89
SDL_BlitMap::dst_palette_version
Uint32 dst_palette_version
Definition: SDL_blit.h:95
SDL_BlitMap::src_palette_version
Uint32 src_palette_version
Definition: SDL_blit.h:96
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_MapSurface
int SDL_MapSurface(SDL_Surface *src, SDL_Surface *dst)
Definition: SDL_pixels.c:993
SDL_BlitMap::dst
SDL_Surface * dst
Definition: SDL_blit.h:87
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_PixelFormat::palette
SDL_Palette * palette
Definition: SDL_pixels.h:302

int SDL_LowerBlitScaled | ( | SDL_Surface * | src,
|  | SDL_Rect * | srcrect,
|  | SDL_Surface * | dst,
|  | SDL_Rect * | dstrect
| ) |  |

This is a semi-private blit function and it performs low-level surface scaled blitting only.

Definition at line 789 of file SDL_surface.c.

References SDL_BlitInfo::flags, SDL_Surface::format, SDL_PixelFormat::format, SDL_BlitMap::info, SDL_Surface::map, SDL_COPY_ADD, SDL_COPY_BLEND, SDL_COPY_COLORKEY, SDL_COPY_MOD, SDL_COPY_MODULATE_ALPHA, SDL_COPY_MODULATE_COLOR, SDL_COPY_NEAREST, SDL_InvalidateMap(), SDL_ISPIXELFORMAT_INDEXED, SDL_LowerBlit(), and SDL_SoftStretch.

Referenced by SDL_UpperBlitScaled().

{
static const Uint32 complex_copy_flags = (
SDL_COPY_MODULATE_COLOR | SDL_COPY_MODULATE_ALPHA |
SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD |
SDL_COPY_COLORKEY
);
if (!(src->map->info.flags & SDL_COPY_NEAREST)) {
src->map->info.flags |= SDL_COPY_NEAREST;
SDL_InvalidateMap(src->map);
}
if ( !(src->map->info.flags & complex_copy_flags) &&
src->format->format == dst->format->format &&
!SDL_ISPIXELFORMAT_INDEXED(src->format->format) ) {
return SDL_SoftStretch( src, srcrect, dst, dstrect );
} else {
return SDL_LowerBlit( src, srcrect, dst, dstrect );
}
}
SDL_COPY_MODULATE_COLOR
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
SDL_COPY_COLORKEY
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
Uint32
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
SDL_SoftStretch
#define SDL_SoftStretch
Definition: SDL_dynapi_overrides.h:474
SDL_ISPIXELFORMAT_INDEXED
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:133
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_COPY_MOD
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
SDL_LowerBlit
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
SDL_COPY_ADD
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
SDL_COPY_NEAREST
#define SDL_COPY_NEAREST
Definition: SDL_blit.h:40
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_COPY_MODULATE_ALPHA
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
SDL_PixelFormat::format
Uint32 format
Definition: SDL_pixels.h:301
SDL_COPY_BLEND
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91

SDL_bool SDL_SetClipRect | ( | SDL_Surface * | surface,
|  | const SDL_Rect * | rect
| ) |  |

Sets the clipping rectangle for the destination surface in a blit.

If the clip rectangle is NULL, clipping will be disabled.

If the clip rectangle doesn't intersect the surface, the function will return SDL_FALSE and blits will be completely clipped. Otherwise the function returns SDL_TRUE and blits to the surface will be clipped to the intersection of the surface area and the clipping rectangle.

Note that blits are automatically clipped to the edges of the source and destination surfaces.

Definition at line 470 of file SDL_surface.c.

References SDL_Surface::clip_rect, SDL_Rect::h, SDL_Surface::h, SDL_FALSE, SDL_IntersectRect, SDL_TRUE, SDL_Rect::w, SDL_Surface::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SDL_ConvertSurface(), SDL_CreateRGBSurface(), and SDL_CreateRGBSurfaceFrom().

{
SDL_Rect full_rect;
/* Don't do anything if there's no surface to act on */
if (!surface) {
return SDL_FALSE;
}
/* Set up the full surface rectangle */
full_rect.x = 0;
full_rect.y = 0;
full_rect.w = surface->w;
full_rect.h = surface->h;
/* Set the clipping rectangle */
if (!rect) {
surface->clip_rect = full_rect;
return SDL_TRUE;
}
return SDL_IntersectRect(rect, &full_rect, &surface->clip_rect);
}
SDL_Surface::h
int h
Definition: SDL_surface.h:73
SDL_Surface::w
int w
Definition: SDL_surface.h:73
SDL_IntersectRect
#define SDL_IntersectRect
Definition: SDL_dynapi_overrides.h:300
SDL_Rect::x
int x
Definition: SDL_rect.h:66
SDL_TRUE
Definition: SDL_stdinc.h:129
SDL_Rect::w
int w
Definition: SDL_rect.h:67
SDL_Surface::clip_rect
SDL_Rect clip_rect
Definition: SDL_surface.h:85
SDL_Rect::h
int h
Definition: SDL_rect.h:67
SDL_FALSE
Definition: SDL_stdinc.h:128
SDL_Rect::y
int y
Definition: SDL_rect.h:66
SDL_Rect
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

int SDL_SetColorKey | ( | SDL_Surface * | surface,
|  | int | flag,
|  | Uint32 | key
| ) |  |

Sets the color key (transparent pixel) in a blittable surface.

Parameters

  surface | The surface to update
  flag | Non-zero to enable colorkey and 0 to disable colorkey
  key | The transparent pixel in the native surface format

Returns
  0 on success, or -1 if the surface is not valid

You can pass SDL_RLEACCEL to enable RLE accelerated blits.

Definition at line 190 of file SDL_surface.c.

References SDL_Color::a, SDL_BlitInfo::colorkey, SDL_Palette::colors, SDL_BlitInfo::flags, SDL_Surface::format, SDL_BlitMap::info, SDL_Surface::map, SDL_Palette::ncolors, SDL_PixelFormat::palette, SDL_ALPHA_OPAQUE, SDL_ALPHA_TRANSPARENT, SDL_COPY_COLORKEY, SDL_InvalidateMap(), SDL_InvalidParamError, SDL_RLEACCEL, SDL_SetSurfaceRLE(), and SDL_Palette::version.

Referenced by SDL_ConvertColorkeyToAlpha(), and SDL_ConvertSurface().

{
int flags;
if (!surface) {
return SDL_InvalidParamError("surface");
}
if (surface->format->palette && key >= ((Uint32) surface->format->palette->ncolors)) {
return SDL_InvalidParamError("key");
}
if (flag & SDL_RLEACCEL) {
SDL_SetSurfaceRLE(surface, 1);
}
flags = surface->map->info.flags;
if (flag) {
surface->map->info.flags |= SDL_COPY_COLORKEY;
surface->map->info.colorkey = key;
if (surface->format->palette) {
surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_TRANSPARENT;
++surface->format->palette->version;
if (!surface->format->palette->version) {
surface->format->palette->version = 1;
}
}
} else {
if (surface->format->palette) {
surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_OPAQUE;
++surface->format->palette->version;
if (!surface->format->palette->version) {
surface->format->palette->version = 1;
}
}
surface->map->info.flags &= ~SDL_COPY_COLORKEY;
}
if (surface->map->info.flags != flags) {
SDL_InvalidateMap(surface->map);
}
return 0;
}
SDL_Palette::version
Uint32 version
Definition: SDL_pixels.h:292
SDL_COPY_COLORKEY
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
SDL_SetSurfaceRLE
int SDL_SetSurfaceRLE(SDL_Surface *surface, int flag)
Sets the RLE acceleration hint for a surface.
Definition: SDL_surface.c:169
Uint32
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_InvalidParamError
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
SDL_BlitInfo::colorkey
Uint32 colorkey
Definition: SDL_blit.h:69
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
SDL_ALPHA_TRANSPARENT
#define SDL_ALPHA_TRANSPARENT
Definition: SDL_pixels.h:46
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_Color::a
Uint8 a
Definition: SDL_pixels.h:284
SDL_Palette::ncolors
int ncolors
Definition: SDL_pixels.h:290
SDL_Palette::colors
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
SDL_PixelFormat::palette
SDL_Palette * palette
Definition: SDL_pixels.h:302
SDL_ALPHA_OPAQUE
#define SDL_ALPHA_OPAQUE
Definition: SDL_pixels.h:45
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_RLEACCEL
#define SDL_RLEACCEL
Definition: SDL_surface.h:54

int SDL_SetSurfaceAlphaMod | ( | SDL_Surface * | surface,
|  | Uint8 | alpha
| ) |  |

Set an additional alpha value used in blit operations.

Parameters

  surface | The surface to update.
  alpha | The alpha value multiplied into blit operations.

Returns
  0 on success, or -1 if the surface is not valid.

See also
  SDL_GetSurfaceAlphaMod()

Definition at line 368 of file SDL_surface.c.

References SDL_BlitInfo::a, SDL_BlitInfo::flags, SDL_BlitMap::info, SDL_Surface::map, SDL_COPY_MODULATE_ALPHA, and SDL_InvalidateMap().

{
int flags;
if (!surface) {
return -1;
}
surface->map->info.a = alpha;
flags = surface->map->info.flags;
if (alpha != 0xFF) {
surface->map->info.flags |= SDL_COPY_MODULATE_ALPHA;
} else {
surface->map->info.flags &= ~SDL_COPY_MODULATE_ALPHA;
}
if (surface->map->info.flags != flags) {
SDL_InvalidateMap(surface->map);
}
return 0;
}
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
alpha
GLfloat GLfloat GLfloat alpha
Definition: SDL_opengl_glext.h:412
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_COPY_MODULATE_ALPHA
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_BlitInfo::a
Uint8 a
Definition: SDL_blit.h:70

int SDL_SetSurfaceBlendMode | ( | SDL_Surface * | surface,
|  | SDL_BlendMode | blendMode
| ) |  |

Set the blend mode used for blit operations.

Parameters

  surface | The surface to update.
  blendMode | SDL_BlendMode to use for blit blending.

Returns
  0 on success, or -1 if the parameters are not valid.

See also
  SDL_GetSurfaceBlendMode()

Definition at line 404 of file SDL_surface.c.

References SDL_BlitInfo::flags, SDL_BlitMap::info, SDL_Surface::map, SDL_BLENDMODE_ADD, SDL_BLENDMODE_BLEND, SDL_BLENDMODE_MOD, SDL_BLENDMODE_NONE, SDL_COPY_ADD, SDL_COPY_BLEND, SDL_COPY_MOD, SDL_InvalidateMap(), and SDL_Unsupported.

Referenced by SDL_ConvertColorkeyToAlpha(), SDL_ConvertSurface(), and SDL_CreateRGBSurface().

{
int flags, status;
if (!surface) {
return -1;
}
status = 0;
flags = surface->map->info.flags;
surface->map->info.flags &=
~(SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD);
switch (blendMode) {
case SDL_BLENDMODE_NONE:
break;
case SDL_BLENDMODE_BLEND:
surface->map->info.flags |= SDL_COPY_BLEND;
break;
case SDL_BLENDMODE_ADD:
surface->map->info.flags |= SDL_COPY_ADD;
break;
case SDL_BLENDMODE_MOD:
surface->map->info.flags |= SDL_COPY_MOD;
break;
default:
status = SDL_Unsupported();
break;
}
if (surface->map->info.flags != flags) {
SDL_InvalidateMap(surface->map);
}
return status;
}
SDL_BLENDMODE_NONE
Definition: SDL_blendmode.h:42
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_COPY_MOD
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
SDL_COPY_ADD
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
SDL_BLENDMODE_MOD
Definition: SDL_blendmode.h:50
blendMode
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_BLENDMODE_ADD
Definition: SDL_blendmode.h:47
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
SDL_Unsupported
#define SDL_Unsupported()
Definition: SDL_error.h:53
SDL_COPY_BLEND
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44

int SDL_SetSurfaceColorMod | ( | SDL_Surface * | surface,
|  | Uint8 | r,
|  | Uint8 | g,
|  | Uint8 | b
| ) |  |

Set an additional color value used in blit operations.

Parameters

  surface | The surface to update.
  r | The red color value multiplied into blit operations.
  g | The green color value multiplied into blit operations.
  b | The blue color value multiplied into blit operations.

Returns
  0 on success, or -1 if the surface is not valid.

See also
  SDL_GetSurfaceColorMod()

Definition at line 323 of file SDL_surface.c.

References SDL_BlitInfo::b, SDL_BlitInfo::flags, SDL_BlitInfo::g, SDL_BlitMap::info, SDL_Surface::map, SDL_BlitInfo::r, SDL_COPY_MODULATE_COLOR, and SDL_InvalidateMap().

{
int flags;
if (!surface) {
return -1;
}
surface->map->info.r = r;
surface->map->info.g = g;
surface->map->info.b = b;
flags = surface->map->info.flags;
if (r != 0xFF || g != 0xFF || b != 0xFF) {
surface->map->info.flags |= SDL_COPY_MODULATE_COLOR;
} else {
surface->map->info.flags &= ~SDL_COPY_MODULATE_COLOR;
}
if (surface->map->info.flags != flags) {
SDL_InvalidateMap(surface->map);
}
return 0;
}
SDL_BlitInfo::r
Uint8 r
Definition: SDL_blit.h:70
SDL_COPY_MODULATE_COLOR
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
SDL_BlitInfo::b
Uint8 b
Definition: SDL_blit.h:70
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2072
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_BlitInfo::g
Uint8 g
Definition: SDL_blit.h:70
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
g
GLboolean GLboolean g
Definition: SDL_opengl_glext.h:1109
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
b
GLboolean GLboolean GLboolean b
Definition: SDL_opengl_glext.h:1109
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91

int SDL_SetSurfacePalette | ( | SDL_Surface * | surface,
|  | SDL_Palette * | palette
| ) |  |

Set the palette used by a surface.

Returns
  0, or -1 if the surface format doesn't use a palette.

Note
  A single palette can be shared with many surfaces.

Definition at line 155 of file SDL_surface.c.

References SDL_Surface::format, SDL_Surface::map, SDL_InvalidateMap(), SDL_SetError, and SDL_SetPixelFormatPalette.

Referenced by SDL_CreateRGBSurface(), and SDL_FreeSurface().

{
if (!surface) {
return SDL_SetError("SDL_SetSurfacePalette() passed a NULL surface");
}
if (SDL_SetPixelFormatPalette(surface->format, palette) < 0) {
return -1;
}
SDL_InvalidateMap(surface->map);
return 0;
}
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_Surface::format
SDL_PixelFormat * format
Definition: SDL_surface.h:72
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
SDL_SetPixelFormatPalette
#define SDL_SetPixelFormatPalette
Definition: SDL_dynapi_overrides.h:289

int SDL_SetSurfaceRLE | ( | SDL_Surface * | surface,
|  | int | flag
| ) |  |

Sets the RLE acceleration hint for a surface.

Returns
  0 on success, or -1 if the surface is not valid

Note
  If RLE is enabled, colorkey and alpha blending blits are much faster, but the surface must be locked before directly accessing the pixels.

Definition at line 169 of file SDL_surface.c.

References SDL_BlitInfo::flags, SDL_BlitMap::info, SDL_Surface::map, SDL_COPY_RLE_DESIRED, and SDL_InvalidateMap().

Referenced by SDL_ConvertSurface(), and SDL_SetColorKey().

{
int flags;
if (!surface) {
return -1;
}
flags = surface->map->info.flags;
if (flag) {
surface->map->info.flags |= SDL_COPY_RLE_DESIRED;
} else {
surface->map->info.flags &= ~SDL_COPY_RLE_DESIRED;
}
if (surface->map->info.flags != flags) {
SDL_InvalidateMap(surface->map);
}
return 0;
}
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
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:974
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
flags
GLbitfield flags
Definition: SDL_opengl_glext.h:1480
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91

void SDL_UnlockSurface | ( | SDL_Surface * | surface | ) |

See also
  SDL_LockSurface()

Definition at line 837 of file SDL_surface.c.

References SDL_Surface::flags, SDL_Surface::locked, SDL_RLEACCEL, and SDL_RLESurface().

Referenced by SDL_ConvertColorkeyToAlpha(), and SDL_FreeSurface().

{
/* Only perform an unlock if we are locked */
if (!surface->locked || (--surface->locked > 0)) {
return;
}
/* Update RLE encoded surface with new data */
if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {
surface->flags &= ~SDL_RLEACCEL; /* stop lying */
SDL_RLESurface(surface);
}
}
SDL_Surface::flags
Uint32 flags
Definition: SDL_surface.h:71
SDL_Surface::locked
int locked
Definition: SDL_surface.h:81
SDL_RLESurface
int SDL_RLESurface(SDL_Surface *surface)
Definition: SDL_RLEaccel.c:1403
SDL_RLEACCEL
#define SDL_RLEACCEL
Definition: SDL_surface.h:54

int SDL_UpperBlit | ( | SDL_Surface * | src,
|  | const SDL_Rect * | srcrect,
|  | SDL_Surface * | dst,
|  | SDL_Rect * | dstrect
| ) |  |

This is the public blit function, SDL_BlitSurface(), and it performs rectangle validation and clipping before passing it to SDL_LowerBlit()

Definition at line 536 of file SDL_surface.c.

References SDL_Surface::clip_rect, SDL_BlitInfo::flags, SDL_Rect::h, SDL_Surface::h, SDL_BlitMap::info, SDL_Surface::locked, SDL_Surface::map, NULL, SDL_COPY_NEAREST, SDL_InvalidateMap(), SDL_LowerBlit(), SDL_SetError, SDL_Rect::w, SDL_Surface::w, SDL_Rect::x, and SDL_Rect::y.

{
SDL_Rect fulldst;
int srcx, srcy, w, h;
/* Make sure the surfaces aren't locked */
if (!src || !dst) {
return SDL_SetError("SDL_UpperBlit: passed a NULL surface");
}
if (src->locked || dst->locked) {
return SDL_SetError("Surfaces must not be locked during blit");
}
/* If the destination rectangle is NULL, use the entire dest surface */
if (dstrect == NULL) {
fulldst.x = fulldst.y = 0;
fulldst.w = dst->w;
fulldst.h = dst->h;
dstrect = &fulldst;
}
/* clip the source rectangle to the source surface */
if (srcrect) {
int maxw, maxh;
srcx = srcrect->x;
w = srcrect->w;
if (srcx < 0) {
w += srcx;
dstrect->x -= srcx;
srcx = 0;
}
maxw = src->w - srcx;
if (maxw < w)
w = maxw;
srcy = srcrect->y;
h = srcrect->h;
if (srcy < 0) {
h += srcy;
dstrect->y -= srcy;
srcy = 0;
}
maxh = src->h - srcy;
if (maxh < h)
h = maxh;
} else {
srcx = srcy = 0;
w = src->w;
h = src->h;
}
/* clip the destination rectangle against the clip rectangle */
{
SDL_Rect *clip = &dst->clip_rect;
int dx, dy;
dx = clip->x - dstrect->x;
if (dx > 0) {
w -= dx;
dstrect->x += dx;
srcx += dx;
}
dx = dstrect->x + w - clip->x - clip->w;
if (dx > 0)
w -= dx;
dy = clip->y - dstrect->y;
if (dy > 0) {
h -= dy;
dstrect->y += dy;
srcy += dy;
}
dy = dstrect->y + h - clip->y - clip->h;
if (dy > 0)
h -= dy;
}
/* Switch back to a fast blit if we were previously stretching */
if (src->map->info.flags & SDL_COPY_NEAREST) {
src->map->info.flags &= ~SDL_COPY_NEAREST;
SDL_InvalidateMap(src->map);
}
if (w > 0 && h > 0) {
SDL_Rect sr;
sr.x = srcx;
sr.y = srcy;
sr.w = dstrect->w = w;
sr.h = dstrect->h = h;
return SDL_LowerBlit(src, &sr, dst, dstrect);
}
dstrect->w = dstrect->h = 0;
return 0;
}
SDL_Surface::h
int h
Definition: SDL_surface.h:73
SDL_BlitInfo::flags
int flags
Definition: SDL_blit.h:68
SDL_Surface::w
int w
Definition: SDL_surface.h:73
SDL_LowerBlit
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
SDL_InvalidateMap
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
SDL_COPY_NEAREST
#define SDL_COPY_NEAREST
Definition: SDL_blit.h:40
SDL_Surface::map
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_Surface::locked
int locked
Definition: SDL_surface.h:81
SDL_Rect::x
int x
Definition: SDL_rect.h:66
SDL_Rect::w
int w
Definition: SDL_rect.h:67
SDL_Surface::clip_rect
SDL_Rect clip_rect
Definition: SDL_surface.h:85
NULL
#define NULL
Definition: begin_code.h:143
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
SDL_Rect::h
int h
Definition: SDL_rect.h:67
w
GLubyte GLubyte GLubyte GLubyte w
Definition: SDL_opengl_glext.h:731
SDL_Rect::y
int y
Definition: SDL_rect.h:66
h
GLfloat GLfloat GLfloat GLfloat h
Definition: SDL_opengl_glext.h:1946
SDL_BlitMap::info
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_Rect
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

int SDL_UpperBlitScaled | ( | SDL_Surface * | src,
|  | const SDL_Rect * | srcrect,
|  | SDL_Surface * | dst,
|  | SDL_Rect * | dstrect
| ) |  |

This is the public scaled blit function, SDL_BlitScaled(), and it performs rectangle validation and clipping before passing it to SDL_LowerBlitScaled()

Definition at line 635 of file SDL_surface.c.

References SDL_Surface::clip_rect, SDL_Rect::h, SDL_Surface::h, SDL_Surface::locked, NULL, SDL_BlitSurface, SDL_floor, SDL_LowerBlitScaled(), SDL_SetError, SDL_Rect::w, SDL_Surface::w, SDL_Rect::x, and SDL_Rect::y.

{
double src_x0, src_y0, src_x1, src_y1;
double dst_x0, dst_y0, dst_x1, dst_y1;
SDL_Rect final_src, final_dst;
double scaling_w, scaling_h;
int src_w, src_h;
int dst_w, dst_h;
/* Make sure the surfaces aren't locked */
if (!src || !dst) {
return SDL_SetError("SDL_UpperBlitScaled: passed a NULL surface");
}
if (src->locked || dst->locked) {
return SDL_SetError("Surfaces must not be locked during blit");
}
if (NULL == srcrect) {
src_w = src->w;
src_h = src->h;
} else {
src_w = srcrect->w;
src_h = srcrect->h;
}
if (NULL == dstrect) {
dst_w = dst->w;
dst_h = dst->h;
} else {
dst_w = dstrect->w;
dst_h = dstrect->h;
}
if (dst_w == src_w && dst_h == src_h) {
/* No scaling, defer to regular blit */
return SDL_BlitSurface(src, srcrect, dst, dstrect);
}
scaling_w = (double)dst_w / src_w;
scaling_h = (double)dst_h / src_h;
if (NULL == dstrect) {
dst_x0 = 0;
dst_y0 = 0;
dst_x1 = dst_w - 1;
dst_y1 = dst_h - 1;
} else {
dst_x0 = dstrect->x;
dst_y0 = dstrect->y;
dst_x1 = dst_x0 + dst_w - 1;
dst_y1 = dst_y0 + dst_h - 1;
}
if (NULL == srcrect) {
src_x0 = 0;
src_y0 = 0;
src_x1 = src_w - 1;
src_y1 = src_h - 1;
} else {
src_x0 = srcrect->x;
src_y0 = srcrect->y;
src_x1 = src_x0 + src_w - 1;
src_y1 = src_y0 + src_h - 1;
/* Clip source rectangle to the source surface */
if (src_x0 < 0) {
dst_x0 -= src_x0 * scaling_w;
src_x0 = 0;
}
if (src_x1 >= src->w) {
dst_x1 -= (src_x1 - src->w + 1) * scaling_w;
src_x1 = src->w - 1;
}
if (src_y0 < 0) {
dst_y0 -= src_y0 * scaling_h;
src_y0 = 0;
}
if (src_y1 >= src->h) {
dst_y1 -= (src_y1 - src->h + 1) * scaling_h;
src_y1 = src->h - 1;
}
}
/* Clip destination rectangle to the clip rectangle */
/* Translate to clip space for easier calculations */
dst_x0 -= dst->clip_rect.x;
dst_x1 -= dst->clip_rect.x;
dst_y0 -= dst->clip_rect.y;
dst_y1 -= dst->clip_rect.y;
if (dst_x0 < 0) {
src_x0 -= dst_x0 / scaling_w;
dst_x0 = 0;
}
if (dst_x1 >= dst->clip_rect.w) {
src_x1 -= (dst_x1 - dst->clip_rect.w + 1) / scaling_w;
dst_x1 = dst->clip_rect.w - 1;
}
if (dst_y0 < 0) {
src_y0 -= dst_y0 / scaling_h;
dst_y0 = 0;
}
if (dst_y1 >= dst->clip_rect.h) {
src_y1 -= (dst_y1 - dst->clip_rect.h + 1) / scaling_h;
dst_y1 = dst->clip_rect.h - 1;
}
/* Translate back to surface coordinates */
dst_x0 += dst->clip_rect.x;
dst_x1 += dst->clip_rect.x;
dst_y0 += dst->clip_rect.y;
dst_y1 += dst->clip_rect.y;
final_src.x = (int)SDL_floor(src_x0 + 0.5);
final_src.y = (int)SDL_floor(src_y0 + 0.5);
final_src.w = (int)SDL_floor(src_x1 - src_x0 + 1.5);
final_src.h = (int)SDL_floor(src_y1 - src_y0 + 1.5);
final_dst.x = (int)SDL_floor(dst_x0 + 0.5);
final_dst.y = (int)SDL_floor(dst_y0 + 0.5);
final_dst.w = (int)SDL_floor(dst_x1 - dst_x0 + 1.5);
final_dst.h = (int)SDL_floor(dst_y1 - dst_y0 + 1.5);
if (final_dst.w < 0)
final_dst.w = 0;
if (final_dst.h < 0)
final_dst.h = 0;
if (dstrect)
*dstrect = final_dst;
if (final_dst.w == 0 || final_dst.h == 0 ||
final_src.w <= 0 || final_src.h <= 0) {
/* No-op. */
return 0;
}
return SDL_LowerBlitScaled(src, &final_src, dst, &final_dst);
}
SDL_Surface::h
int h
Definition: SDL_surface.h:73
SDL_BlitSurface
#define SDL_BlitSurface
Definition: SDL_surface.h:447
SDL_Surface::w
int w
Definition: SDL_surface.h:73
SDL_floor
#define SDL_floor
Definition: SDL_dynapi_overrides.h:437
SDL_Surface::locked
int locked
Definition: SDL_surface.h:81
SDL_Rect::x
int x
Definition: SDL_rect.h:66
SDL_Rect::w
int w
Definition: SDL_rect.h:67
SDL_Surface::clip_rect
SDL_Rect clip_rect
Definition: SDL_surface.h:85
NULL
#define NULL
Definition: begin_code.h:143
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
SDL_Rect::h
int h
Definition: SDL_rect.h:67
SDL_LowerBlitScaled
int SDL_LowerBlitScaled(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:789
SDL_Rect::y
int y
Definition: SDL_rect.h:66
SDL_Rect
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64