SDL  2.0
SDL_surface.h File Reference
#include "SDL_stdinc.h"
#include "SDL_pixels.h"
#include "SDL_rect.h"
#include "SDL_blendmode.h"
#include "SDL_rwops.h"
#include "begin_code.h"
#include "close_code.h"
+ Include dependency graph for SDL_surface.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  SDL_Surface
 A collection of pixels used in software blitting. More...
 

Macros

#define SDL_MUSTLOCK(S)   (((S)->flags & SDL_RLEACCEL) != 0)
 
#define SDL_LoadBMP(file)   SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)
 
#define SDL_SaveBMP(surface, file)   SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1)
 
#define SDL_BlitSurface   SDL_UpperBlit
 
#define SDL_BlitScaled   SDL_UpperBlitScaled
 
Surface flags

These are the currently supported flags for the SDL_Surface.

Used internally (read-only).

#define SDL_SWSURFACE   0
 
#define SDL_PREALLOC   0x00000001
 
#define SDL_RLEACCEL   0x00000002
 
#define SDL_DONTFREE   0x00000004
 

Typedefs

typedef int(* SDL_blit) (struct SDL_Surface *src, SDL_Rect *srcrect, struct SDL_Surface *dst, SDL_Rect *dstrect)
 The type of function used for surface blitting functions. More...
 

Functions

SDL_SurfaceSDL_CreateRGBSurface (Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
 
SDL_SurfaceSDL_CreateRGBSurfaceFrom (void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
 
void SDL_FreeSurface (SDL_Surface *surface)
 
int SDL_SetSurfacePalette (SDL_Surface *surface, SDL_Palette *palette)
 Set the palette used by a surface. More...
 
int SDL_LockSurface (SDL_Surface *surface)
 Sets up a surface for directly accessing the pixels. More...
 
void SDL_UnlockSurface (SDL_Surface *surface)
 
SDL_SurfaceSDL_LoadBMP_RW (SDL_RWops *src, int freesrc)
 
int SDL_SaveBMP_RW (SDL_Surface *surface, SDL_RWops *dst, int freedst)
 
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...
 
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)
 
SDL_SurfaceSDL_ConvertSurface (SDL_Surface *src, const SDL_PixelFormat *fmt, Uint32 flags)
 
SDL_SurfaceSDL_ConvertSurfaceFormat (SDL_Surface *src, Uint32 pixel_format, Uint32 flags)
 
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...
 
int SDL_FillRect (SDL_Surface *dst, const SDL_Rect *rect, Uint32 color)
 
int SDL_FillRects (SDL_Surface *dst, const SDL_Rect *rects, int count, Uint32 color)
 
int SDL_UpperBlit (SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
 
int SDL_LowerBlit (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
 
int SDL_SoftStretch (SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surface *dst, const SDL_Rect *dstrect)
 Perform a fast, low quality, stretch blit between two surfaces of the same pixel format. More...
 
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)
 

Detailed Description

Header file for SDL_Surface definition and management functions.

Definition in file SDL_surface.h.

Macro Definition Documentation

#define SDL_BlitScaled   SDL_UpperBlitScaled

Definition at line 476 of file SDL_surface.h.

Referenced by SW_RenderCopy(), and SW_RenderCopyEx().

#define SDL_BlitSurface   SDL_UpperBlit

Performs a fast blit from the source surface to the destination surface.

This assumes that the source and destination rectangles are the same size. If either srcrect or dstrect are NULL, the entire surface (src or dst) is copied. The final blit rectangles are saved in srcrect and dstrect after all clipping is performed.

Returns
If the blit is successful, it returns 0, otherwise it returns -1.

The blit function should not be called on a locked surface.

The blit semantics for surfaces with and without blending and colorkey are defined as follows:

RGBA->RGB:
  Source surface blend mode set to SDL_BLENDMODE_BLEND:
    alpha-blend (using the source alpha-channel and per-surface alpha)
    SDL_SRCCOLORKEY ignored.
  Source surface blend mode set to SDL_BLENDMODE_NONE:
    copy RGB.
    if SDL_SRCCOLORKEY set, only copy the pixels matching the
    RGB values of the source color key, ignoring alpha in the
    comparison.

RGB->RGBA:
  Source surface blend mode set to SDL_BLENDMODE_BLEND:
    alpha-blend (using the source per-surface alpha)
  Source surface blend mode set to SDL_BLENDMODE_NONE:
    copy RGB, set destination alpha to source per-surface alpha value.
  both:
    if SDL_SRCCOLORKEY set, only copy the pixels matching the
    source color key.

RGBA->RGBA:
  Source surface blend mode set to SDL_BLENDMODE_BLEND:
    alpha-blend (using the source alpha-channel and per-surface alpha)
    SDL_SRCCOLORKEY ignored.
  Source surface blend mode set to SDL_BLENDMODE_NONE:
    copy all of RGBA to the destination.
    if SDL_SRCCOLORKEY set, only copy the pixels matching the
    RGB values of the source color key, ignoring alpha in the
    comparison.

RGB->RGB:
  Source surface blend mode set to SDL_BLENDMODE_BLEND:
    alpha-blend (using the source per-surface alpha)
  Source surface blend mode set to SDL_BLENDMODE_NONE:
    copy RGB.
  both:
    if SDL_SRCCOLORKEY set, only copy the pixels matching the
    source color key.

You should call SDL_BlitSurface() unless you know exactly how SDL blitting works internally and how to use the other blit functions.

Definition at line 447 of file SDL_surface.h.

Referenced by _testBlitBlendMode(), SDL_UpperBlitScaled(), SW_RenderCopy(), and SW_RenderCopyEx().

#define SDL_DONTFREE   0x00000004

Surface is referenced internally

Definition at line 55 of file SDL_surface.h.

Referenced by SDL_DestroyWindow(), SDL_FreeSurface(), SDL_GetWindowSurface(), and SDL_RecreateWindow().

#define SDL_LoadBMP (   file)    SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)

Load a surface from a file.

Convenience macro.

Definition at line 182 of file SDL_surface.h.

Referenced by LoadSprite(), LoadTexture(), main(), SDLTest_LoadIcon(), surface_testLoadFailure(), and surface_testSaveLoadBitmap().

#define SDL_MUSTLOCK (   S)    (((S)->flags & SDL_RLEACCEL) != 0)

Evaluates to true if the surface needs to be locked before access.

Definition at line 61 of file SDL_surface.h.

Referenced by SDL_CalculateShapeBitmap(), SDL_CalculateShapeTree(), SDL_CreateTextureFromSurface(), SDL_RLEAlphaBlit(), SDL_RLEBlit(), SDL_SoftBlit(), SDL_SoftStretch(), SDLgfx_rotateSurface(), and SW_UpdateTexture().

#define SDL_PREALLOC   0x00000001

Surface uses preallocated memory

Definition at line 53 of file SDL_surface.h.

Referenced by RLEAlphaSurface(), RLEColorkeySurface(), SDL_CreateRGBSurfaceFrom(), SDL_CreateSurfaceOnStack(), SDL_FreeSurface(), and SDL_UnRLESurface().

#define SDL_SaveBMP (   surface,
  file 
)    SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1)

Save a surface to a file.

Convenience macro.

Definition at line 199 of file SDL_surface.h.

Referenced by SDLTest_CompareSurfaces(), SDLTest_ScreenShot(), and surface_testSaveLoadBitmap().

#define SDL_SWSURFACE   0

Just here for compatibility

Definition at line 52 of file SDL_surface.h.

Referenced by _surfaceSetUp(), SDLgfx_rotateSurface(), SDLTest_DrawCharacter(), and SW_RenderCopyEx().

Typedef Documentation

typedef int(* SDL_blit) (struct SDL_Surface *src, SDL_Rect *srcrect, struct SDL_Surface *dst, SDL_Rect *dstrect)

The type of function used for surface blitting functions.

Definition at line 97 of file SDL_surface.h.

Function Documentation

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.

1038 {
1039  SDL_Surface src_surface, dst_surface;
1040  SDL_PixelFormat src_fmt, dst_fmt;
1041  SDL_BlitMap src_blitmap, dst_blitmap;
1042  SDL_Rect rect;
1043  void *nonconst_src = (void *) src;
1044 
1045  /* Check to make sure we are blitting somewhere, so we don't crash */
1046  if (!dst) {
1047  return SDL_InvalidParamError("dst");
1048  }
1049  if (!dst_pitch) {
1050  return SDL_InvalidParamError("dst_pitch");
1051  }
1052 
1053  /* Fast path for same format copy */
1054  if (src_format == dst_format) {
1055  int bpp, i;
1056 
1057  if (SDL_ISPIXELFORMAT_FOURCC(src_format)) {
1058  switch (src_format) {
1059  case SDL_PIXELFORMAT_YUY2:
1060  case SDL_PIXELFORMAT_UYVY:
1061  case SDL_PIXELFORMAT_YVYU:
1062  bpp = 2;
1063  break;
1064  case SDL_PIXELFORMAT_YV12:
1065  case SDL_PIXELFORMAT_IYUV:
1066  case SDL_PIXELFORMAT_NV12:
1067  case SDL_PIXELFORMAT_NV21:
1068  bpp = 1;
1069  break;
1070  default:
1071  return SDL_SetError("Unknown FOURCC pixel format");
1072  }
1073  } else {
1074  bpp = SDL_BYTESPERPIXEL(src_format);
1075  }
1076  width *= bpp;
1077 
1078  for (i = height; i--;) {
1079  SDL_memcpy(dst, src, width);
1080  src = (Uint8*)src + src_pitch;
1081  dst = (Uint8*)dst + dst_pitch;
1082  }
1083 
1084  if (src_format == SDL_PIXELFORMAT_YV12 || src_format == SDL_PIXELFORMAT_IYUV) {
1085  /* U and V planes are a quarter the size of the Y plane */
1086  width /= 2;
1087  height /= 2;
1088  src_pitch /= 2;
1089  dst_pitch /= 2;
1090  for (i = height * 2; i--;) {
1091  SDL_memcpy(dst, src, width);
1092  src = (Uint8*)src + src_pitch;
1093  dst = (Uint8*)dst + dst_pitch;
1094  }
1095  } else if (src_format == SDL_PIXELFORMAT_NV12 || src_format == SDL_PIXELFORMAT_NV21) {
1096  /* U/V plane is half the height of the Y plane */
1097  height /= 2;
1098  for (i = height; i--;) {
1099  SDL_memcpy(dst, src, width);
1100  src = (Uint8*)src + src_pitch;
1101  dst = (Uint8*)dst + dst_pitch;
1102  }
1103  }
1104  return 0;
1105  }
1106 
1107  if (!SDL_CreateSurfaceOnStack(width, height, src_format, nonconst_src,
1108  src_pitch,
1109  &src_surface, &src_fmt, &src_blitmap)) {
1110  return -1;
1111  }
1112  if (!SDL_CreateSurfaceOnStack(width, height, dst_format, dst, dst_pitch,
1113  &dst_surface, &dst_fmt, &dst_blitmap)) {
1114  return -1;
1115  }
1116 
1117  /* Set up the rect and go! */
1118  rect.x = 0;
1119  rect.y = 0;
1120  rect.w = width;
1121  rect.h = height;
1122  return SDL_LowerBlit(&src_surface, &rect, &dst_surface, &rect);
1123 }
GLenum GLenum dst
GLint GLint GLsizei width
Definition: SDL_opengl.h:1565
SDL_Rect rect
Definition: testrelative.c:27
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
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:127
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1565
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
#define SDL_memcpy
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
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
#define SDL_SetError
int h
Definition: SDL_rect.h:67
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:166
GLenum src
int y
Definition: SDL_rect.h:66
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().

