Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Added source color and alpha modulation support.
Browse files Browse the repository at this point in the history
Added perl script to generate optimized render copy functions.
  • Loading branch information
slouken committed Aug 28, 2006
1 parent 7369e2e commit 14a914a
Show file tree
Hide file tree
Showing 25 changed files with 6,941 additions and 291 deletions.
26 changes: 13 additions & 13 deletions include/SDL_audio.h
Expand Up @@ -132,22 +132,22 @@ typedef struct SDL_AudioSpec


/* A structure to hold a set of audio conversion filters and buffers */ /* A structure to hold a set of audio conversion filters and buffers */
struct SDL_AudioCVT; struct SDL_AudioCVT;
typedef void (SDLCALL * SDL_AudioFilter)(struct SDL_AudioCVT *cvt, typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt,
SDL_AudioFormat format); SDL_AudioFormat format);


typedef struct SDL_AudioCVT typedef struct SDL_AudioCVT
{ {
int needed; /* Set to 1 if conversion possible */ int needed; /* Set to 1 if conversion possible */
SDL_AudioFormat src_format; /* Source audio format */ SDL_AudioFormat src_format; /* Source audio format */
SDL_AudioFormat dst_format; /* Target audio format */ SDL_AudioFormat dst_format; /* Target audio format */
double rate_incr; /* Rate conversion increment */ double rate_incr; /* Rate conversion increment */
Uint8 *buf; /* Buffer to hold entire audio data */ Uint8 *buf; /* Buffer to hold entire audio data */
int len; /* Length of original audio buffer */ int len; /* Length of original audio buffer */
int len_cvt; /* Length of converted audio buffer */ int len_cvt; /* Length of converted audio buffer */
int len_mult; /* buffer must be len*len_mult big */ int len_mult; /* buffer must be len*len_mult big */
double len_ratio; /* Given len, final size is len*len_ratio */ double len_ratio; /* Given len, final size is len*len_ratio */
SDL_AudioFilter filters[10]; /* Filter list */ SDL_AudioFilter filters[10]; /* Filter list */
int filter_index; /* Current audio conversion function */ int filter_index; /* Current audio conversion function */
} SDL_AudioCVT; } SDL_AudioCVT;




Expand Down
6 changes: 5 additions & 1 deletion include/SDL_endian.h
Expand Up @@ -195,7 +195,11 @@ SDL_Swap64(Uint64 x)
static __inline__ float static __inline__ float
SDL_SwapFloat(float x) SDL_SwapFloat(float x)
{ {
union { float f; Uint32 ui32; } swapper; union
{
float f;
Uint32 ui32;
} swapper;
swapper.f = x; swapper.f = x;
swapper.ui32 = SDL_Swap32(swapper.ui32); swapper.ui32 = SDL_Swap32(swapper.ui32);
return swapper.f; return swapper.f;
Expand Down
178 changes: 161 additions & 17 deletions include/SDL_video.h
Expand Up @@ -176,7 +176,7 @@ typedef enum
SDL_RENDERER_PRESENTFLIP3 = 0x00000008, /**< Present uses a flip, rotating between two back buffers and a front buffer */ SDL_RENDERER_PRESENTFLIP3 = 0x00000008, /**< Present uses a flip, rotating between two back buffers and a front buffer */
SDL_RENDERER_PRESENTDISCARD = 0x00000010, /**< Present leaves the contents of the backbuffer undefined */ SDL_RENDERER_PRESENTDISCARD = 0x00000010, /**< Present leaves the contents of the backbuffer undefined */
SDL_RENDERER_PRESENTVSYNC = 0x00000020, /**< Present is synchronized with the refresh rate */ SDL_RENDERER_PRESENTVSYNC = 0x00000020, /**< Present is synchronized with the refresh rate */
SDL_RENDERER_ACCELERATED = 0x00000040, /**< The renderer uses hardware acceleration */ SDL_RENDERER_ACCELERATED = 0x0000040, /**< The renderer uses hardware acceleration */
} SDL_RendererFlags; } SDL_RendererFlags;