857 {
858  SDL_Surface *convert;
859  Uint32 copy_flags;
860  SDL_Color copy_color;
861  SDL_Rect bounds;
862 
863  /* Check for empty destination palette! (results in empty image) */
864  if (format->palette != NULL) {
865  int i;
866  for (i = 0; i < format->palette->ncolors; ++i) {
867  if ((format->palette->colors[i].r != 0xFF) ||
868  (format->palette->colors[i].g != 0xFF) ||
869  (format->palette->colors[i].b != 0xFF))
870  break;
871  }
872  if (i == format->palette->ncolors) {
873  SDL_SetError("Empty destination palette");
874  return (NULL);
875  }
876  }
877 
878  /* Create a new surface with the desired format */
879  convert = SDL_CreateRGBSurface(flags, surface->w, surface->h,
880  format->BitsPerPixel, format->Rmask,
881  format->Gmask, format->Bmask,
882  format->Amask);
883  if (convert == NULL) {
884  return (NULL);
885  }
886 
887  /* Copy the palette if any */
888  if (format->palette && convert->format->palette) {
889  SDL_memcpy(convert->format->palette->colors,
890  format->palette->colors,
891  format->palette->ncolors * sizeof(SDL_Color));
892  convert->format->palette->ncolors = format->palette->ncolors;
893  }
894 
895  /* Save the original copy flags */
896  copy_flags = surface->map->info.flags;
897  copy_color.r = surface->map->info.r;
898  copy_color.g = surface->map->info.g;
899  copy_color.b = surface->map->info.b;
900  copy_color.a = surface->map->info.a;
901  surface->map->info.r = 0xFF;
902  surface->map->info.g = 0xFF;
903  surface->map->info.b = 0xFF;
904  surface->map->info.a = 0xFF;
905  surface->map->info.flags = 0;
906  SDL_InvalidateMap(surface->map);
907 
908  /* Copy over the image data */
909  bounds.x = 0;
910  bounds.y = 0;
911  bounds.w = surface->w;
912  bounds.h = surface->h;
913  SDL_LowerBlit(surface, &bounds, convert, &bounds);
914 
915  /* Clean up the original surface, and update converted surface */
916  convert->map->info.r = copy_color.r;
917  convert->map->info.g = copy_color.g;
918  convert->map->info.b = copy_color.b;
919  convert->map->info.a = copy_color.a;
920  convert->map->info.flags =
921  (copy_flags &
925  surface->map->info.r = copy_color.r;
926  surface->map->info.g = copy_color.g;
927  surface->map->info.b = copy_color.b;
928  surface->map->info.a = copy_color.a;
929  surface->map->info.flags = copy_flags;
930  SDL_InvalidateMap(surface->map);
931  if (copy_flags & SDL_COPY_COLORKEY) {
932  SDL_bool set_colorkey_by_color = SDL_FALSE;
933 
934  if (surface->format->palette) {
935  if (format->palette &&
936  surface->format->palette->ncolors <= format->palette->ncolors &&
937  (SDL_memcmp(surface->format->palette->colors, format->palette->colors,
938  surface->format->palette->ncolors * sizeof(SDL_Color)) == 0)) {
939  /* The palette is identical, just set the same colorkey */
940  SDL_SetColorKey(convert, 1, surface->map->info.colorkey);
941  } else if (format->Amask) {
942  /* The alpha was set in the destination from the palette */
943  } else {
944  set_colorkey_by_color = SDL_TRUE;
945  }
946  } else {
947  set_colorkey_by_color = SDL_TRUE;
948  }
949 
950  if (set_colorkey_by_color) {
951  /* Set the colorkey by color, which needs to be unique */
952  Uint8 keyR, keyG, keyB, keyA;
953 
954  SDL_GetRGBA(surface->map->info.colorkey, surface->format, &keyR,
955  &keyG, &keyB, &keyA);
956  SDL_SetColorKey(convert, 1,
957  SDL_MapRGBA(convert->format, keyR, keyG, keyB, keyA));
958  /* This is needed when converting for 3D texture upload */
960  }
961  }
962  SDL_SetClipRect(convert, &surface->clip_rect);
963 
964  /* Enable alpha blending by default if the new surface has an
965  * alpha channel or alpha modulation */
966  if ((surface->format->Amask && format->Amask) ||
967  (copy_flags & (SDL_COPY_COLORKEY|SDL_COPY_MODULATE_ALPHA))) {
969  }
970  if ((copy_flags & SDL_COPY_RLE_DESIRED) || (flags & SDL_RLEACCEL)) {
971  SDL_SetSurfaceRLE(convert, SDL_RLEACCEL);
972  }
973 
974  /* We're ready to go! */
975  return (convert);
976 }
Uint8 r
Definition: SDL_blit.h:70
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1565
Uint8 b
Definition: SDL_blit.h:70
SDL_bool SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect)
Definition: SDL_surface.c:470
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
int SDL_SetSurfaceRLE(SDL_Surface *surface, int flag)
Sets the RLE acceleration hint for a surface.
Definition: SDL_surface.c:169
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
Uint8 g
Definition: SDL_pixels.h:282
#define SDL_MapRGBA
Uint8 g
Definition: SDL_blit.h:70
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
int SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode)
Set the blend mode used for blit operations.
Definition: SDL_surface.c:404
static void SDL_ConvertColorkeyToAlpha(SDL_Surface *surface)
Definition: SDL_surface.c:253
Uint8 b
Definition: SDL_pixels.h:283
#define SDL_COPY_RLE_COLORKEY
Definition: SDL_blit.h:42
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
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
Uint32 colorkey
Definition: SDL_blit.h:69
#define SDL_COPY_RLE_DESIRED
Definition: SDL_blit.h:41
SDL_bool
Definition: SDL_stdinc.h:126
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
#define SDL_memcpy
Uint8 r
Definition: SDL_pixels.h:281
Uint8 a
Definition: SDL_pixels.h:284
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
#define SDL_memcmp
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
#define SDL_GetRGBA
SDL_Rect clip_rect
Definition: SDL_surface.h:85
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
#define NULL
Definition: begin_code.h:143
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_SetError
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
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
int h
Definition: SDL_rect.h:67
#define SDL_COPY_RLE_ALPHAKEY
Definition: SDL_blit.h:43
GLbitfield flags
SDL_Palette * palette
Definition: SDL_pixels.h:302
int y
Definition: SDL_rect.h:66
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitInfo info
Definition: SDL_blit.h:91
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64
#define SDL_RLEACCEL
Definition: SDL_surface.h:54
Uint8 a
Definition: SDL_blit.h:70
SDL_Surface* SDL_ConvertSurfaceFormat ( SDL_Surface src,
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.

981 {
982  SDL_PixelFormat *fmt;
983  SDL_Surface *convert = NULL;
984 
986  if (fmt) {
987  convert = SDL_ConvertSurface(surface, fmt, flags);
988  SDL_FreeFormat(fmt);
989  }
990  return convert;
991 }
SDL_Surface * SDL_ConvertSurface(SDL_Surface *surface, const SDL_PixelFormat *format, Uint32 flags)
Definition: SDL_surface.c:855
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
#define SDL_AllocFormat
#define SDL_FreeFormat
#define NULL
Definition: begin_code.h:143
Uint32 pixel_format
Definition: testoverlay2.c:152
GLbitfield flags
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
flagsThe flags are obsolete and should be set to 0.
widthThe width in pixels of the surface to create.
heightThe height in pixels of the surface to create.
depthThe depth in bits of the surface to create.
RmaskThe red mask of the surface to create.
GmaskThe green mask of the surface to create.
BmaskThe blue mask of the surface to create.
AmaskThe 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().

41 {
42  SDL_Surface *surface;
43  Uint32 format;
44 
45  /* The flags are no longer used, make the compiler happy */
46  (void)flags;
47 
48  /* Get the pixel format */
49  format = SDL_MasksToPixelFormatEnum(depth, Rmask, Gmask, Bmask, Amask);
50  if (format == SDL_PIXELFORMAT_UNKNOWN) {
51  SDL_SetError("Unknown pixel format");
52  return NULL;
53  }
54 
55  /* Allocate the surface */
56  surface = (SDL_Surface *) SDL_calloc(1, sizeof(*surface));
57  if (surface == NULL) {
59  return NULL;
60  }
61 
62  surface->format = SDL_AllocFormat(format);
63  if (!surface->format) {
64  SDL_FreeSurface(surface);
65  return NULL;
66  }
67  surface->w = width;
68  surface->h = height;
69  surface->pitch = SDL_CalculatePitch(surface);
70  SDL_SetClipRect(surface, NULL);
71 
72  if (SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) {
73  SDL_Palette *palette =
74  SDL_AllocPalette((1 << surface->format->BitsPerPixel));
75  if (!palette) {
76  SDL_FreeSurface(surface);
77  return NULL;
78  }
79  if (palette->ncolors == 2) {
80  /* Create a black and white bitmap palette */
81  palette->colors[0].r = 0xFF;
82  palette->colors[0].g = 0xFF;
83  palette->colors[0].b = 0xFF;
84  palette->colors[1].r = 0x00;
85  palette->colors[1].g = 0x00;
86  palette->colors[1].b = 0x00;
87  }
88  SDL_SetSurfacePalette(surface, palette);
89  SDL_FreePalette(palette);
90  }
91 
92  /* Get the pixels */
93  if (surface->w && surface->h) {
94  /* Assumptions checked in surface_size_assumptions assert above */
95  Sint64 size = ((Sint64)surface->h * surface->pitch);
97  /* Overflow... */
98  SDL_FreeSurface(surface);
100  return NULL;
101  }
102 
103  surface->pixels = SDL_malloc((size_t)size);
104  if (!surface->pixels) {
105  SDL_FreeSurface(surface);
106  SDL_OutOfMemory();
107  return NULL;
108  }
109  /* This is important for bitmaps */
110  SDL_memset(surface->pixels, 0, surface->h * surface->pitch);
111  }
112 
113  /* Allocate an empty mapping */
114  surface->map = SDL_AllocBlitMap();
115  if (!surface->map) {
116  SDL_FreeSurface(surface);
117  return NULL;
118  }
119 
120  /* By default surface with an alpha mask are set up for blending */
121  if (Amask) {
123  }
124 
125  /* The surface is ready to go */
126  surface->refcount = 1;
127  return surface;
128 }
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1565
SDL_bool SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect)
Definition: SDL_surface.c:470
GLint GLint GLsizei width
Definition: SDL_opengl.h:1565
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
Uint8 g
Definition: SDL_pixels.h:282
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:133
#define SDL_MasksToPixelFormatEnum
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
int SDL_SetSurfaceBlendMode(SDL_Surface *surface, SDL_BlendMode blendMode)
Set the blend mode used for blit operations.
Definition: SDL_surface.c:404
Uint8 b
Definition: SDL_pixels.h:283
#define SDL_AllocFormat
#define SDL_MAX_SINT32
A signed 32-bit integer type.
Definition: SDL_stdinc.h:151
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1565
GLsizeiptr size
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
void * SDL_calloc(size_t nmemb, size_t size)
Uint8 r
Definition: SDL_pixels.h:281
void * pixels
Definition: SDL_surface.h:75
Uint8 BitsPerPixel
Definition: SDL_pixels.h:303
int SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette)
Set the palette used by a surface.
Definition: SDL_surface.c:155
#define SDL_AllocPalette
void SDL_FreeSurface(SDL_Surface *surface)
Definition: SDL_surface.c:1129
#define NULL
Definition: begin_code.h:143
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_PixelFormat * format
Definition: SDL_surface.h:72
GLint GLint GLsizei GLsizei GLsizei depth
Definition: SDL_opengl.h:1565
#define SDL_FreePalette
#define SDL_SetError
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
SDL_BlitMap * SDL_AllocBlitMap(void)
Definition: SDL_pixels.c:954
GLbitfield flags
int SDL_CalculatePitch(SDL_Surface *surface)
Definition: SDL_pixels.c:748
#define SDL_malloc
int64_t Sint64
A signed 64-bit integer type.
Definition: SDL_stdinc.h:162
#define SDL_memset
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.

138 {
139  SDL_Surface *surface;
140 
141  surface =
142  SDL_CreateRGBSurface(0, 0, 0, depth, Rmask, Gmask, Bmask, Amask);
143  if (surface != NULL) {
144  surface->flags |= SDL_PREALLOC;
145  surface->pixels = pixels;
146  surface->w = width;
147  surface->h = height;
148  surface->pitch = pitch;
149  SDL_SetClipRect(surface, NULL);
150  }
151  return surface;
152 }
SDL_bool SDL_SetClipRect(SDL_Surface *surface, const SDL_Rect *rect)
Definition: SDL_surface.c:470
GLint GLint GLsizei width
Definition: SDL_opengl.h:1565
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1565
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1565
Uint32 flags
Definition: SDL_surface.h:71
void * pixels
Definition: SDL_surface.h:75
#define NULL
Definition: begin_code.h:143
GLint GLint GLsizei GLsizei GLsizei depth
Definition: SDL_opengl.h:1565
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
#define SDL_PREALLOC
Definition: SDL_surface.h:53
int SDL_FillRect ( SDL_Surface dst,
const SDL_Rect rect,
Uint32  color 
)

Performs a fast fill of the given rectangle with color.

If rect is NULL, the whole surface will be filled with color.

The color should be a pixel of the format used by the surface, and can be generated by the SDL_MapRGB() function.

Returns
0 on success, or -1 on error.

Definition at line 237 of file SDL_fillrect.c.

References SDL_PixelFormat::BitsPerPixel, SDL_PixelFormat::BytesPerPixel, SDL_Surface::clip_rect, SDL_Surface::format, SDL_Rect::h, SDL_Surface::pitch, SDL_Surface::pixels, SDL_FillRect1(), SDL_FillRect2(), SDL_FillRect3(), SDL_FillRect4(), SDL_HasSSE, SDL_IntersectRect, SDL_RectEmpty(), SDL_SetError, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SDL_FillRects().

238 {
239  SDL_Rect clipped;
240  Uint8 *pixels;
241 
242  if (!dst) {
243  return SDL_SetError("Passed NULL destination surface");
244  }
245 
246  /* This function doesn't work on surfaces < 8 bpp */
247  if (dst->format->BitsPerPixel < 8) {
248  return SDL_SetError("SDL_FillRect(): Unsupported surface format");
249  }
250 
251  /* If 'rect' == NULL, then fill the whole surface */
252  if (rect) {
253  /* Perform clipping */
254  if (!SDL_IntersectRect(rect, &dst->clip_rect, &clipped)) {
255  return 0;
256  }
257  rect = &clipped;
258  } else {
259  rect = &dst->clip_rect;
260  /* Don't attempt to fill if the surface's clip_rect is empty */
261  if (SDL_RectEmpty(rect)) {
262  return 0;
263  }
264  }
265 
266  /* Perform software fill */
267  if (!dst->pixels) {
268  return SDL_SetError("SDL_FillRect(): You must lock the surface");
269  }
270 
271  pixels = (Uint8 *) dst->pixels + rect->y * dst->pitch +
272  rect->x * dst->format->BytesPerPixel;
273 
274  switch (dst->format->BytesPerPixel) {
275  case 1:
276  {
277  color |= (color << 8);
278  color |= (color << 16);
279 #ifdef __SSE__
280  if (SDL_HasSSE()) {
281  SDL_FillRect1SSE(pixels, dst->pitch, color, rect->w, rect->h);
282  break;
283  }
284 #endif
285  SDL_FillRect1(pixels, dst->pitch, color, rect->w, rect->h);
286  break;
287  }
288 
289  case 2:
290  {
291  color |= (color << 16);
292 #ifdef __SSE__
293  if (SDL_HasSSE()) {
294  SDL_FillRect2SSE(pixels, dst->pitch, color, rect->w, rect->h);
295  break;
296  }
297 #endif
298  SDL_FillRect2(pixels, dst->pitch, color, rect->w, rect->h);
299  break;
300  }
301 
302  case 3:
303  /* 24-bit RGB is a slow path, at least for now. */
304  {
305  SDL_FillRect3(pixels, dst->pitch, color, rect->w, rect->h);
306  break;
307  }
308 
309  case 4:
310  {
311 #ifdef __SSE__
312  if (SDL_HasSSE()) {
313  SDL_FillRect4SSE(pixels, dst->pitch, color, rect->w, rect->h);
314  break;
315  }
316 #endif
317  SDL_FillRect4(pixels, dst->pitch, color, rect->w, rect->h);
318  break;
319  }
320  }
321 
322  /* We're done! */
323  return 0;
324 }
Uint8 BytesPerPixel
Definition: SDL_pixels.h:304
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1565
#define SDL_IntersectRect
SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
Returns true if the rectangle has no area.
Definition: SDL_rect.h:82
static void SDL_FillRect3(Uint8 *pixels, int pitch, Uint32 color, int w, int h)
Definition: SDL_fillrect.c:197
void * pixels
Definition: SDL_surface.h:75
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
Uint8 BitsPerPixel
Definition: SDL_pixels.h:303
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
SDL_Rect clip_rect
Definition: SDL_surface.h:85
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_SetError
static void SDL_FillRect2(Uint8 *pixels, int pitch, Uint32 color, int w, int h)
Definition: SDL_fillrect.c:173
int h
Definition: SDL_rect.h:67
GLuint color
static void SDL_FillRect4(Uint8 *pixels, int pitch, Uint32 color, int w, int h)
Definition: SDL_fillrect.c:225
static void SDL_FillRect1(Uint8 *pixels, int pitch, Uint32 color, int w, int h)
Definition: SDL_fillrect.c:134
#define SDL_HasSSE
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64
int SDL_FillRects ( SDL_Surface dst,
const SDL_Rect rects,
int  count,
Uint32  color 
)

Definition at line 327 of file SDL_fillrect.c.

References i, SDL_FillRect(), and SDL_SetError.

329 {
330  int i;
331  int status = 0;
332 
333  if (!rects) {
334  return SDL_SetError("SDL_FillRects() passed NULL rects");
335  }
336 
337  for (i = 0; i < count; ++i) {
338  status += SDL_FillRect(dst, &rects[i], color);
339  }
340  return status;
341 }
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1564
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
int SDL_FillRect(SDL_Surface *dst, const SDL_Rect *rect, Uint32 color)
Definition: SDL_fillrect.c:237
#define SDL_SetError
GLuint color
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().

1130 {
1131  if (surface == NULL) {
1132  return;
1133  }
1134  if (surface->flags & SDL_DONTFREE) {
1135  return;
1136  }
1137  if (--surface->refcount > 0) {
1138  return;
1139  }
1140  while (surface->locked > 0) {
1141  SDL_UnlockSurface(surface);
1142  }
1143  if (surface->flags & SDL_RLEACCEL) {
1144  SDL_UnRLESurface(surface, 0);
1145  }
1146  if (surface->format) {
1147  SDL_SetSurfacePalette(surface, NULL);
1148  SDL_FreeFormat(surface->format);
1149  surface->format = NULL;
1150  }
1151  if (surface->map != NULL) {
1152  SDL_FreeBlitMap(surface->map);
1153  surface->map = NULL;
1154  }
1155  if (!(surface->flags & SDL_PREALLOC)) {
1156  SDL_free(surface->pixels);
1157  }
1158  SDL_free(surface);
1159 }
void SDL_UnlockSurface(SDL_Surface *surface)
Definition: SDL_surface.c:837
#define SDL_DONTFREE
Definition: SDL_surface.h:55
void SDL_UnRLESurface(SDL_Surface *surface, int recode)
Uint32 flags
Definition: SDL_surface.h:71
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
void * pixels
Definition: SDL_surface.h:75
int SDL_SetSurfacePalette(SDL_Surface *surface, SDL_Palette *palette)
Set the palette used by a surface.
Definition: SDL_surface.c:155
void SDL_free(void *mem)
#define SDL_FreeFormat
#define NULL
Definition: begin_code.h:143
SDL_PixelFormat * format
Definition: SDL_surface.h:72
void SDL_FreeBlitMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:1079
#define SDL_PREALLOC
Definition: SDL_surface.h:53
#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.

495 {
496  if (surface && rect) {
497  *rect = surface->clip_rect;
498  }
499 }
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
surfaceThe surface to update
keyA 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.

236 {
237  if (!surface) {
238  return -1;
239  }
240 
241  if (!(surface->map->info.flags & SDL_COPY_COLORKEY)) {
242  return -1;
243  }
244 
245  if (key) {
246  *key = surface->map->info.colorkey;
247  }
248  return 0;
249 }
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
Uint32 colorkey
Definition: SDL_blit.h:69
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
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
surfaceThe surface to query.
alphaA 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.

392 {
393  if (!surface) {
394  return -1;
395  }
396 
397  if (alpha) {
398  *alpha = surface->map->info.a;
399  }
400  return 0;
401 }
GLfloat GLfloat GLfloat alpha
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_BlitInfo info
Definition: SDL_blit.h:91
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
surfaceThe surface to query.
blendModeA 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.