/** /**
Expand All @@ -188,6 +188,7 @@ typedef struct SDL_RendererInfo
{ {
const char *name; /**< The name of the renderer */ const char *name; /**< The name of the renderer */
Uint32 flags; /**< Supported SDL_RendererFlags */ Uint32 flags; /**< Supported SDL_RendererFlags */
Uint32 mod_modes; /**< A mask of supported channel modulation */
Uint32 blend_modes; /**< A mask of supported blend modes */ Uint32 blend_modes; /**< A mask of supported blend modes */
Uint32 scale_modes; /**< A mask of supported scale modes */ Uint32 scale_modes; /**< A mask of supported scale modes */
Uint32 num_texture_formats; /**< The number of available texture formats */ Uint32 num_texture_formats; /**< The number of available texture formats */
Expand All @@ -207,10 +208,22 @@ typedef enum
SDL_TEXTUREACCESS_REMOTE, /**< Unlockable video memory */ SDL_TEXTUREACCESS_REMOTE, /**< Unlockable video memory */
} SDL_TextureAccess; } SDL_TextureAccess;


/**
* \enum SDL_TextureModulate
*
* \brief The texture channel modulation used in SDL_RenderCopy()
*/
typedef enum
{
SDL_TEXTUREMODULATE_NONE = 0x00000000, /**< No modulation */
SDL_TEXTUREMODULATE_COLOR = 0x00000001, /**< srcC = srcC * color */
SDL_TEXTUREMODULATE_ALPHA = 0x00000002, /**< srcA = srcA * alpha */
} SDL_TextureModulate;