442 {
443  if (!surface) {
444  return -1;
445  }
446 
447  if (!blendMode) {
448  return 0;
449  }
450 
451  switch (surface->map->
452  info.flags & (SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) {
453  case SDL_COPY_BLEND:
455  break;
456  case SDL_COPY_ADD:
458  break;
459  case SDL_COPY_MOD:
461  break;
462  default:
464  break;
465  }
466  return 0;
467 }
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
int SDL_GetSurfaceColorMod ( SDL_Surface surface,
Uint8 r,
Uint8 g,
Uint8 b 
)

Get the additional color value used in blit operations.

Parameters
surfaceThe surface to query.
rA pointer filled in with the current red color value.
gA pointer filled in with the current green color value.
bA 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.

350 {
351  if (!surface) {
352  return -1;
353  }
354 
355  if (r) {
356  *r = surface->map->info.r;
357  }
358  if (g) {
359  *g = surface->map->info.g;
360  }
361  if (b) {
362  *b = surface->map->info.b;
363  }
364  return 0;
365 }
Uint8 r
Definition: SDL_blit.h:70
Uint8 b
Definition: SDL_blit.h:70
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2072
Uint8 g
Definition: SDL_blit.h:70
GLboolean GLboolean g
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
GLboolean GLboolean GLboolean b
SDL_BlitInfo info
Definition: SDL_blit.h:91
SDL_Surface* SDL_LoadBMP_RW ( SDL_RWops src,
int  freesrc 
)

Load a surface from a seekable SDL data stream (memory or file).

If freesrc is non-zero, the stream will be closed after being read.

The new surface should be freed with SDL_FreeSurface().

Returns
the new surface, or NULL if there was an error.

Definition at line 81 of file SDL_bmp.c.

References SDL_Color::a, SDL_Color::b, BI_BITFIELDS, BI_RGB, colors, SDL_Palette::colors, CorrectAlphaChannel(), done, SDL_Surface::format, SDL_Color::g, SDL_Surface::h, i, SDL_Palette::ncolors, NULL, SDL_Surface::pitch, SDL_Surface::pixels, SDL_Color::r, RW_SEEK_CUR, RW_SEEK_SET, SDL_ALPHA_OPAQUE, SDL_assert, SDL_ClearError, SDL_CreateRGBSurface, SDL_EFREAD, SDL_EFSEEK, SDL_Error, SDL_FALSE, SDL_FreeSurface, SDL_GetError, SDL_OutOfMemory, SDL_ReadLE16, SDL_ReadLE32, SDL_realloc, SDL_RWclose, SDL_RWread, SDL_RWseek, SDL_RWtell, SDL_SetError, SDL_strcmp, SDL_strncmp, SDL_Swap16(), SDL_Swap32(), SDL_TRUE, and SDL_Surface::w.

82 {
83  SDL_bool was_error;
84  Sint64 fp_offset = 0;
85  int bmpPitch;
86  int i, pad;
87  SDL_Surface *surface;
88  Uint32 Rmask = 0;
89  Uint32 Gmask = 0;
90  Uint32 Bmask = 0;
91  Uint32 Amask = 0;
92  SDL_Palette *palette;
93  Uint8 *bits;
94  Uint8 *top, *end;
95  SDL_bool topDown;
96  int ExpandBMP;
97  SDL_bool haveRGBMasks = SDL_FALSE;
98  SDL_bool haveAlphaMask = SDL_FALSE;
99  SDL_bool correctAlpha = SDL_FALSE;
100 
101  /* The Win32 BMP file header (14 bytes) */
102  char magic[2];
103  /* Uint32 bfSize = 0; */
104  /* Uint16 bfReserved1 = 0; */
105  /* Uint16 bfReserved2 = 0; */
106  Uint32 bfOffBits = 0;
107 
108  /* The Win32 BITMAPINFOHEADER struct (40 bytes) */
109  Uint32 biSize = 0;
110  Sint32 biWidth = 0;
111  Sint32 biHeight = 0;
112  /* Uint16 biPlanes = 0; */
113  Uint16 biBitCount = 0;
114  Uint32 biCompression = 0;
115  /* Uint32 biSizeImage = 0; */
116  /* Sint32 biXPelsPerMeter = 0; */
117  /* Sint32 biYPelsPerMeter = 0; */
118  Uint32 biClrUsed = 0;
119  /* Uint32 biClrImportant = 0; */
120 
121  /* Make sure we are passed a valid data source */
122  surface = NULL;
123  was_error = SDL_FALSE;
124  if (src == NULL) {
125  was_error = SDL_TRUE;
126  goto done;
127  }
128 
129  /* Read in the BMP file header */
130  fp_offset = SDL_RWtell(src);
131  SDL_ClearError();
132  if (SDL_RWread(src, magic, 1, 2) != 2) {
134  was_error = SDL_TRUE;
135  goto done;
136  }
137  if (SDL_strncmp(magic, "BM", 2) != 0) {
138  SDL_SetError("File is not a Windows BMP file");
139  was_error = SDL_TRUE;
140  goto done;
141  }
142  /* bfSize = */ SDL_ReadLE32(src);
143  /* bfReserved1 = */ SDL_ReadLE16(src);
144  /* bfReserved2 = */ SDL_ReadLE16(src);
145  bfOffBits = SDL_ReadLE32(src);
146 
147  /* Read the Win32 BITMAPINFOHEADER */
148  biSize = SDL_ReadLE32(src);
149  if (biSize == 12) { /* really old BITMAPCOREHEADER */
150  biWidth = (Uint32) SDL_ReadLE16(src);
151  biHeight = (Uint32) SDL_ReadLE16(src);
152  /* biPlanes = */ SDL_ReadLE16(src);
153  biBitCount = SDL_ReadLE16(src);
154  biCompression = BI_RGB;
155  } else if (biSize >= 40) { /* some version of BITMAPINFOHEADER */
156  Uint32 headerSize;
157  biWidth = SDL_ReadLE32(src);
158  biHeight = SDL_ReadLE32(src);
159  /* biPlanes = */ SDL_ReadLE16(src);
160  biBitCount = SDL_ReadLE16(src);
161  biCompression = SDL_ReadLE32(src);
162  /* biSizeImage = */ SDL_ReadLE32(src);
163  /* biXPelsPerMeter = */ SDL_ReadLE32(src);
164  /* biYPelsPerMeter = */ SDL_ReadLE32(src);
165  biClrUsed = SDL_ReadLE32(src);
166  /* biClrImportant = */ SDL_ReadLE32(src);
167 
168  /* 64 == BITMAPCOREHEADER2, an incompatible OS/2 2.x extension. Skip this stuff for now. */
169  if (biSize == 64) {
170  /* ignore these extra fields. */
171  if (biCompression == BI_BITFIELDS) {
172  /* this value is actually huffman compression in this variant. */
173  SDL_SetError("Compressed BMP files not supported");
174  was_error = SDL_TRUE;
175  goto done;
176  }
177  } else {
178  /* This is complicated. If compression is BI_BITFIELDS, then
179  we have 3 DWORDS that specify the RGB masks. This is either
180  stored here in an BITMAPV2INFOHEADER (which only differs in
181  that it adds these RGB masks) and biSize >= 52, or we've got
182  these masks stored in the exact same place, but strictly
183  speaking, this is the bmiColors field in BITMAPINFO immediately
184  following the legacy v1 info header, just past biSize. */
185  if (biCompression == BI_BITFIELDS) {
186  haveRGBMasks = SDL_TRUE;
187  Rmask = SDL_ReadLE32(src);
188  Gmask = SDL_ReadLE32(src);
189  Bmask = SDL_ReadLE32(src);
190 
191  /* ...v3 adds an alpha mask. */
192  if (biSize >= 56) { /* BITMAPV3INFOHEADER; adds alpha mask */
193  haveAlphaMask = SDL_TRUE;
194  Amask = SDL_ReadLE32(src);
195  }
196  } else {
197  /* the mask fields are ignored for v2+ headers if not BI_BITFIELD. */
198  if (biSize >= 52) { /* BITMAPV2INFOHEADER; adds RGB masks */
199  /*Rmask = */ SDL_ReadLE32(src);
200  /*Gmask = */ SDL_ReadLE32(src);
201  /*Bmask = */ SDL_ReadLE32(src);
202  }
203  if (biSize >= 56) { /* BITMAPV3INFOHEADER; adds alpha mask */
204  /*Amask = */ SDL_ReadLE32(src);
205  }
206  }
207 
208  /* Insert other fields here; Wikipedia and MSDN say we're up to
209  v5 of this header, but we ignore those for now (they add gamma,
210  color spaces, etc). Ignoring the weird OS/2 2.x format, we
211  currently parse up to v3 correctly (hopefully!). */
212  }
213 
214  /* skip any header bytes we didn't handle... */
215  headerSize = (Uint32) (SDL_RWtell(src) - (fp_offset + 14));
216  if (biSize > headerSize) {
217  SDL_RWseek(src, (biSize - headerSize), RW_SEEK_CUR);
218  }
219  }
220  if (biHeight < 0) {
221  topDown = SDL_TRUE;
222  biHeight = -biHeight;
223  } else {
224  topDown = SDL_FALSE;
225  }
226 
227  /* Check for read error */
228  if (SDL_strcmp(SDL_GetError(), "") != 0) {
229  was_error = SDL_TRUE;
230  goto done;
231  }
232 
233  /* Expand 1 and 4 bit bitmaps to 8 bits per pixel */
234  switch (biBitCount) {
235  case 1:
236  case 4:
237  ExpandBMP = biBitCount;
238  biBitCount = 8;
239  break;
240  case 2:
241  case 3:
242  case 5:
243  case 6:
244  case 7:
245  SDL_SetError("%d-bpp BMP images are not supported", biBitCount);
246  was_error = SDL_TRUE;
247  goto done;
248  default:
249  ExpandBMP = 0;
250  break;
251  }
252 
253  /* We don't support any BMP compression right now */
254  switch (biCompression) {
255  case BI_RGB:
256  /* If there are no masks, use the defaults */
257  SDL_assert(!haveRGBMasks);
258  SDL_assert(!haveAlphaMask);
259  /* Default values for the BMP format */
260  switch (biBitCount) {
261  case 15:
262  case 16:
263  Rmask = 0x7C00;
264  Gmask = 0x03E0;
265  Bmask = 0x001F;
266  break;
267  case 24:
268 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
269  Rmask = 0x000000FF;
270  Gmask = 0x0000FF00;
271  Bmask = 0x00FF0000;
272 #else
273  Rmask = 0x00FF0000;
274  Gmask = 0x0000FF00;
275  Bmask = 0x000000FF;
276 #endif
277  break;
278  case 32:
279  /* We don't know if this has alpha channel or not */
280  correctAlpha = SDL_TRUE;
281  Amask = 0xFF000000;
282  Rmask = 0x00FF0000;
283  Gmask = 0x0000FF00;
284  Bmask = 0x000000FF;
285  break;
286  default:
287  break;
288  }
289  break;
290 
291  case BI_BITFIELDS:
292  break; /* we handled this in the info header. */
293 
294  default:
295  SDL_SetError("Compressed BMP files not supported");
296  was_error = SDL_TRUE;
297  goto done;
298  }
299 
300  /* Create a compatible surface, note that the colors are RGB ordered */
301  surface =
302  SDL_CreateRGBSurface(0, biWidth, biHeight, biBitCount, Rmask, Gmask,
303  Bmask, Amask);
304  if (surface == NULL) {
305  was_error = SDL_TRUE;
306  goto done;
307  }
308 
309  /* Load the palette, if any */
310  palette = (surface->format)->palette;
311  if (palette) {
312  SDL_assert(biBitCount <= 8);
313  if (biClrUsed == 0) {
314  biClrUsed = 1 << biBitCount;
315  } else if (biClrUsed > (1 << biBitCount)) {
316  SDL_SetError("BMP file has an invalid number of colors");
317  was_error = SDL_TRUE;
318  goto done;
319  }
320  if ((int) biClrUsed > palette->ncolors) {
321  SDL_Color *colors;
322  int ncolors = biClrUsed;
323  colors =
324  (SDL_Color *) SDL_realloc(palette->colors,
325  ncolors *
326  sizeof(*palette->colors));
327  if (!colors) {
328  SDL_OutOfMemory();
329  was_error = SDL_TRUE;
330  goto done;
331  }
332  palette->ncolors = ncolors;
333  palette->colors = colors;
334  } else if ((int) biClrUsed < palette->ncolors) {
335  palette->ncolors = biClrUsed;
336  }
337  if (biSize == 12) {
338  for (i = 0; i < (int) biClrUsed; ++i) {
339  SDL_RWread(src, &palette->colors[i].b, 1, 1);
340  SDL_RWread(src, &palette->colors[i].g, 1, 1);
341  SDL_RWread(src, &palette->colors[i].r, 1, 1);
342  palette->colors[i].a = SDL_ALPHA_OPAQUE;
343  }
344  } else {
345  for (i = 0; i < (int) biClrUsed; ++i) {
346  SDL_RWread(src, &palette->colors[i].b, 1, 1);
347  SDL_RWread(src, &palette->colors[i].g, 1, 1);
348  SDL_RWread(src, &palette->colors[i].r, 1, 1);
349  SDL_RWread(src, &palette->colors[i].a, 1, 1);
350 
351  /* According to Microsoft documentation, the fourth element
352  is reserved and must be zero, so we shouldn't treat it as
353  alpha.
354  */
355  palette->colors[i].a = SDL_ALPHA_OPAQUE;
356  }
357  }
358  }
359 
360  /* Read the surface pixels. Note that the bmp image is upside down */
361  if (SDL_RWseek(src, fp_offset + bfOffBits, RW_SEEK_SET) < 0) {
363  was_error = SDL_TRUE;
364  goto done;
365  }
366  top = (Uint8 *)surface->pixels;
367  end = (Uint8 *)surface->pixels+(surface->h*surface->pitch);
368  switch (ExpandBMP) {
369  case 1:
370  bmpPitch = (biWidth + 7) >> 3;
371  pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
372  break;
373  case 4:
374  bmpPitch = (biWidth + 1) >> 1;
375  pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0);
376  break;
377  default:
378  pad = ((surface->pitch % 4) ? (4 - (surface->pitch % 4)) : 0);
379  break;
380  }
381  if (topDown) {
382  bits = top;
383  } else {
384  bits = end - surface->pitch;
385  }
386  while (bits >= top && bits < end) {
387  switch (ExpandBMP) {
388  case 1:
389  case 4:{
390  Uint8 pixel = 0;
391  int shift = (8 - ExpandBMP);
392  for (i = 0; i < surface->w; ++i) {
393  if (i % (8 / ExpandBMP) == 0) {
394  if (!SDL_RWread(src, &pixel, 1, 1)) {
395  SDL_SetError("Error reading from BMP");
396  was_error = SDL_TRUE;
397  goto done;
398  }
399  }
400  bits[i] = (pixel >> shift);
401  if (bits[i] >= biClrUsed) {
402  SDL_SetError("A BMP image contains a pixel with a color out of the palette");
403  was_error = SDL_TRUE;
404  goto done;
405  }
406  pixel <<= ExpandBMP;
407  }
408  }
409  break;
410 
411  default:
412  if (SDL_RWread(src, bits, 1, surface->pitch) != surface->pitch) {
414  was_error = SDL_TRUE;
415  goto done;
416  }
417  if (biBitCount == 8 && palette && biClrUsed < (1 << biBitCount)) {
418  for (i = 0; i < surface->w; ++i) {
419  if (bits[i] >= biClrUsed) {
420  SDL_SetError("A BMP image contains a pixel with a color out of the palette");
421  was_error = SDL_TRUE;
422  goto done;
423  }
424  }
425  }
426 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
427  /* Byte-swap the pixels if needed. Note that the 24bpp
428  case has already been taken care of above. */
429  switch (biBitCount) {
430  case 15:
431  case 16:{
432  Uint16 *pix = (Uint16 *) bits;
433  for (i = 0; i < surface->w; i++)
434  pix[i] = SDL_Swap16(pix[i]);
435  break;
436  }
437 
438  case 32:{
439  Uint32 *pix = (Uint32 *) bits;
440  for (i = 0; i < surface->w; i++)
441  pix[i] = SDL_Swap32(pix[i]);
442  break;
443  }
444  }
445 #endif
446  break;
447  }
448  /* Skip padding bytes, ugh */
449  if (pad) {
450  Uint8 padbyte;
451  for (i = 0; i < pad; ++i) {
452  SDL_RWread(src, &padbyte, 1, 1);
453  }
454  }
455  if (topDown) {
456  bits += surface->pitch;
457  } else {
458  bits -= surface->pitch;
459  }
460  }
461  if (correctAlpha) {
462  CorrectAlphaChannel(surface);
463  }
464  done:
465  if (was_error) {
466  if (src) {
467  SDL_RWseek(src, fp_offset, RW_SEEK_SET);
468  }
469  SDL_FreeSurface(surface);
470  surface = NULL;
471  }
472  if (freesrc && src) {
473  SDL_RWclose(src);
474  }
475  return (surface);
476 }
#define BI_RGB
Definition: SDL_bmp.c:44
#define SDL_ClearError
#define SDL_GetError
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
Uint8 g
Definition: SDL_pixels.h:282
GLuint GLuint end
Definition: SDL_opengl.h:1564
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
#define SDL_ReadLE32
#define SDL_RWread(ctx, ptr, size, n)
Definition: SDL_rwops.h:187
Uint8 b
Definition: SDL_pixels.h:283
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
#define SDL_realloc
static void CorrectAlphaChannel(SDL_Surface *surface)
Definition: SDL_bmp.c:51
GLdouble GLdouble GLdouble GLdouble top
#define SDL_strncmp
#define SDL_Error
#define SDL_RWseek(ctx, offset, whence)
Definition: SDL_rwops.h:185
#define SDL_ReadLE16
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
Definition: SDL_endian.h:141
SDL_bool
Definition: SDL_stdinc.h:126
Uint8 r
Definition: SDL_pixels.h:281
void * pixels
Definition: SDL_surface.h:75
#define SDL_FreeSurface
Uint8 a
Definition: SDL_pixels.h:284
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
int done
Definition: checkkeys.c:28
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
Definition: SDL_endian.h:101
int32_t Sint32
Definition: SDL_stdinc.h:153
#define BI_BITFIELDS
Definition: SDL_bmp.c:47
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
#define SDL_assert(condition)
Definition: SDL_assert.h:167
#define NULL
Definition: begin_code.h:143
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_RWclose(ctx)
Definition: SDL_rwops.h:189
#define SDL_SetError
#define SDL_CreateRGBSurface
#define RW_SEEK_SET
Definition: SDL_rwops.h:174
uint16_t Uint16
An unsigned 16-bit integer type.
Definition: SDL_stdinc.h:147
#define SDL_strcmp
#define RW_SEEK_CUR
Definition: SDL_rwops.h:175
int64_t Sint64
A signed 64-bit integer type.
Definition: SDL_stdinc.h:162
static int colors[7]
Definition: testgesture.c:40
#define SDL_ALPHA_OPAQUE
Definition: SDL_pixels.h:45
#define SDL_RWtell(ctx)
Definition: SDL_rwops.h:186
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().

817 {
818  if (!surface->locked) {
819  /* Perform the lock */
820  if (surface->flags & SDL_RLEACCEL) {
821  SDL_UnRLESurface(surface, 1);
822  surface->flags |= SDL_RLEACCEL; /* save accel'd state */
823  }
824  }
825 
826  /* Increment the surface lock count, for recursive locks */
827  ++surface->locked;
828 
829  /* Ready to go.. */
830  return (0);
831 }
void SDL_UnRLESurface(SDL_Surface *surface, int recode)
Uint32 flags
Definition: SDL_surface.h:71
#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().

515 {
516  /* Check to make sure the blit mapping is valid */
517  if ((src->map->dst != dst) ||
518  (dst->format->palette &&
519  src->map->dst_palette_version != dst->format->palette->version) ||
520  (src->format->palette &&
521  src->map->src_palette_version != src->format->palette->version)) {
522  if (SDL_MapSurface(src, dst) < 0) {
523  return (-1);
524  }
525  /* just here for debugging */
526 /* printf */
527 /* ("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", */
528 /* src, dst->flags, src->map->info.flags, dst, dst->flags, */
529 /* dst->map->info.flags, src->map->blit); */
530  }
531  return (src->map->blit(src, srcrect, dst, dstrect));
532 }
Uint32 version
Definition: SDL_pixels.h:292
SDL_blit blit
Definition: SDL_blit.h:89
Uint32 dst_palette_version
Definition: SDL_blit.h:95
Uint32 src_palette_version
Definition: SDL_blit.h:96
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
int SDL_MapSurface(SDL_Surface *src, SDL_Surface *dst)
Definition: SDL_pixels.c:993
SDL_Surface * dst
Definition: SDL_blit.h:87
SDL_PixelFormat * format
Definition: SDL_surface.h:72
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().

791 {
792  static const Uint32 complex_copy_flags = (
796  );
797 
798  if (!(src->map->info.flags & SDL_COPY_NEAREST)) {
799  src->map->info.flags |= SDL_COPY_NEAREST;
800  SDL_InvalidateMap(src->map);
801  }
802 
803  if ( !(src->map->info.flags & complex_copy_flags) &&
804  src->format->format == dst->format->format &&
806  return SDL_SoftStretch( src, srcrect, dst, dstrect );
807  } else {
808  return SDL_LowerBlit( src, srcrect, dst, dstrect );
809  }
810 }
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
#define SDL_SoftStretch
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:133
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
#define SDL_COPY_NEAREST
Definition: SDL_blit.h:40
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitInfo info
Definition: SDL_blit.h:91
int SDL_SaveBMP_RW ( SDL_Surface surface,
SDL_RWops dst,
int  freedst 
)

Save a surface to a seekable SDL data stream (memory or file).

If freedst is non-zero, the stream will be closed after being written.

Returns
0 if successful or -1 if there was an error.

Definition at line 479 of file SDL_bmp.c.

References SDL_PixelFormat::Amask, BI_RGB, SDL_PixelFormat::BitsPerPixel, SDL_PixelFormat::Bmask, SDL_PixelFormat::BytesPerPixel, colors, SDL_Palette::colors, SDL_BlitInfo::flags, SDL_Surface::format, SDL_PixelFormat::Gmask, SDL_Surface::h, i, SDL_BlitMap::info, SDL_Surface::map, SDL_Palette::ncolors, NULL, SDL_PixelFormat::palette, SDL_Surface::pitch, SDL_Surface::pixels, SDL_PixelFormat::Rmask, RW_SEEK_SET, SDL_BYTEORDER, SDL_ClearError, SDL_ConvertSurface, SDL_COPY_COLORKEY, SDL_EFSEEK, SDL_EFWRITE, SDL_Error, SDL_FALSE, SDL_FreeSurface, SDL_GetError, SDL_InitFormat(), SDL_LIL_ENDIAN, SDL_LockSurface, SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_BGR24, SDL_PIXELFORMAT_BGRA8888, SDL_RWclose, SDL_RWseek, SDL_RWtell, SDL_RWwrite, SDL_SetError, SDL_strcmp, SDL_TRUE, SDL_UnlockSurface, SDL_WriteLE16, SDL_WriteLE32, and SDL_Surface::w.