/** /**
* \enum SDL_TextureBlendMode * \enum SDL_TextureBlendMode
* *
* \brief The blend mode used in SDL_RenderCopy() * \brief The texture blend mode used in SDL_RenderCopy()
*/ */
typedef enum typedef enum
{ {
Expand All @@ -224,7 +237,7 @@ typedef enum
/** /**
* \enum SDL_TextureScaleMode * \enum SDL_TextureScaleMode
* *
* \brief The scale mode used in SDL_RenderCopy() * \brief The texture scale mode used in SDL_RenderCopy()
*/ */
typedef enum typedef enum
{ {
Expand Down Expand Up @@ -272,12 +285,15 @@ typedef struct SDL_Surface
int pitch; /* Read-only */ int pitch; /* Read-only */
void *pixels; /* Read-write */ void *pixels; /* Read-write */


/* Application data associated with the surfade */
void *userdata; /* Read-write */

/* texture associated with the surface, if any */ /* texture associated with the surface, if any */
SDL_TextureID textureID; SDL_TextureID textureID; /* Read-only */


/* information needed for surfaces requiring locks */ /* information needed for surfaces requiring locks */
int locked; int locked; /* Read-only */
void *lock_data; void *lock_data; /* Read-only */


/* clipping information */ /* clipping information */
SDL_Rect clip_rect; /* Read-only */ SDL_Rect clip_rect; /* Read-only */
Expand Down Expand Up @@ -997,6 +1013,136 @@ extern DECLSPEC int SDLCALL SDL_GetTexturePalette(SDL_TextureID textureID,
int firstcolor, int firstcolor,
int ncolors); int ncolors);


/**
* \fn int SDL_SetTextureColorMod(SDL_TextureID textureID, Uint8 r, Uint8 g, Uint8 b)
*
* \brief Set an additional color value used in render copy operations
*
* \param texture The texture to update
* \param r The red source color value multiplied into copy operations
* \param g The green source color value multiplied into copy operations
* \param b The blue source color value multiplied into copy operations
*
* \return 0 on success, or -1 if the texture is not valid or color modulation is not supported
*
* \sa SDL_GetTextureColorMod()
*/
extern DECLSPEC int SDLCALL SDL_SetTextureColorMod(SDL_TextureID textureID,
Uint8 r, Uint8 g, Uint8 b);


/**
* \fn int SDL_GetTextureColorMod(SDL_TextureID textureID, Uint8 *r, Uint8 *g, Uint8 *b)
*
* \brief Get the additional color value used in render copy operations
*
* \param texture The texture to query
* \param r A pointer filled in with the source red color value
* \param g A pointer filled in with the source green color value
* \param b A pointer filled in with the source blue color value
*
* \return 0 on success, or -1 if the texture is not valid
*
* \sa SDL_SetTextureColorMod()
*/
extern DECLSPEC int SDLCALL SDL_GetTextureColorMod(SDL_TextureID textureID,
Uint8 * r, Uint8 * g,
Uint8 * b);

/**
* \fn int SDL_SetTextureAlphaMod(SDL_TextureID textureID, Uint8 alpha)
*
* \brief Set an additional alpha value used in render copy operations
*
* \param texture The texture to update
* \param alpha The source alpha value multiplied into copy operations.
*
* \return 0 on success, or -1 if the texture is not valid or alpha modulation is not supported
*
* \sa SDL_GetTextureAlphaMod()
*/
extern DECLSPEC int SDLCALL SDL_SetTextureAlphaMod(SDL_TextureID textureID,
Uint8 alpha);

/**
* \fn int SDL_GetTextureAlphaMod(SDL_TextureID textureID, Uint8 *alpha)
*
* \brief Get the additional alpha value used in render copy operations
*
* \param texture The texture to query
* \param alpha A pointer filled in with the source alpha value
*
* \return 0 on success, or -1 if the texture is not valid
*
* \sa SDL_SetTextureAlphaMod()
*/
extern DECLSPEC int SDLCALL SDL_GetTextureAlphaMod(SDL_TextureID textureID,
Uint8 * alpha);

/**
* \fn int SDL_SetTextureBlendMode(SDL_TextureID textureID, int blendMode)
*
* \brief Set the blend mode used for texture copy operations
*
* \param texture The texture to update
* \param blendMode SDL_TextureBlendMode to use for texture blending
*
* \return 0 on success, or -1 if the texture is not valid or the blend mode is not supported
*
* \note If the blend mode is not supported, the closest supported mode is chosen.
*
* \sa SDL_GetTextureBlendMode()
*/
extern DECLSPEC int SDLCALL SDL_SetTextureBlendMode(SDL_TextureID textureID,
int blendMode);

/**
* \fn int SDL_GetTextureBlendMode(SDL_TextureID textureID, int *blendMode)
*
* \brief Get the blend mode used for texture copy operations
*
* \param texture The texture to query
* \param blendMode A pointer filled in with the current blend mode
*
* \return 0 on success, or -1 if the texture is not valid
*
* \sa SDL_SetTextureBlendMode()
*/
extern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_TextureID textureID,
int *blendMode);

/**
* \fn int SDL_SetTextureScaleMode(SDL_TextureID textureID, int scaleMode)
*
* \brief Set the scale mode used for texture copy operations
*
* \param texture The texture to update
* \param scaleMode SDL_TextureScaleMode to use for texture scaling
*
* \return 0 on success, or -1 if the texture is not valid or the scale mode is not supported
*
* \note If the scale mode is not supported, the closest supported mode is chosen.
*
* \sa SDL_GetTextureScaleMode()
*/
extern DECLSPEC int SDLCALL SDL_SetTextureScaleMode(SDL_TextureID textureID,
int scaleMode);

/**
* \fn int SDL_GetTextureScaleMode(SDL_TextureID textureID, int *scaleMode)
*
* \brief Get the scale mode used for texture copy operations
*
* \param texture The texture to query
* \param scaleMode A pointer filled in with the current scale mode
*
* \return 0 on success, or -1 if the texture is not valid
*
* \sa SDL_SetTextureScaleMode()
*/
extern DECLSPEC int SDLCALL SDL_GetTextureScaleMode(SDL_TextureID textureID,
int *scaleMode);

/** /**
* \fn int SDL_UpdateTexture(SDL_TextureID textureID, const SDL_Rect *rect, const void *pixels, int pitch) * \fn int SDL_UpdateTexture(SDL_TextureID textureID, const SDL_Rect *rect, const void *pixels, int pitch)
* *
Expand Down Expand Up @@ -1061,37 +1207,35 @@ extern DECLSPEC void SDLCALL SDL_DirtyTexture(SDL_TextureID textureID,
const SDL_Rect * rects); const SDL_Rect * rects);


/** /**
* \fn void SDL_RenderFill(const SDL_Rect *rect, Uint32 color) * \fn void SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect *rect)
* *
* \brief Fill the current rendering target with the specified color. * \brief Fill the current rendering target with the specified color.
* *
* \param r The red value used to fill the rendering target
* \param g The green value used to fill the rendering target
* \param b The blue value used to fill the rendering target
* \param a The alpha value used to fill the rendering target, usually SDL_ALPHA_OPAQUE (255)
* \param rect A pointer to the destination rectangle, or NULL for the entire rendering target. * \param rect A pointer to the destination rectangle, or NULL for the entire rendering target.
* \param color An ARGB color value.
* *
* \return 0 on success, or -1 if there is no rendering context current * \return 0 on success, or -1 if there is no rendering context current
*/ */
extern DECLSPEC int SDLCALL SDL_RenderFill(const SDL_Rect * rect, extern DECLSPEC int SDLCALL SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a,
Uint32 color); const SDL_Rect * rect);


/** /**
* \fn int SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect *srcrect, const SDL_Rect *dstrect, Uint32 blendMode, Uint32 scaleMode) * \fn int SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect *srcrect, const SDL_Rect *dstrect)
* *
* \brief Copy a portion of the texture to the current rendering target. * \brief Copy a portion of the texture to the current rendering target.
* *
* \param texture The source texture. * \param texture The source texture.
* \param srcrect A pointer to the source rectangle, or NULL for the entire texture. * \param srcrect A pointer to the source rectangle, or NULL for the entire texture.
* \param dstrect A pointer to the destination rectangle, or NULL for the entire rendering target. * \param dstrect A pointer to the destination rectangle, or NULL for the entire rendering target.
* \param blendMode SDL_TextureBlendMode to be used if the source texture has an alpha channel.
* \param scaleMode SDL_TextureScaleMode to be used if the source and destination rectangles don't have the same width and height.
* *
* \return 0 on success, or -1 if there is no rendering context current, or the driver doesn't support the requested operation. * \return 0 on success, or -1 if there is no rendering context current, or the driver doesn't support the requested operation.
*
* \note You can check the video driver info to see what operations are supported.
*/ */
extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_TextureID textureID, extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_TextureID textureID,
const SDL_Rect * srcrect, const SDL_Rect * srcrect,
const SDL_Rect * dstrect, const SDL_Rect * dstrect);
int blendMode, int scaleMode);