480 {
481  Sint64 fp_offset;
482  int i, pad;
483  SDL_Surface *surface;
484  Uint8 *bits;
485 
486  /* The Win32 BMP file header (14 bytes) */
487  char magic[2] = { 'B', 'M' };
488  Uint32 bfSize;
489  Uint16 bfReserved1;
490  Uint16 bfReserved2;
491  Uint32 bfOffBits;
492 
493  /* The Win32 BITMAPINFOHEADER struct (40 bytes) */
494  Uint32 biSize;
495  Sint32 biWidth;
496  Sint32 biHeight;
497  Uint16 biPlanes;
498  Uint16 biBitCount;
499  Uint32 biCompression;
500  Uint32 biSizeImage;
501  Sint32 biXPelsPerMeter;
502  Sint32 biYPelsPerMeter;
503  Uint32 biClrUsed;
504  Uint32 biClrImportant;
505 
506  /* Make sure we have somewhere to save */
507  surface = NULL;
508  if (dst) {
509  SDL_bool save32bit = SDL_FALSE;
510 #ifdef SAVE_32BIT_BMP
511  /* We can save alpha information in a 32-bit BMP */
512  if (saveme->map->info.flags & SDL_COPY_COLORKEY ||
513  saveme->format->Amask) {
514  save32bit = SDL_TRUE;
515  }
516 #endif /* SAVE_32BIT_BMP */
517 
518  if (saveme->format->palette && !save32bit) {
519  if (saveme->format->BitsPerPixel == 8) {
520  surface = saveme;
521  } else {
522  SDL_SetError("%d bpp BMP files not supported",
523  saveme->format->BitsPerPixel);
524  }
525  } else if ((saveme->format->BitsPerPixel == 24) &&
527  (saveme->format->Rmask == 0x00FF0000) &&
528  (saveme->format->Gmask == 0x0000FF00) &&
529  (saveme->format->Bmask == 0x000000FF)
530 #else
531  (saveme->format->Rmask == 0x000000FF) &&
532  (saveme->format->Gmask == 0x0000FF00) &&
533  (saveme->format->Bmask == 0x00FF0000)
534 #endif
535  ) {
536  surface = saveme;
537  } else {
539 
540  /* If the surface has a colorkey or alpha channel we'll save a
541  32-bit BMP with alpha channel, otherwise save a 24-bit BMP. */
542  if (save32bit) {
543  SDL_InitFormat(&format,
546 #else
548 #endif
549  );
550  } else {
552  }
553  surface = SDL_ConvertSurface(saveme, &format, 0);
554  if (!surface) {
555  SDL_SetError("Couldn't convert image to %d bpp",
556  format.BitsPerPixel);
557  }
558  }
559  } else {
560  /* Set no error here because it may overwrite a more useful message from
561  SDL_RWFromFile() if SDL_SaveBMP_RW() is called from SDL_SaveBMP(). */
562  return -1;
563  }
564 
565  if (surface && (SDL_LockSurface(surface) == 0)) {
566  const int bw = surface->w * surface->format->BytesPerPixel;
567 
568  /* Set the BMP file header values */
569  bfSize = 0; /* We'll write this when we're done */
570  bfReserved1 = 0;
571  bfReserved2 = 0;
572  bfOffBits = 0; /* We'll write this when we're done */
573 
574  /* Write the BMP file header values */
575  fp_offset = SDL_RWtell(dst);
576  SDL_ClearError();
577  SDL_RWwrite(dst, magic, 2, 1);
578  SDL_WriteLE32(dst, bfSize);
579  SDL_WriteLE16(dst, bfReserved1);
580  SDL_WriteLE16(dst, bfReserved2);
581  SDL_WriteLE32(dst, bfOffBits);
582 
583  /* Set the BMP info values */
584  biSize = 40;
585  biWidth = surface->w;
586  biHeight = surface->h;
587  biPlanes = 1;
588  biBitCount = surface->format->BitsPerPixel;
589  biCompression = BI_RGB;
590  biSizeImage = surface->h * surface->pitch;
591  biXPelsPerMeter = 0;
592  biYPelsPerMeter = 0;
593  if (surface->format->palette) {
594  biClrUsed = surface->format->palette->ncolors;
595  } else {
596  biClrUsed = 0;
597  }
598  biClrImportant = 0;
599 
600  /* Write the BMP info values */
601  SDL_WriteLE32(dst, biSize);
602  SDL_WriteLE32(dst, biWidth);
603  SDL_WriteLE32(dst, biHeight);
604  SDL_WriteLE16(dst, biPlanes);
605  SDL_WriteLE16(dst, biBitCount);
606  SDL_WriteLE32(dst, biCompression);
607  SDL_WriteLE32(dst, biSizeImage);
608  SDL_WriteLE32(dst, biXPelsPerMeter);
609  SDL_WriteLE32(dst, biYPelsPerMeter);
610  SDL_WriteLE32(dst, biClrUsed);
611  SDL_WriteLE32(dst, biClrImportant);
612 
613  /* Write the palette (in BGR color order) */
614  if (surface->format->palette) {
615  SDL_Color *colors;
616  int ncolors;
617 
618  colors = surface->format->palette->colors;
619  ncolors = surface->format->palette->ncolors;
620  for (i = 0; i < ncolors; ++i) {
621  SDL_RWwrite(dst, &colors[i].b, 1, 1);
622  SDL_RWwrite(dst, &colors[i].g, 1, 1);
623  SDL_RWwrite(dst, &colors[i].r, 1, 1);
624  SDL_RWwrite(dst, &colors[i].a, 1, 1);
625  }
626  }
627 
628  /* Write the bitmap offset */
629  bfOffBits = (Uint32)(SDL_RWtell(dst) - fp_offset);
630  if (SDL_RWseek(dst, fp_offset + 10, RW_SEEK_SET) < 0) {
632  }
633  SDL_WriteLE32(dst, bfOffBits);
634  if (SDL_RWseek(dst, fp_offset + bfOffBits, RW_SEEK_SET) < 0) {
636  }
637 
638  /* Write the bitmap image upside down */
639  bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch);
640  pad = ((bw % 4) ? (4 - (bw % 4)) : 0);
641  while (bits > (Uint8 *) surface->pixels) {
642  bits -= surface->pitch;
643  if (SDL_RWwrite(dst, bits, 1, bw) != bw) {
645  break;
646  }
647  if (pad) {
648  const Uint8 padbyte = 0;
649  for (i = 0; i < pad; ++i) {
650  SDL_RWwrite(dst, &padbyte, 1, 1);
651  }
652  }
653  }
654 
655  /* Write the BMP file size */
656  bfSize = (Uint32)(SDL_RWtell(dst) - fp_offset);
657  if (SDL_RWseek(dst, fp_offset + 2, RW_SEEK_SET) < 0) {
659  }
660  SDL_WriteLE32(dst, bfSize);
661  if (SDL_RWseek(dst, fp_offset + bfSize, RW_SEEK_SET) < 0) {
663  }
664 
665  /* Close it up.. */
666  SDL_UnlockSurface(surface);
667  if (surface != saveme) {
668  SDL_FreeSurface(surface);
669  }
670  }
671 
672  if (freedst && dst) {
673  SDL_RWclose(dst);
674  }
675  return ((SDL_strcmp(SDL_GetError(), "") == 0) ? 0 : -1);
676 }
#define BI_RGB
Definition: SDL_bmp.c:44
#define SDL_ClearError
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1565
#define SDL_GetError
#define SDL_UnlockSurface
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2072
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
#define SDL_RWwrite(ctx, ptr, size, n)
Definition: SDL_rwops.h:188
Uint8 BytesPerPixel
Definition: SDL_pixels.h:304
#define SDL_ConvertSurface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
#define SDL_WriteLE16
#define SDL_LIL_ENDIAN
Definition: SDL_endian.h:37
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
#define SDL_Error
#define SDL_RWseek(ctx, offset, whence)
Definition: SDL_rwops.h:185
SDL_bool
Definition: SDL_stdinc.h:126
GLboolean GLboolean g
void * pixels
Definition: SDL_surface.h:75
#define SDL_FreeSurface
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
Uint8 BitsPerPixel
Definition: SDL_pixels.h:303
int32_t Sint32
Definition: SDL_stdinc.h:153
int SDL_InitFormat(SDL_PixelFormat *format, Uint32 pixel_format)
Definition: SDL_pixels.c:521
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
#define NULL
Definition: begin_code.h:143
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_RWclose(ctx)
Definition: SDL_rwops.h:189
#define SDL_SetError
#define SDL_LockSurface
#define SDL_WriteLE32
#define RW_SEEK_SET
Definition: SDL_rwops.h:174
uint16_t Uint16
An unsigned 16-bit integer type.
Definition: SDL_stdinc.h:147
SDL_Palette * palette
Definition: SDL_pixels.h:302
#define SDL_strcmp
int64_t Sint64
A signed 64-bit integer type.
Definition: SDL_stdinc.h:162
static int colors[7]
Definition: testgesture.c:40
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean GLboolean b
#define SDL_RWtell(ctx)
Definition: SDL_rwops.h:186
#define SDL_BYTEORDER
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().

471 {
472  SDL_Rect full_rect;
473 
474  /* Don't do anything if there's no surface to act on */
475  if (!surface) {
476  return SDL_FALSE;
477  }
478 
479  /* Set up the full surface rectangle */
480  full_rect.x = 0;
481  full_rect.y = 0;
482  full_rect.w = surface->w;
483  full_rect.h = surface->h;
484 
485  /* Set the clipping rectangle */
486  if (!rect) {
487  surface->clip_rect = full_rect;
488  return SDL_TRUE;
489  }
490  return SDL_IntersectRect(rect, &full_rect, &surface->clip_rect);
491 }
#define SDL_IntersectRect
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
SDL_Rect clip_rect
Definition: SDL_surface.h:85
int h
Definition: SDL_rect.h:67
int y
Definition: SDL_rect.h:66
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
surfaceThe surface to update
flagNon-zero to enable colorkey and 0 to disable colorkey
keyThe 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().