/** /**
* \fn int SDL_RenderReadPixels(const SDL_Rect *rect, void *pixels, int pitch) * \fn int SDL_RenderReadPixels(const SDL_Rect *rect, void *pixels, int pitch)
Expand Down
12 changes: 3 additions & 9 deletions src/SDL_compat.c
Expand Up @@ -673,19 +673,15 @@ SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects)
if (screen == SDL_VideoSurface) { if (screen == SDL_VideoSurface) {
if (SDL_VideoRendererInfo.flags & SDL_RENDERER_PRESENTCOPY) { if (SDL_VideoRendererInfo.flags & SDL_RENDERER_PRESENTCOPY) {
for (i = 0; i < numrects; ++i) { for (i = 0; i < numrects; ++i) {
SDL_RenderCopy(SDL_VideoTexture, &rects[i], &rects[i], SDL_RenderCopy(SDL_VideoTexture, &rects[i], &rects[i]);
SDL_TEXTUREBLENDMODE_NONE,
SDL_TEXTURESCALEMODE_NONE);
} }
} else { } else {
SDL_Rect rect; SDL_Rect rect;
rect.x = 0; rect.x = 0;
rect.y = 0; rect.y = 0;
rect.w = screen->w; rect.w = screen->w;
rect.h = screen->h; rect.h = screen->h;
SDL_RenderCopy(SDL_VideoTexture, &rect, &rect, SDL_RenderCopy(SDL_VideoTexture, &rect, &rect);
SDL_TEXTUREBLENDMODE_NONE,
SDL_TEXTURESCALEMODE_NONE);
} }
SDL_RenderPresent(); SDL_RenderPresent();
} }
Expand Down Expand Up @@ -1421,9 +1417,7 @@ SDL_UnlockYUVOverlay(SDL_Overlay * overlay)
int int
SDL_DisplayYUVOverlay(SDL_Overlay * overlay, SDL_Rect * dstrect) SDL_DisplayYUVOverlay(SDL_Overlay * overlay, SDL_Rect * dstrect)
{ {
if (SDL_RenderCopy(overlay->hwdata->textureID, NULL, dstrect, if (SDL_RenderCopy(overlay->hwdata->textureID, NULL, dstrect) < 0) {
SDL_TEXTUREBLENDMODE_NONE,
SDL_TEXTURESCALEMODE_FAST) < 0) {
return -1; return -1;
} }
SDL_RenderPresent(); SDL_RenderPresent();
Expand Down

0 comments on commit 14a914a

Please sign in to comment.