191 {
192  int flags;
193 
194  if (!surface) {
195  return SDL_InvalidParamError("surface");
196  }
197 
198  if (surface->format->palette && key >= ((Uint32) surface->format->palette->ncolors)) {
199  return SDL_InvalidParamError("key");
200  }
201 
202  if (flag & SDL_RLEACCEL) {
203  SDL_SetSurfaceRLE(surface, 1);
204  }
205 
206  flags = surface->map->info.flags;
207  if (flag) {
208  surface->map->info.flags |= SDL_COPY_COLORKEY;
209  surface->map->info.colorkey = key;
210  if (surface->format->palette) {
211  surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_TRANSPARENT;
212  ++surface->format->palette->version;
213  if (!surface->format->palette->version) {
214  surface->format->palette->version = 1;
215  }
216  }
217  } else {
218  if (surface->format->palette) {
219  surface->format->palette->colors[surface->map->info.colorkey].a = SDL_ALPHA_OPAQUE;
220  ++surface->format->palette->version;
221  if (!surface->format->palette->version) {
222  surface->format->palette->version = 1;
223  }
224  }
225  surface->map->info.flags &= ~SDL_COPY_COLORKEY;
226  }
227  if (surface->map->info.flags != flags) {
228  SDL_InvalidateMap(surface->map);
229  }
230 
231  return 0;
232 }
Uint32 version
Definition: SDL_pixels.h:292
#define SDL_COPY_COLORKEY
Definition: SDL_blit.h:39
int SDL_SetSurfaceRLE(SDL_Surface *surface, int flag)
Sets the RLE acceleration hint for a surface.
Definition: SDL_surface.c:169
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
Uint32 colorkey
Definition: SDL_blit.h:69
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
#define SDL_ALPHA_TRANSPARENT
Definition: SDL_pixels.h:46
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
Uint8 a
Definition: SDL_pixels.h:284
SDL_Color * colors
Definition: SDL_pixels.h:291
SDL_PixelFormat * format
Definition: SDL_surface.h:72
GLbitfield flags
SDL_Palette * palette
Definition: SDL_pixels.h:302
#define SDL_ALPHA_OPAQUE
Definition: SDL_pixels.h:45
SDL_BlitInfo info
Definition: SDL_blit.h:91
#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
surfaceThe surface to update.
alphaThe 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().

369 {
370  int flags;
371 
372  if (!surface) {
373  return -1;
374  }
375 
376  surface->map->info.a = alpha;
377 
378  flags = surface->map->info.flags;
379  if (alpha != 0xFF) {
380  surface->map->info.flags |= SDL_COPY_MODULATE_ALPHA;
381  } else {
382  surface->map->info.flags &= ~SDL_COPY_MODULATE_ALPHA;
383  }
384  if (surface->map->info.flags != flags) {
385  SDL_InvalidateMap(surface->map);
386  }
387  return 0;
388 }
GLfloat GLfloat GLfloat alpha
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
#define SDL_COPY_MODULATE_ALPHA
Definition: SDL_blit.h:35
GLbitfield flags
SDL_BlitInfo info
Definition: SDL_blit.h:91
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
surfaceThe surface to update.
blendModeSDL_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().

405 {
406  int flags, status;
407 
408  if (!surface) {
409  return -1;
410  }
411 
412  status = 0;
413  flags = surface->map->info.flags;
414  surface->map->info.flags &=
416  switch (blendMode) {
417  case SDL_BLENDMODE_NONE:
418  break;
419  case SDL_BLENDMODE_BLEND:
420  surface->map->info.flags |= SDL_COPY_BLEND;
421  break;
422  case SDL_BLENDMODE_ADD:
423  surface->map->info.flags |= SDL_COPY_ADD;
424  break;
425  case SDL_BLENDMODE_MOD:
426  surface->map->info.flags |= SDL_COPY_MOD;
427  break;
428  default:
429  status = SDL_Unsupported();
430  break;
431  }
432 
433  if (surface->map->info.flags != flags) {
434  SDL_InvalidateMap(surface->map);
435  }
436 
437  return status;
438 }
#define SDL_COPY_MOD
Definition: SDL_blit.h:38
#define SDL_COPY_ADD
Definition: SDL_blit.h:37
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
GLbitfield flags
#define SDL_Unsupported()
Definition: SDL_error.h:53
#define SDL_COPY_BLEND
Definition: SDL_blit.h:36
SDL_BlitInfo info
Definition: SDL_blit.h:91
int SDL_SetSurfaceColorMod ( SDL_Surface surface,
Uint8  r,
Uint8  g,
Uint8  b 
)

Set an additional color value used in blit operations.

Parameters
surfaceThe surface to update.
rThe red color value multiplied into blit operations.
gThe green color value multiplied into blit operations.
bThe 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().

324 {
325  int flags;
326 
327  if (!surface) {
328  return -1;
329  }
330 
331  surface->map->info.r = r;
332  surface->map->info.g = g;
333  surface->map->info.b = b;
334 
335  flags = surface->map->info.flags;
336  if (r != 0xFF || g != 0xFF || b != 0xFF) {
337  surface->map->info.flags |= SDL_COPY_MODULATE_COLOR;
338  } else {
339  surface->map->info.flags &= ~SDL_COPY_MODULATE_COLOR;
340  }
341  if (surface->map->info.flags != flags) {
342  SDL_InvalidateMap(surface->map);
343  }
344  return 0;
345 }
Uint8 r
Definition: SDL_blit.h:70
#define SDL_COPY_MODULATE_COLOR
Definition: SDL_blit.h:34
Uint8 b
Definition: SDL_blit.h:70
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2072
Uint8 g
Definition: SDL_blit.h:70
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
GLboolean GLboolean g
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
GLbitfield flags
GLboolean GLboolean GLboolean b
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().

156 {
157  if (!surface) {
158  return SDL_SetError("SDL_SetSurfacePalette() passed a NULL surface");
159  }
160  if (SDL_SetPixelFormatPalette(surface->format, palette) < 0) {
161  return -1;
162  }
163  SDL_InvalidateMap(surface->map);
164 
165  return 0;
166 }
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_SetError
#define SDL_SetPixelFormatPalette
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().

170 {
171  int flags;
172 
173  if (!surface) {
174  return -1;
175  }
176 
177  flags = surface->map->info.flags;
178  if (flag) {
179  surface->map->info.flags |= SDL_COPY_RLE_DESIRED;
180  } else {
181  surface->map->info.flags &= ~SDL_COPY_RLE_DESIRED;
182  }
183  if (surface->map->info.flags != flags) {
184  SDL_InvalidateMap(surface->map);
185  }
186  return 0;
187 }
#define SDL_COPY_RLE_DESIRED
Definition: SDL_blit.h:41
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
GLbitfield flags
SDL_BlitInfo info
Definition: SDL_blit.h:91
int SDL_SoftStretch ( SDL_Surface src,
const SDL_Rect srcrect,
SDL_Surface dst,
const SDL_Rect dstrect 
)

Perform a fast, low quality, stretch blit between two surfaces of the same pixel format.

Note
This function uses a static buffer, and is not thread-safe.

Definition at line 203 of file SDL_stretch.c.

References SDL_PixelFormat::BytesPerPixel, copy_row3(), SDL_Surface::format, SDL_PixelFormat::format, SDL_Rect::h, SDL_Surface::h, NULL, SDL_Surface::pitch, SDL_Surface::pixels, pop, SDL_FALSE, SDL_LockSurface, SDL_MUSTLOCK, SDL_SetError, SDL_TRUE, SDL_UnlockSurface, SDL_Rect::w, SDL_Surface::w, SDL_Rect::x, and SDL_Rect::y.

205 {
206  int src_locked;
207  int dst_locked;
208  int pos, inc;
209  int dst_maxrow;
210  int src_row, dst_row;
211  Uint8 *srcp = NULL;
212  Uint8 *dstp;
213  SDL_Rect full_src;
214  SDL_Rect full_dst;
215 #ifdef USE_ASM_STRETCH
216  SDL_bool use_asm = SDL_TRUE;
217 #ifdef __GNUC__
218  int u1, u2;
219 #endif
220 #endif /* USE_ASM_STRETCH */
221  const int bpp = dst->format->BytesPerPixel;
222 
223  if (src->format->format != dst->format->format) {
224  return SDL_SetError("Only works with same format surfaces");
225  }
226 
227  /* Verify the blit rectangles */
228  if (srcrect) {
229  if ((srcrect->x < 0) || (srcrect->y < 0) ||
230  ((srcrect->x + srcrect->w) > src->w) ||
231  ((srcrect->y + srcrect->h) > src->h)) {
232  return SDL_SetError("Invalid source blit rectangle");
233  }
234  } else {
235  full_src.x = 0;
236  full_src.y = 0;
237  full_src.w = src->w;
238  full_src.h = src->h;
239  srcrect = &full_src;
240  }
241  if (dstrect) {
242  if ((dstrect->x < 0) || (dstrect->y < 0) ||
243  ((dstrect->x + dstrect->w) > dst->w) ||
244  ((dstrect->y + dstrect->h) > dst->h)) {
245  return SDL_SetError("Invalid destination blit rectangle");
246  }
247  } else {
248  full_dst.x = 0;
249  full_dst.y = 0;
250  full_dst.w = dst->w;
251  full_dst.h = dst->h;
252  dstrect = &full_dst;
253  }
254 
255  /* Lock the destination if it's in hardware */
256  dst_locked = 0;
257  if (SDL_MUSTLOCK(dst)) {
258  if (SDL_LockSurface(dst) < 0) {
259  return SDL_SetError("Unable to lock destination surface");
260  }
261  dst_locked = 1;
262  }
263  /* Lock the source if it's in hardware */
264  src_locked = 0;
265  if (SDL_MUSTLOCK(src)) {
266  if (SDL_LockSurface(src) < 0) {
267  if (dst_locked) {
268  SDL_UnlockSurface(dst);
269  }
270  return SDL_SetError("Unable to lock source surface");
271  }
272  src_locked = 1;
273  }
274 
275  /* Set up the data... */
276  pos = 0x10000;
277  inc = (srcrect->h << 16) / dstrect->h;
278  src_row = srcrect->y;
279  dst_row = dstrect->y;
280 
281 #ifdef USE_ASM_STRETCH
282  /* Write the opcodes for this stretch */
283  if ((bpp == 3) || (generate_rowbytes(srcrect->w, dstrect->w, bpp) < 0)) {
284  use_asm = SDL_FALSE;
285  }
286 #endif
287 
288  /* Perform the stretch blit */
289  for (dst_maxrow = dst_row + dstrect->h; dst_row < dst_maxrow; ++dst_row) {
290  dstp = (Uint8 *) dst->pixels + (dst_row * dst->pitch)
291  + (dstrect->x * bpp);
292  while (pos >= 0x10000L) {
293  srcp = (Uint8 *) src->pixels + (src_row * src->pitch)
294  + (srcrect->x * bpp);
295  ++src_row;
296  pos -= 0x10000L;
297  }
298 #ifdef USE_ASM_STRETCH
299  if (use_asm) {
300 #ifdef __GNUC__
301  __asm__ __volatile__("call *%4":"=&D"(u1), "=&S"(u2)
302  :"0"(dstp), "1"(srcp), "r"(copy_row)
303  :"memory");
304 #elif defined(_MSC_VER) || defined(__WATCOMC__)
305  /* *INDENT-OFF* */
306  {
307  void *code = copy_row;
308  __asm {
309  push edi
310  push esi
311  mov edi, dstp
312  mov esi, srcp
313  call dword ptr code
314  pop esi
315  pop edi
316  }
317  }
318  /* *INDENT-ON* */
319 #else
320 #error Need inline assembly for this compiler
321 #endif
322  } else
323 #endif
324  switch (bpp) {
325  case 1:
326  copy_row1(srcp, srcrect->w, dstp, dstrect->w);
327  break;
328  case 2:
329  copy_row2((Uint16 *) srcp, srcrect->w,
330  (Uint16 *) dstp, dstrect->w);
331  break;
332  case 3:
333  copy_row3(srcp, srcrect->w, dstp, dstrect->w);
334  break;
335  case 4:
336  copy_row4((Uint32 *) srcp, srcrect->w,
337  (Uint32 *) dstp, dstrect->w);
338  break;
339  }
340  pos += inc;
341  }
342 
343  /* We need to unlock the surfaces if they're locked */
344  if (dst_locked) {
345  SDL_UnlockSurface(dst);
346  }
347  if (src_locked) {
348  SDL_UnlockSurface(src);
349  }
350  return (0);
351 }
#define SDL_UnlockSurface
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:157
Uint8 BytesPerPixel
Definition: SDL_pixels.h:304
GLfixed u1
static void copy_row3(Uint8 *src, int src_w, Uint8 *dst, int dst_w)
Definition: SDL_stretch.c:177
SDL_bool
Definition: SDL_stdinc.h:126
GLfixed GLfixed u2
void * pixels
Definition: SDL_surface.h:75
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
#define pop
Definition: SDL_qsort.c:130
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
#define NULL
Definition: begin_code.h:143
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_SetError
#define SDL_LockSurface
#define SDL_MUSTLOCK(S)
Definition: SDL_surface.h:61
int h
Definition: SDL_rect.h:67
uint16_t Uint16
An unsigned 16-bit integer type.
Definition: SDL_stdinc.h:147
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64
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().

838 {
839  /* Only perform an unlock if we are locked */
840  if (!surface->locked || (--surface->locked > 0)) {
841  return;
842  }
843 
844  /* Update RLE encoded surface with new data */
845  if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) {
846  surface->flags &= ~SDL_RLEACCEL; /* stop lying */
847  SDL_RLESurface(surface);
848  }
849 }
Uint32 flags
Definition: SDL_surface.h:71
int SDL_RLESurface(SDL_Surface *surface)
#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.

538 {
539  SDL_Rect fulldst;
540  int srcx, srcy, w, h;
541 
542  /* Make sure the surfaces aren't locked */
543  if (!src || !dst) {
544  return SDL_SetError("SDL_UpperBlit: passed a NULL surface");
545  }
546  if (src->locked || dst->locked) {
547  return SDL_SetError("Surfaces must not be locked during blit");
548  }
549 
550  /* If the destination rectangle is NULL, use the entire dest surface */
551  if (dstrect == NULL) {
552  fulldst.x = fulldst.y = 0;
553  fulldst.w = dst->w;
554  fulldst.h = dst->h;
555  dstrect = &fulldst;
556  }
557 
558  /* clip the source rectangle to the source surface */
559  if (srcrect) {
560  int maxw, maxh;
561 
562  srcx = srcrect->x;
563  w = srcrect->w;
564  if (srcx < 0) {
565  w += srcx;
566  dstrect->x -= srcx;
567  srcx = 0;
568  }
569  maxw = src->w - srcx;
570  if (maxw < w)
571  w = maxw;
572 
573  srcy = srcrect->y;
574  h = srcrect->h;
575  if (srcy < 0) {
576  h += srcy;
577  dstrect->y -= srcy;
578  srcy = 0;
579  }
580  maxh = src->h - srcy;
581  if (maxh < h)
582  h = maxh;
583 
584  } else {
585  srcx = srcy = 0;
586  w = src->w;
587  h = src->h;
588  }
589 
590  /* clip the destination rectangle against the clip rectangle */
591  {
592  SDL_Rect *clip = &dst->clip_rect;
593  int dx, dy;
594 
595  dx = clip->x - dstrect->x;
596  if (dx > 0) {
597  w -= dx;
598  dstrect->x += dx;
599  srcx += dx;
600  }
601  dx = dstrect->x + w - clip->x - clip->w;
602  if (dx > 0)
603  w -= dx;
604 
605  dy = clip->y - dstrect->y;
606  if (dy > 0) {
607  h -= dy;
608  dstrect->y += dy;
609  srcy += dy;
610  }
611  dy = dstrect->y + h - clip->y - clip->h;
612  if (dy > 0)
613  h -= dy;
614  }
615 
616  /* Switch back to a fast blit if we were previously stretching */
617  if (src->map->info.flags & SDL_COPY_NEAREST) {
618  src->map->info.flags &= ~SDL_COPY_NEAREST;
619  SDL_InvalidateMap(src->map);
620  }
621 
622  if (w > 0 && h > 0) {
623  SDL_Rect sr;
624  sr.x = srcx;
625  sr.y = srcy;
626  sr.w = dstrect->w = w;
627  sr.h = dstrect->h = h;
628  return SDL_LowerBlit(src, &sr, dst, dstrect);
629  }
630  dstrect->w = dstrect->h = 0;
631  return 0;
632 }
int SDL_LowerBlit(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:513
void SDL_InvalidateMap(SDL_BlitMap *map)
Definition: SDL_pixels.c:974
#define SDL_COPY_NEAREST
Definition: SDL_blit.h:40
struct SDL_BlitMap * map
Definition: SDL_surface.h:88
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
SDL_Rect clip_rect
Definition: SDL_surface.h:85
#define NULL
Definition: begin_code.h:143
#define SDL_SetError
int h
Definition: SDL_rect.h:67
GLubyte GLubyte GLubyte GLubyte w
int y
Definition: SDL_rect.h:66
GLfloat GLfloat GLfloat GLfloat h
SDL_BlitInfo info
Definition: SDL_blit.h:91
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.

637 {
638  double src_x0, src_y0, src_x1, src_y1;
639  double dst_x0, dst_y0, dst_x1, dst_y1;
640  SDL_Rect final_src, final_dst;
641  double scaling_w, scaling_h;
642  int src_w, src_h;
643  int dst_w, dst_h;
644 
645  /* Make sure the surfaces aren't locked */
646  if (!src || !dst) {
647  return SDL_SetError("SDL_UpperBlitScaled: passed a NULL surface");
648  }
649  if (src->locked || dst->locked) {
650  return SDL_SetError("Surfaces must not be locked during blit");
651  }
652 
653  if (NULL == srcrect) {
654  src_w = src->w;
655  src_h = src->h;
656  } else {
657  src_w = srcrect->w;
658  src_h = srcrect->h;
659  }
660 
661  if (NULL == dstrect) {
662  dst_w = dst->w;
663  dst_h = dst->h;
664  } else {
665  dst_w = dstrect->w;
666  dst_h = dstrect->h;
667  }
668 
669  if (dst_w == src_w && dst_h == src_h) {
670  /* No scaling, defer to regular blit */
671  return SDL_BlitSurface(src, srcrect, dst, dstrect);
672  }
673 
674  scaling_w = (double)dst_w / src_w;
675  scaling_h = (double)dst_h / src_h;
676 
677  if (NULL == dstrect) {
678  dst_x0 = 0;
679  dst_y0 = 0;
680  dst_x1 = dst_w - 1;
681  dst_y1 = dst_h - 1;
682  } else {
683  dst_x0 = dstrect->x;
684  dst_y0 = dstrect->y;
685  dst_x1 = dst_x0 + dst_w - 1;
686  dst_y1 = dst_y0 + dst_h - 1;
687  }
688 
689  if (NULL == srcrect) {
690  src_x0 = 0;
691  src_y0 = 0;
692  src_x1 = src_w - 1;
693  src_y1 = src_h - 1;
694  } else {
695  src_x0 = srcrect->x;
696  src_y0 = srcrect->y;
697  src_x1 = src_x0 + src_w - 1;
698  src_y1 = src_y0 + src_h - 1;
699 
700  /* Clip source rectangle to the source surface */
701 
702  if (src_x0 < 0) {
703  dst_x0 -= src_x0 * scaling_w;
704  src_x0 = 0;
705  }
706 
707  if (src_x1 >= src->w) {
708  dst_x1 -= (src_x1 - src->w + 1) * scaling_w;
709  src_x1 = src->w - 1;
710  }
711 
712  if (src_y0 < 0) {
713  dst_y0 -= src_y0 * scaling_h;
714  src_y0 = 0;
715  }
716 
717  if (src_y1 >= src->h) {
718  dst_y1 -= (src_y1 - src->h + 1) * scaling_h;
719  src_y1 = src->h - 1;
720  }
721  }
722 
723  /* Clip destination rectangle to the clip rectangle */
724 
725  /* Translate to clip space for easier calculations */
726  dst_x0 -= dst->clip_rect.x;
727  dst_x1 -= dst->clip_rect.x;
728  dst_y0 -= dst->clip_rect.y;
729  dst_y1 -= dst->clip_rect.y;
730 
731  if (dst_x0 < 0) {
732  src_x0 -= dst_x0 / scaling_w;
733  dst_x0 = 0;
734  }
735 
736  if (dst_x1 >= dst->clip_rect.w) {
737  src_x1 -= (dst_x1 - dst->clip_rect.w + 1) / scaling_w;
738  dst_x1 = dst->clip_rect.w - 1;
739  }
740 
741  if (dst_y0 < 0) {
742  src_y0 -= dst_y0 / scaling_h;
743  dst_y0 = 0;
744  }
745 
746  if (dst_y1 >= dst->clip_rect.h) {
747  src_y1 -= (dst_y1 - dst->clip_rect.h + 1) / scaling_h;
748  dst_y1 = dst->clip_rect.h - 1;
749  }
750 
751  /* Translate back to surface coordinates */
752  dst_x0 += dst->clip_rect.x;
753  dst_x1 += dst->clip_rect.x;
754  dst_y0 += dst->clip_rect.y;
755  dst_y1 += dst->clip_rect.y;
756 
757  final_src.x = (int)SDL_floor(src_x0 + 0.5);
758  final_src.y = (int)SDL_floor(src_y0 + 0.5);
759  final_src.w = (int)SDL_floor(src_x1 - src_x0 + 1.5);
760  final_src.h = (int)SDL_floor(src_y1 - src_y0 + 1.5);
761 
762  final_dst.x = (int)SDL_floor(dst_x0 + 0.5);
763  final_dst.y = (int)SDL_floor(dst_y0 + 0.5);
764  final_dst.w = (int)SDL_floor(dst_x1 - dst_x0 + 1.5);
765  final_dst.h = (int)SDL_floor(dst_y1 - dst_y0 + 1.5);
766 
767  if (final_dst.w < 0)
768  final_dst.w = 0;
769  if (final_dst.h < 0)
770  final_dst.h = 0;
771 
772  if (dstrect)
773  *dstrect = final_dst;
774 
775  if (final_dst.w == 0 || final_dst.h == 0 ||
776  final_src.w <= 0 || final_src.h <= 0) {
777  /* No-op. */
778  return 0;
779  }
780 
781  return SDL_LowerBlitScaled(src, &final_src, dst, &final_dst);
782 }
#define SDL_BlitSurface
Definition: SDL_surface.h:447
#define SDL_floor
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
SDL_Rect clip_rect
Definition: SDL_surface.h:85
#define NULL
Definition: begin_code.h:143
#define SDL_SetError
int h
Definition: SDL_rect.h:67
int SDL_LowerBlitScaled(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect)
Definition: SDL_surface.c:789
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64