Commit fdafca64 authored by Sam Lantinga's avatar Sam Lantinga

Added source color and alpha modulation support.

Added perl script to generate optimized render copy functions.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402032
parent aebbf8cb
...@@ -132,22 +132,22 @@ typedef struct SDL_AudioSpec ...@@ -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;
......
...@@ -195,7 +195,11 @@ SDL_Swap64(Uint64 x) ...@@ -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;
......
This diff is collapsed.
...@@ -673,9 +673,7 @@ SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects) ...@@ -673,9 +673,7 @@ 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;
...@@ -683,9 +681,7 @@ SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects) ...@@ -683,9 +681,7 @@ SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects)
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();
} }
...@@ -1421,9 +1417,7 @@ SDL_UnlockYUVOverlay(SDL_Overlay * overlay) ...@@ -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();
......
This diff is collapsed.
/* DO NOT EDIT THIS FILE! It is generated code. */ /* DO NOT EDIT! This file is generated by sdlgenaudiocvt.pl */
/* Please modify SDL/src/audio/sdlgenaudiocvt.pl instead. */
/* /*
SDL - Simple DirectMedia Layer SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga Copyright (C) 1997-2006 Sam Lantinga
...@@ -27,7 +25,7 @@ ...@@ -27,7 +25,7 @@
#include "SDL_audio.h" #include "SDL_audio.h"
#include "SDL_audio_c.h" #include "SDL_audio_c.h"
/* Now the generated code... */ /* *INDENT-OFF* */
#define DIVBY127 0.0078740157480315f #define DIVBY127 0.0078740157480315f
#define DIVBY255 0.00392156862745098f #define DIVBY255 0.00392156862745098f
...@@ -2354,3 +2352,6 @@ const SDL_AudioTypeFilters sdl_audio_type_filters[] = ...@@ -2354,3 +2352,6 @@ const SDL_AudioTypeFilters sdl_audio_type_filters[] =
}; };
/* *INDENT-ON* */
/* vi: set ts=4 sw=4 expandtab: */
...@@ -263,8 +263,8 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format, ...@@ -263,8 +263,8 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format,
Uint32 *dst32 = (Uint32 *) dst; Uint32 *dst32 = (Uint32 *) dst;
Sint32 src1, src2; Sint32 src1, src2;
Sint64 dst_sample; Sint64 dst_sample;
const Sint64 max_audioval = ((((Sint64)1) << (32 - 1)) - 1); const Sint64 max_audioval = ((((Sint64) 1) << (32 - 1)) - 1);
const Sint64 min_audioval = -(((Sint64)1) << (32 - 1)); const Sint64 min_audioval = -(((Sint64) 1) << (32 - 1));
len /= 4; len /= 4;
while (len--) { while (len--) {
...@@ -289,8 +289,8 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format, ...@@ -289,8 +289,8 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format,
Uint32 *dst32 = (Uint32 *) dst; Uint32 *dst32 = (Uint32 *) dst;
Sint32 src1, src2; Sint32 src1, src2;
Sint64 dst_sample; Sint64 dst_sample;
const Sint64 max_audioval = ((((Sint64)1) << (32 - 1)) - 1); const Sint64 max_audioval = ((((Sint64) 1) << (32 - 1)) - 1);
const Sint64 min_audioval = -(((Sint64)1) << (32 - 1)); const Sint64 min_audioval = -(((Sint64) 1) << (32 - 1));
len /= 4; len /= 4;
while (len--) { while (len--) {
...@@ -322,7 +322,11 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format, ...@@ -322,7 +322,11 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format,
const double min_audioval = -3.40282347e+38F; const double min_audioval = -3.40282347e+38F;
/* !!! FIXME: this is a little nasty. */ /* !!! FIXME: this is a little nasty. */
union { float f; Uint32 ui32; } cvt; union
{
float f;
Uint32 ui32;
} cvt;
len /= 4; len /= 4;
while (len--) { while (len--) {
...@@ -360,7 +364,11 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format, ...@@ -360,7 +364,11 @@ SDL_MixAudioFormat(Uint8 * dst, const Uint8 * src, SDL_AudioFormat format,
const double min_audioval = -3.40282347e+38F; const double min_audioval = -3.40282347e+38F;
/* !!! FIXME: this is a little nasty. */ /* !!! FIXME: this is a little nasty. */
union { float f; Uint32 ui32; } cvt; union
{
float f;
Uint32 ui32;
} cvt;
len /= 4; len /= 4;
while (len--) { while (len--) {
......
...@@ -23,9 +23,7 @@ my $custom_converters = 0; ...@@ -23,9 +23,7 @@ my $custom_converters = 0;
sub outputHeader { sub outputHeader {
print <<EOF; print <<EOF;
/* DO NOT EDIT THIS FILE! It is generated code. */ /* DO NOT EDIT! This file is generated by sdlgenaudiocvt.pl */
/* Please modify SDL/src/audio/sdlgenaudiocvt.pl instead. */
/* /*
SDL - Simple DirectMedia Layer SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga Copyright (C) 1997-2006 Sam Lantinga
...@@ -52,7 +50,7 @@ sub outputHeader { ...@@ -52,7 +50,7 @@ sub outputHeader {
#include "SDL_audio.h" #include "SDL_audio.h"
#include "SDL_audio_c.h" #include "SDL_audio_c.h"
/* Now the generated code... */ /* *INDENT-OFF* */
EOF EOF
...@@ -66,6 +64,13 @@ EOF ...@@ -66,6 +64,13 @@ EOF
print("\n"); print("\n");
} }
sub outputFooter {
print <<EOF;
/* *INDENT-ON* */
/* vi: set ts=4 sw=4 expandtab: */
EOF
}
sub splittype { sub splittype {
my $t = shift; my $t = shift;
...@@ -307,7 +312,9 @@ print <<EOF; ...@@ -307,7 +312,9 @@ print <<EOF;
EOF EOF
outputFooter();
exit 0; exit 0;
# end of sdlaudiocvt.pl ... # end of sdlgenaudiocvt.pl ...
...@@ -186,4 +186,5 @@ extern "C" ...@@ -186,4 +186,5 @@ extern "C"
#endif #endif
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
...@@ -2108,7 +2108,7 @@ BlitNtoN(SDL_BlitInfo * info) ...@@ -2108,7 +2108,7 @@ BlitNtoN(SDL_BlitInfo * info)
/* *INDENT-OFF* */ /* *INDENT-OFF* */
DUFFS_LOOP( DUFFS_LOOP(
{ {
Uint32 Pixel; Uint32 Pixel;
unsigned sR; unsigned sR;
unsigned sG; unsigned sG;
unsigned sB; unsigned sB;
...@@ -2278,15 +2278,14 @@ BlitNtoNKey(SDL_BlitInfo * info) ...@@ -2278,15 +2278,14 @@ BlitNtoNKey(SDL_BlitInfo * info)
/* *INDENT-OFF* */ /* *INDENT-OFF* */
DUFFS_LOOP( DUFFS_LOOP(
{ {
Uint32 Pixel; Uint32 Pixel;
unsigned sR; unsigned sR;
unsigned sG; unsigned sG;
unsigned sB; unsigned sB;
RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel); RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel);
if ( (Pixel & rgbmask) != ckey ) { if ( (Pixel & rgbmask) != ckey ) {
RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB);
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha);
sR, sG, sB, alpha);
} }
dst += dstbpp; dst += dstbpp;
src += srcbpp; src += srcbpp;
...@@ -2327,11 +2326,9 @@ BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info) ...@@ -2327,11 +2326,9 @@ BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info)
/* *INDENT-OFF* */ /* *INDENT-OFF* */
DUFFS_LOOP( DUFFS_LOOP(
{ {
DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA);
sR, sG, sB, sA);
if ( (Pixel & rgbmask) != ckey ) { if ( (Pixel & rgbmask) != ckey ) {
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA);
sR, sG, sB, sA);
} }
dst += dstbpp; dst += dstbpp;
src += srcbpp; src += srcbpp;
......
...@@ -43,7 +43,7 @@ SDL_PROC_UNUSED(void, glColor4b, (GLbyte, GLbyte, GLbyte, GLbyte)) ...@@ -43,7 +43,7 @@ SDL_PROC_UNUSED(void, glColor4b, (GLbyte, GLbyte, GLbyte, GLbyte))
SDL_PROC_UNUSED(void, glColor4bv, (const GLbyte *)) SDL_PROC_UNUSED(void, glColor4bv, (const GLbyte *))
SDL_PROC_UNUSED(void, glColor4d, (GLdouble, GLdouble, GLdouble, GLdouble)) SDL_PROC_UNUSED(void, glColor4d, (GLdouble, GLdouble, GLdouble, GLdouble))
SDL_PROC_UNUSED(void, glColor4dv, (const GLdouble *)) SDL_PROC_UNUSED(void, glColor4dv, (const GLdouble *))
SDL_PROC_UNUSED(void, glColor4f, (GLfloat, GLfloat, GLfloat, GLfloat)) SDL_PROC(void, glColor4f, (GLfloat, GLfloat, GLfloat, GLfloat))
SDL_PROC_UNUSED(void, glColor4fv, (const GLfloat *)) SDL_PROC_UNUSED(void, glColor4fv, (const GLfloat *))
SDL_PROC_UNUSED(void, glColor4i, (GLint, GLint, GLint, GLint)) SDL_PROC_UNUSED(void, glColor4i, (GLint, GLint, GLint, GLint))
SDL_PROC_UNUSED(void, glColor4iv, (const GLint *)) SDL_PROC_UNUSED(void, glColor4iv, (const GLint *))
......
This diff is collapsed.
/* DO NOT EDIT! This file is generated by sdlgenblit.pl */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/* *INDENT-OFF* */
#define SDL_RENDERCOPY_MODULATE_COLOR 0x0001
#define SDL_RENDERCOPY_MODULATE_ALPHA 0x0002
#define SDL_RENDERCOPY_BLEND 0x0010
#define SDL_RENDERCOPY_ADD 0x0020
#define SDL_RENDERCOPY_MOD 0x0040
#define SDL_RENDERCOPY_NEAREST 0x0100
typedef struct {
void *src;
int src_w, src_h;
int src_pitch;
void *dst;
int dst_w, dst_h;
int dst_pitch;
void *aux_data;
int flags;
Uint8 r, g, b, a;
} SDL_RenderCopyData;
typedef int (*SDL_RenderCopyFunc)(SDL_RenderCopyData *data);
extern SDL_RenderCopyFunc SDLCALL SDL_GetRenderCopyFunc(Uint32 src_format, Uint32 dst_format, int modMode, int blendMode, int scaleMode);
extern int SDLCALL SDL_RenderCopy_RGB888_RGB888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_RGB888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_RGB888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_RGB888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_RGB888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_RGB888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_RGB888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGB888_BGR888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_RGB888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_BGR888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_BGR888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_BGR888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_BGR888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_BGR888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_BGR888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGR888_BGR888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_RGB888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ARGB8888_BGR888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_RGB888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_RGBA8888_BGR888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_RGB888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_ABGR8888_BGR888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_RGB888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888_Blend_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888_Modulate(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888_Modulate_Scale(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888_Modulate_Blend(SDL_RenderCopyData *data);
extern int SDLCALL SDL_RenderCopy_BGRA8888_BGR888_Modulate_Blend_Scale(SDL_RenderCopyData *data);
/* *INDENT-ON* */
/* vi: set ts=4 sw=4 expandtab: */
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
/* OpenGL renderer implementation */ /* OpenGL renderer implementation */
static const float inv255f = 1.0f / 255.0f;
static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags); static SDL_Renderer *GL_CreateRenderer(SDL_Window * window, Uint32 flags);
static int GL_ActivateRenderer(SDL_Renderer * renderer); static int GL_ActivateRenderer(SDL_Renderer * renderer);
static int GL_DisplayModeChanged(SDL_Renderer * renderer); static int GL_DisplayModeChanged(SDL_Renderer * renderer);
...@@ -43,20 +45,27 @@ static int GL_SetTexturePalette(SDL_Renderer * renderer, ...@@ -43,20 +45,27 @@ static int GL_SetTexturePalette(SDL_Renderer * renderer,
static int GL_GetTexturePalette(SDL_Renderer * renderer, static int GL_GetTexturePalette(SDL_Renderer * renderer,
SDL_Texture * texture, SDL_Color * colors, SDL_Texture * texture, SDL_Color * colors,
int firstcolor, int ncolors); int firstcolor, int ncolors);
static int GL_SetTextureColorMod(SDL_Renderer * renderer,
SDL_Texture * texture);
static int GL_SetTextureAlphaMod(SDL_Renderer * renderer,
SDL_Texture * texture);
static int GL_SetTextureBlendMode(SDL_Renderer * renderer,
SDL_Texture * texture);
static int GL_SetTextureScaleMode(SDL_Renderer * renderer,
SDL_Texture * texture);
static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, const SDL_Rect * rect, const void *pixels,
int pitch); int pitch);
static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, int markDirty, const SDL_Rect * rect, int markDirty, void **pixels,
void **pixels, int *pitch); int *pitch);
static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static void GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, static void GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
int numrects, const SDL_Rect * rects); int numrects, const SDL_Rect * rects);
static int GL_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, static int GL_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b,
Uint32 color); Uint8 a, const SDL_Rect * rect);
static int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect, const SDL_Rect * srcrect, const SDL_Rect * dstrect);
int blendMode, int scaleMode);
static void GL_RenderPresent(SDL_Renderer * renderer); static void GL_RenderPresent(SDL_Renderer * renderer);
static void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static void GL_DestroyRenderer(SDL_Renderer * renderer); static void GL_DestroyRenderer(SDL_Renderer * renderer);
...@@ -68,6 +77,8 @@ SDL_RenderDriver GL_RenderDriver = { ...@@ -68,6 +77,8 @@ SDL_RenderDriver GL_RenderDriver = {
"opengl", "opengl",
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTDISCARD | (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTDISCARD |
SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED), SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD |
SDL_TEXTUREBLENDMODE_MOD), SDL_TEXTUREBLENDMODE_MOD),
...@@ -236,6 +247,10 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -236,6 +247,10 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->CreateTexture = GL_CreateTexture; renderer->CreateTexture = GL_CreateTexture;
renderer->SetTexturePalette = GL_SetTexturePalette; renderer->SetTexturePalette = GL_SetTexturePalette;
renderer->GetTexturePalette = GL_GetTexturePalette; renderer->GetTexturePalette = GL_GetTexturePalette;
renderer->SetTextureColorMod = GL_SetTextureColorMod;
renderer->SetTextureAlphaMod = GL_SetTextureAlphaMod;
renderer->SetTextureBlendMode = GL_SetTextureBlendMode;
renderer->SetTextureScaleMode = GL_SetTextureScaleMode;
renderer->UpdateTexture = GL_UpdateTexture; renderer->UpdateTexture = GL_UpdateTexture;
renderer->LockTexture = GL_LockTexture; renderer->LockTexture = GL_LockTexture;
renderer->UnlockTexture = GL_UnlockTexture; renderer->UnlockTexture = GL_UnlockTexture;
...@@ -569,6 +584,54 @@ SetupTextureUpdate(GL_RenderData * renderdata, SDL_Texture * texture, ...@@ -569,6 +584,54 @@ SetupTextureUpdate(GL_RenderData * renderdata, SDL_Texture * texture,
pitch / SDL_BYTESPERPIXEL(texture->format)); pitch / SDL_BYTESPERPIXEL(texture->format));
} }
static int
GL_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture)
{
return -1;
}
static int
GL_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture)
{
return -1;
}
static int
GL_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{
switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND:
case SDL_TEXTUREBLENDMODE_ADD:
case SDL_TEXTUREBLENDMODE_MOD:
return 0;
default:
SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE;
return -1;
}
}
static int
GL_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
{
switch (texture->scaleMode) {
case SDL_TEXTURESCALEMODE_NONE:
case SDL_TEXTURESCALEMODE_FAST:
case SDL_TEXTURESCALEMODE_SLOW:
return 0;
case SDL_TEXTURESCALEMODE_BEST:
SDL_Unsupported();
texture->scaleMode = SDL_TEXTURESCALEMODE_SLOW;
return -1;
default:
SDL_Unsupported();
texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
return -1;
}
}
static int static int
GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, int pitch) const SDL_Rect * rect, const void *pixels, int pitch)
...@@ -636,18 +699,14 @@ GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, ...@@ -636,18 +699,14 @@ GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects,
} }
static int static int
GL_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) GL_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a,
const SDL_Rect * rect)
{ {
GL_RenderData *data = (GL_RenderData *) renderer->driverdata; GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
SDL_Window *window = SDL_GetWindowFromID(renderer->window); SDL_Window *window = SDL_GetWindowFromID(renderer->window);
GLclampf r, g, b, a;
a = ((GLclampf) ((color >> 24) & 0xFF)) / 255.0f;
r = ((GLclampf) ((color >> 16) & 0xFF)) / 255.0f;
g = ((GLclampf) ((color >> 8) & 0xFF)) / 255.0f;
b = ((GLclampf) (color & 0xFF)) / 255.0f;
data->glClearColor(r, g, b, a); data->glClearColor((GLclampf) r * inv255f, (GLclampf) g * inv255f,
(GLclampf) b * inv255f, (GLclampf) a * inv255f);
data->glViewport(rect->x, window->h - rect->y, rect->w, rect->h); data->glViewport(rect->x, window->h - rect->y, rect->w, rect->h);
data->glClear(GL_COLOR_BUFFER_BIT); data->glClear(GL_COLOR_BUFFER_BIT);
data->glViewport(0, 0, window->w, window->h); data->glViewport(0, 0, window->w, window->h);
...@@ -656,8 +715,7 @@ GL_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) ...@@ -656,8 +715,7 @@ GL_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color)
static int static int
GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect, const SDL_Rect * srcrect, const SDL_Rect * dstrect)
int blendMode, int scaleMode)
{ {
GL_RenderData *data = (GL_RenderData *) renderer->driverdata; GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata; GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;
...@@ -700,8 +758,17 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -700,8 +758,17 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
data->glBindTexture(texturedata->type, texturedata->texture); data->glBindTexture(texturedata->type, texturedata->texture);
if (blendMode != data->blendMode) { if (texture->modMode) {
switch (blendMode) { data->glColor4f((GLfloat) texture->r * inv255f,
(GLfloat) texture->g * inv255f,
(GLfloat) texture->b * inv255f,
(GLfloat) texture->a * inv255f);
} else {
data->glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
if (texture->blendMode != data->blendMode) {
switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_TEXTUREBLENDMODE_NONE:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
data->glDisable(GL_BLEND); data->glDisable(GL_BLEND);
...@@ -723,11 +790,11 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -723,11 +790,11 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR); data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);
break; break;
} }
data->blendMode = blendMode; data->blendMode = texture->blendMode;
} }
if (scaleMode != data->scaleMode) { if (texture->scaleMode != data->scaleMode) {
switch (scaleMode) { switch (texture->scaleMode) {
case SDL_TEXTURESCALEMODE_NONE: case SDL_TEXTURESCALEMODE_NONE:
case SDL_TEXTURESCALEMODE_FAST: case SDL_TEXTURESCALEMODE_FAST:
data->glTexParameteri(texturedata->type, GL_TEXTURE_MIN_FILTER, data->glTexParameteri(texturedata->type, GL_TEXTURE_MIN_FILTER,
...@@ -743,7 +810,7 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -743,7 +810,7 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
GL_LINEAR); GL_LINEAR);
break; break;
} }
data->scaleMode = scaleMode; data->scaleMode = texture->scaleMode;
} }
data->glBegin(GL_TRIANGLE_STRIP); data->glBegin(GL_TRIANGLE_STRIP);
......
This diff is collapsed.
...@@ -121,30 +121,33 @@ generate_rowbytes(int src_w, int dst_w, int bpp) ...@@ -121,30 +121,33 @@ generate_rowbytes(int src_w, int dst_w, int bpp)
#else #else
#define DEFINE_COPY_ROW(name, type) \ #define DEFINE_COPY_ROW(name, type) \
void name(type *src, int src_w, type *dst, int dst_w) \ void name(type *src, int src_w, type *dst, int dst_w) \
{ \ { \
int i; \ int i; \
int pos, inc; \ int pos, inc; \
type pixel = 0; \ type pixel = 0; \
\ \
pos = 0x10000; \ pos = 0x10000; \
inc = (src_w << 16) / dst_w; \ inc = (src_w << 16) / dst_w; \
for ( i=dst_w; i>0; --i ) { \ for ( i=dst_w; i>0; --i ) { \
while ( pos >= 0x10000L ) { \ while ( pos >= 0x10000L ) { \
pixel = *src++; \ pixel = *src++; \
pos -= 0x10000L; \ pos -= 0x10000L; \
} \ } \
*dst++ = pixel; \ *dst++ = pixel; \
pos += inc; \ pos += inc; \
} \ } \
} }
/* *INDENT-OFF* */
DEFINE_COPY_ROW(copy_row1, Uint8) DEFINE_COPY_ROW(copy_row1, Uint8)
DEFINE_COPY_ROW(copy_row2, Uint16) DEFINE_COPY_ROW(copy_row4, Uint32) DEFINE_COPY_ROW(copy_row2, Uint16)
DEFINE_COPY_ROW(copy_row4, Uint32)
/* *INDENT-ON* */
#endif /* USE_ASM_STRETCH */ #endif /* USE_ASM_STRETCH */
/* The ASM code doesn't handle 24-bpp stretch blits */ /* The ASM code doesn't handle 24-bpp stretch blits */
void void
copy_row3(Uint8 * src, int src_w, Uint8 * dst, int dst_w) copy_row3(Uint8 * src, int src_w, Uint8 * dst, int dst_w)
{ {
int i; int i;
int pos, inc; int pos, inc;
...@@ -278,14 +281,20 @@ SDL_SoftStretch(SDL_Surface * src, SDL_Rect * srcrect, ...@@ -278,14 +281,20 @@ SDL_SoftStretch(SDL_Surface * src, SDL_Rect * srcrect,
#ifdef __GNUC__ #ifdef __GNUC__
__asm__ __volatile__("call *%4": "=&D"(u1), "=&S"(u2): "0"(dstp), "1"(srcp), "r"(copy_row):"memory"); __asm__ __volatile__("call *%4": "=&D"(u1), "=&S"(u2): "0"(dstp), "1"(srcp), "r"(copy_row):"memory");
#elif defined(_MSC_VER) || defined(__WATCOMC__) #elif defined(_MSC_VER) || defined(__WATCOMC__)
/* *INDENT-OFF* */
{ {
void *code = copy_row; void *code = copy_row;
__asm { __asm {
push edi push edi
push esi push esi
mov edi, dstp mov edi, dstp
mov esi, srcp call dword ptr code pop esi pop edi} mov esi, srcp
call dword ptr code
pop esi
pop edi
}
} }
/* *INDENT-ON* */
#else #else
#error Need inline assembly for this compiler #error Need inline assembly for this compiler
#endif #endif
......
...@@ -44,6 +44,10 @@ struct SDL_Texture ...@@ -44,6 +44,10 @@ struct SDL_Texture
int access; /**< SDL_TextureAccess */ int access; /**< SDL_TextureAccess */
int w; /**< The width of the texture */ int w; /**< The width of the texture */
int h; /**< The height of the texture */ int h; /**< The height of the texture */
int modMode; /**< The texture modulation mode */
int blendMode; /**< The texture blend mode */
int scaleMode; /**< The texture scale mode */
Uint8 r, g, b, a; /**< Texture modulation values */
SDL_Renderer *renderer; SDL_Renderer *renderer;
...@@ -66,6 +70,14 @@ struct SDL_Renderer ...@@ -66,6 +70,14 @@ struct SDL_Renderer
int (*GetTexturePalette) (SDL_Renderer * renderer, SDL_Texture * texture, int (*GetTexturePalette) (SDL_Renderer * renderer, SDL_Texture * texture,
SDL_Color * colors, int firstcolor, SDL_Color * colors, int firstcolor,
int ncolors); int ncolors);
int (*SetTextureColorMod) (SDL_Renderer * renderer,
SDL_Texture * texture);
int (*SetTextureAlphaMod) (SDL_Renderer * renderer,
SDL_Texture * texture);
int (*SetTextureBlendMode) (SDL_Renderer * renderer,
SDL_Texture * texture);
int (*SetTextureScaleMode) (SDL_Renderer * renderer,
SDL_Texture * texture);
int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture, int (*UpdateTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, const SDL_Rect * rect, const void *pixels,
int pitch); int pitch);
...@@ -75,11 +87,10 @@ struct SDL_Renderer ...@@ -75,11 +87,10 @@ struct SDL_Renderer
void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture); void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
void (*DirtyTexture) (SDL_Renderer * renderer, SDL_Texture * texture, void (*DirtyTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
int numrects, const SDL_Rect * rects); int numrects, const SDL_Rect * rects);
int (*RenderFill) (SDL_Renderer * renderer, const SDL_Rect * rect, int (*RenderFill) (SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b,
Uint32 color); Uint8 a, const SDL_Rect * rect);
int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture, int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect, const SDL_Rect * srcrect, const SDL_Rect * dstrect);
int blendMode, int scaleMode);
void (*RenderPresent) (SDL_Renderer * renderer); void (*RenderPresent) (SDL_Renderer * renderer);
void (*DestroyTexture) (SDL_Renderer * renderer, SDL_Texture * texture); void (*DestroyTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
......
...@@ -1510,6 +1510,10 @@ SDL_CreateTexture(Uint32 format, int access, int w, int h) ...@@ -1510,6 +1510,10 @@ SDL_CreateTexture(Uint32 format, int access, int w, int h)
texture->access = access; texture->access = access;
texture->w = w; texture->w = w;
texture->h = h; texture->h = h;
texture->r = 255;
texture->g = 255;
texture->b = 255;
texture->a = 255;
texture->renderer = renderer; texture->renderer = renderer;
if (renderer->CreateTexture(renderer, texture) < 0) { if (renderer->CreateTexture(renderer, texture) < 0) {
...@@ -1771,6 +1775,162 @@ SDL_GetTexturePalette(SDL_TextureID textureID, SDL_Color * colors, ...@@ -1771,6 +1775,162 @@ SDL_GetTexturePalette(SDL_TextureID textureID, SDL_Color * colors,
ncolors); ncolors);
} }
int
SDL_SetTextureColorMod(SDL_TextureID textureID, Uint8 r, Uint8 g, Uint8 b)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
renderer = texture->renderer;
if (!renderer->SetTextureColorMod) {
return -1;
}
if (r < 255 | g < 255 | b < 255) {
texture->modMode |= SDL_TEXTUREMODULATE_COLOR;
} else {
texture->modMode &= ~SDL_TEXTUREMODULATE_COLOR;
}
texture->r = r;
texture->g = g;
texture->b = b;
return renderer->SetTextureColorMod(renderer, texture);
}
int
SDL_GetTextureColorMod(SDL_TextureID textureID, Uint8 * r, Uint8 * g,
Uint8 * b)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
renderer = texture->renderer;
if (r) {
*r = texture->r;
}
if (g) {
*g = texture->g;
}
if (b) {
*b = texture->b;
}
return 0;
}
int
SDL_SetTextureAlphaMod(SDL_TextureID textureID, Uint8 alpha)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
renderer = texture->renderer;
if (!renderer->SetTextureAlphaMod) {
return -1;
}
if (alpha < 255) {
texture->modMode |= SDL_TEXTUREMODULATE_ALPHA;
} else {
texture->modMode &= ~SDL_TEXTUREMODULATE_ALPHA;
}
texture->a = alpha;
return renderer->SetTextureAlphaMod(renderer, texture);
}
int
SDL_GetTextureAlphaMod(SDL_TextureID textureID, Uint8 * alpha)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
if (alpha) {
*alpha = texture->a;
}
return 0;
}
int
SDL_SetTextureBlendMode(SDL_TextureID textureID, int blendMode)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
renderer = texture->renderer;
if (!renderer->SetTextureBlendMode) {
return -1;
}
texture->blendMode = blendMode;
return renderer->SetTextureBlendMode(renderer, texture);
}
int
SDL_GetTextureBlendMode(SDL_TextureID textureID, int *blendMode)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
if (blendMode) {
*blendMode = texture->blendMode;
}
return 0;
}
int
SDL_SetTextureScaleMode(SDL_TextureID textureID, int scaleMode)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
renderer = texture->renderer;
if (!renderer->SetTextureScaleMode) {
return -1;
}
texture->scaleMode = scaleMode;
return renderer->SetTextureScaleMode(renderer, texture);
}
int
SDL_GetTextureScaleMode(SDL_TextureID textureID, int *scaleMode)
{
SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer;
if (!texture) {
return -1;
}
if (scaleMode) {
*scaleMode = texture->scaleMode;
}
return 0;
}
int int
SDL_UpdateTexture(SDL_TextureID textureID, const SDL_Rect * rect, SDL_UpdateTexture(SDL_TextureID textureID, const SDL_Rect * rect,
const void *pixels, int pitch) const void *pixels, int pitch)
...@@ -1864,7 +2024,7 @@ SDL_DirtyTexture(SDL_TextureID textureID, int numrects, ...@@ -1864,7 +2024,7 @@ SDL_DirtyTexture(SDL_TextureID textureID, int numrects,
} }
int int
SDL_RenderFill(const SDL_Rect * rect, Uint32 color) SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect)
{ {
SDL_Renderer *renderer; SDL_Renderer *renderer;
SDL_Window *window; SDL_Window *window;
...@@ -1891,12 +2051,12 @@ SDL_RenderFill(const SDL_Rect * rect, Uint32 color) ...@@ -1891,12 +2051,12 @@ SDL_RenderFill(const SDL_Rect * rect, Uint32 color)
} }
} }
return renderer->RenderFill(renderer, &real_rect, color); return renderer->RenderFill(renderer, r, g, b, a, &real_rect);
} }
int int
SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect, SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect,
const SDL_Rect * dstrect, int blendMode, int scaleMode) const SDL_Rect * dstrect)
{ {
SDL_Texture *texture = SDL_GetTextureFromID(textureID); SDL_Texture *texture = SDL_GetTextureFromID(textureID);
SDL_Renderer *renderer; SDL_Renderer *renderer;
...@@ -1932,7 +2092,7 @@ SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect, ...@@ -1932,7 +2092,7 @@ SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect * srcrect,
} }
return renderer->RenderCopy(renderer, texture, &real_srcrect, return renderer->RenderCopy(renderer, texture, &real_srcrect,
&real_dstrect, blendMode, scaleMode); &real_dstrect);
} }
void void
......
This diff is collapsed.
This diff is collapsed.
...@@ -37,6 +37,14 @@ static int D3D_SetTexturePalette(SDL_Renderer * renderer, ...@@ -37,6 +37,14 @@ static int D3D_SetTexturePalette(SDL_Renderer * renderer,
static int D3D_GetTexturePalette(SDL_Renderer * renderer, static int D3D_GetTexturePalette(SDL_Renderer * renderer,
SDL_Texture * texture, SDL_Color * colors, SDL_Texture * texture, SDL_Color * colors,
int firstcolor, int ncolors); int firstcolor, int ncolors);
static int D3D_SetTextureColorMod(SDL_Renderer * renderer,
SDL_Texture * texture);
static int D3D_SetTextureAlphaMod(SDL_Renderer * renderer,
SDL_Texture * texture);
static int D3D_SetTextureBlendMode(SDL_Renderer * renderer,
SDL_Texture * texture);
static int D3D_SetTextureScaleMode(SDL_Renderer * renderer,
SDL_Texture * texture);
static int D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, static int D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, const SDL_Rect * rect, const void *pixels,
int pitch); int pitch);
...@@ -46,11 +54,10 @@ static int D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -46,11 +54,10 @@ static int D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
static void D3D_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void D3D_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static void D3D_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, static void D3D_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
int numrects, const SDL_Rect * rects); int numrects, const SDL_Rect * rects);
static int D3D_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, static int D3D_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b,
Uint32 color); Uint8 a, const SDL_Rect * rect);
static int D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect, const SDL_Rect * srcrect, const SDL_Rect * dstrect);
int blendMode, int scaleMode);
static void D3D_RenderPresent(SDL_Renderer * renderer); static void D3D_RenderPresent(SDL_Renderer * renderer);
static void D3D_DestroyTexture(SDL_Renderer * renderer, static void D3D_DestroyTexture(SDL_Renderer * renderer,
SDL_Texture * texture); SDL_Texture * texture);
...@@ -65,6 +72,8 @@ SDL_RenderDriver D3D_RenderDriver = { ...@@ -65,6 +72,8 @@ SDL_RenderDriver D3D_RenderDriver = {
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC |
SDL_RENDERER_ACCELERATED), SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD |
SDL_TEXTUREBLENDMODE_MOD), SDL_TEXTUREBLENDMODE_MOD),
...@@ -259,6 +268,10 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -259,6 +268,10 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->CreateTexture = D3D_CreateTexture; renderer->CreateTexture = D3D_CreateTexture;
renderer->SetTexturePalette = D3D_SetTexturePalette; renderer->SetTexturePalette = D3D_SetTexturePalette;
renderer->GetTexturePalette = D3D_GetTexturePalette; renderer->GetTexturePalette = D3D_GetTexturePalette;
renderer->SetTextureColorMod = D3D_SetTextureColorMod;
renderer->SetTextureAlphaMod = D3D_SetTextureAlphaMod;
renderer->SetTextureBlendMode = D3D_SetTextureBlendMode;
renderer->SetTextureScaleMode = D3D_SetTextureScaleMode;
renderer->UpdateTexture = D3D_UpdateTexture; renderer->UpdateTexture = D3D_UpdateTexture;
renderer->LockTexture = D3D_LockTexture; renderer->LockTexture = D3D_LockTexture;
renderer->UnlockTexture = D3D_UnlockTexture; renderer->UnlockTexture = D3D_UnlockTexture;
...@@ -477,6 +490,54 @@ D3D_GetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -477,6 +490,54 @@ D3D_GetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture,
return 0; return 0;
} }
static int
D3D_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture)
{
/* FIXME: implement vertex coloring */
return -1;
}
static int
D3D_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture)
{
/* FIXME: implement vertex coloring */
return -1;
}
static int
D3D_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{
switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND:
case SDL_TEXTUREBLENDMODE_ADD:
case SDL_TEXTUREBLENDMODE_MOD:
return 0;
default:
SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE;
return -1;
}
}
static int
D3D_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
{
switch (texture->scaleMode) {
case SDL_TEXTURESCALEMODE_NONE:
case SDL_TEXTURESCALEMODE_FAST:
case SDL_TEXTURESCALEMODE_SLOW:
case SDL_TEXTURESCALEMODE_BEST:
return 0;
default:
SDL_Unsupported();
texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
return -1;
}
return 0;
}
static int static int
D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, int pitch) const SDL_Rect * rect, const void *pixels, int pitch)
...@@ -597,7 +658,8 @@ D3D_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, ...@@ -597,7 +658,8 @@ D3D_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects,
} }
static int static int
D3D_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) D3D_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a,
const SDL_Rect * rect)
{ {
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
D3DRECT d3drect; D3DRECT d3drect;
...@@ -615,7 +677,7 @@ D3D_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) ...@@ -615,7 +677,7 @@ D3D_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color)
result = result =
IDirect3DDevice9_Clear(data->device, 1, &d3drect, D3DCLEAR_TARGET, IDirect3DDevice9_Clear(data->device, 1, &d3drect, D3DCLEAR_TARGET,
(D3DCOLOR) color, 1.0f, 0); D3DCOLOR_ARGB(a, r, g, b), 1.0f, 0);
if (FAILED(result)) { if (FAILED(result)) {
D3D_SetError("Clear()", result); D3D_SetError("Clear()", result);
return -1; return -1;
...@@ -625,8 +687,7 @@ D3D_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) ...@@ -625,8 +687,7 @@ D3D_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color)
static int static int
D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect, const SDL_Rect * srcrect, const SDL_Rect * dstrect)
int blendMode, int scaleMode)
{ {
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
D3D_TextureData *texturedata = (D3D_TextureData *) texture->driverdata; D3D_TextureData *texturedata = (D3D_TextureData *) texture->driverdata;
...@@ -678,7 +739,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -678,7 +739,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
vertices[3].u = minu; vertices[3].u = minu;
vertices[3].v = maxv; vertices[3].v = maxv;
switch (blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_TEXTUREBLENDMODE_NONE:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
FALSE); FALSE);
...@@ -710,7 +771,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -710,7 +771,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
break; break;
} }
switch (scaleMode) { switch (texture->scaleMode) {
case SDL_TEXTURESCALEMODE_NONE: case SDL_TEXTURESCALEMODE_NONE:
case SDL_TEXTURESCALEMODE_FAST: case SDL_TEXTURESCALEMODE_FAST:
IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MINFILTER, IDirect3DDevice9_SetSamplerState(data->device, 0, D3DSAMP_MINFILTER,
......
...@@ -42,6 +42,12 @@ static int GDI_SetTexturePalette(SDL_Renderer * renderer, ...@@ -42,6 +42,12 @@ static int GDI_SetTexturePalette(SDL_Renderer * renderer,
static int GDI_GetTexturePalette(SDL_Renderer * renderer, static int GDI_GetTexturePalette(SDL_Renderer * renderer,
SDL_Texture * texture, SDL_Color * colors, SDL_Texture * texture, SDL_Color * colors,
int firstcolor, int ncolors); int firstcolor, int ncolors);
static int GDI_SetTextureAlphaMod(SDL_Renderer * renderer,
SDL_Texture * texture);
static int GDI_SetTextureBlendMode(SDL_Renderer * renderer,
SDL_Texture * texture);
static int GDI_SetTextureScaleMode(SDL_Renderer * renderer,
SDL_Texture * texture);
static int GDI_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, static int GDI_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, const SDL_Rect * rect, const void *pixels,
int pitch); int pitch);
...@@ -51,11 +57,10 @@ static int GDI_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -51,11 +57,10 @@ static int GDI_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
static void GDI_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GDI_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static void GDI_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, static void GDI_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
int numrects, const SDL_Rect * rects); int numrects, const SDL_Rect * rects);
static int GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, static int GDI_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b,
Uint32 color); Uint8 a, const SDL_Rect * rect);
static int GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect, const SDL_Rect * srcrect, const SDL_Rect * dstrect);
int blendMode, int scaleMode);
static void GDI_RenderPresent(SDL_Renderer * renderer); static void GDI_RenderPresent(SDL_Renderer * renderer);
static void GDI_DestroyTexture(SDL_Renderer * renderer, static void GDI_DestroyTexture(SDL_Renderer * renderer,
SDL_Texture * texture); SDL_Texture * texture);
...@@ -69,6 +74,7 @@ SDL_RenderDriver GDI_RenderDriver = { ...@@ -69,6 +74,7 @@ SDL_RenderDriver GDI_RenderDriver = {
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY | (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED), SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND), SDL_TEXTUREBLENDMODE_BLEND),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST),
...@@ -161,6 +167,9 @@ GDI_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -161,6 +167,9 @@ GDI_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->QueryTexturePixels = GDI_QueryTexturePixels; renderer->QueryTexturePixels = GDI_QueryTexturePixels;
renderer->SetTexturePalette = GDI_SetTexturePalette; renderer->SetTexturePalette = GDI_SetTexturePalette;
renderer->GetTexturePalette = GDI_GetTexturePalette; renderer->GetTexturePalette = GDI_GetTexturePalette;
renderer->SetTextureAlphaMod = GDI_SetTextureAlphaMod;
renderer->SetTextureBlendMode = GDI_SetTextureBlendMode;
renderer->SetTextureScaleMode = GDI_SetTextureScaleMode;
renderer->UpdateTexture = GDI_UpdateTexture; renderer->UpdateTexture = GDI_UpdateTexture;
renderer->LockTexture = GDI_LockTexture; renderer->LockTexture = GDI_LockTexture;
renderer->UnlockTexture = GDI_UnlockTexture; renderer->UnlockTexture = GDI_UnlockTexture;
...@@ -437,6 +446,47 @@ GDI_GetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -437,6 +446,47 @@ GDI_GetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture,
} }
} }
static int
GDI_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture)
{
return 0;
}
static int
GDI_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{
switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND:
return 0;
default:
SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE;
return -1;
}
}
static int
GDI_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
{
switch (texture->scaleMode) {
case SDL_TEXTURESCALEMODE_NONE:
case SDL_TEXTURESCALEMODE_FAST:
return 0;
case SDL_TEXTURESCALEMODE_SLOW:
case SDL_TEXTURESCALEMODE_BEST:
SDL_Unsupported();
texture->scaleMode = SDL_TEXTURESCALEMODE_FAST;
return -1;
default:
SDL_Unsupported();
texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
return -1;
}
return 0;
}
static int static int
GDI_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, GDI_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, int pitch) const SDL_Rect * rect, const void *pixels, int pitch)
...@@ -524,10 +574,10 @@ GDI_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, ...@@ -524,10 +574,10 @@ GDI_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects,
} }
static int static int
GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) GDI_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a,
const SDL_Rect * rect)
{ {
GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata; GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata;
Uint8 r, g, b;
RECT rc; RECT rc;
HBRUSH brush; HBRUSH brush;
int status; int status;
...@@ -536,10 +586,6 @@ GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) ...@@ -536,10 +586,6 @@ GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color)
SDL_AddDirtyRect(&data->dirty, rect); SDL_AddDirtyRect(&data->dirty, rect);
} }
r = (Uint8) ((color >> 16) & 0xFF);
g = (Uint8) ((color >> 8) & 0xFF);
b = (Uint8) (color & 0xFF);
rc.left = rect->x; rc.left = rect->x;
rc.top = rect->y; rc.top = rect->y;
rc.right = rect->x + rect->w + 1; rc.right = rect->x + rect->w + 1;
...@@ -560,8 +606,7 @@ GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) ...@@ -560,8 +606,7 @@ GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color)
static int static int
GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect, const SDL_Rect * srcrect, const SDL_Rect * dstrect)
int blendMode, int scaleMode)
{ {
GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata; GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata;
GDI_TextureData *texturedata = (GDI_TextureData *) texture->driverdata; GDI_TextureData *texturedata = (GDI_TextureData *) texture->driverdata;
...@@ -575,11 +620,13 @@ GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -575,11 +620,13 @@ GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
SelectPalette(data->memory_hdc, texturedata->hpal, TRUE); SelectPalette(data->memory_hdc, texturedata->hpal, TRUE);
RealizePalette(data->memory_hdc); RealizePalette(data->memory_hdc);
} }
if (blendMode & (SDL_TEXTUREBLENDMODE_MASK | SDL_TEXTUREBLENDMODE_BLEND)) { if (texture->
static BLENDFUNCTION blendFunc = { blendMode & (SDL_TEXTUREBLENDMODE_MASK | SDL_TEXTUREBLENDMODE_BLEND))
{
BLENDFUNCTION blendFunc = {
AC_SRC_OVER, AC_SRC_OVER,
0, 0,
255, texture->a,
AC_SRC_ALPHA AC_SRC_ALPHA
}; };
/* FIXME: GDI uses premultiplied alpha! */ /* FIXME: GDI uses premultiplied alpha! */
......
...@@ -194,7 +194,7 @@ main(int argc, char *argv[]) ...@@ -194,7 +194,7 @@ main(int argc, char *argv[])
} }
} }
if (consumed < 0) { if (consumed < 0) {
fprintf(stderr, "Usage: %s %s [--fsaa] [--accel]", argv[0], fprintf(stderr, "Usage: %s %s [--fsaa] [--accel]\n", argv[0],
CommonUsage(state)); CommonUsage(state));
quit(1); quit(1);
} }
......
...@@ -8,11 +8,15 @@ ...@@ -8,11 +8,15 @@
#define NUM_SPRITES 100 #define NUM_SPRITES 100
#define MAX_SPEED 1 #define MAX_SPEED 1
#define BACKGROUND 0x00A0A0A0
static CommonState *state; static CommonState *state;
static int num_sprites; static int num_sprites;
static SDL_TextureID *sprites; static SDL_TextureID *sprites;
static SDL_bool cycle_color;
static SDL_bool cycle_alpha;
static int cycle_direction = 1;
static int current_alpha = 0;
static int current_color = 0;
static SDL_Rect *positions; static SDL_Rect *positions;
static SDL_Rect *velocities; static SDL_Rect *velocities;
static int sprite_w, sprite_h; static int sprite_w, sprite_h;
...@@ -66,6 +70,8 @@ LoadSprite(char *file) ...@@ -66,6 +70,8 @@ LoadSprite(char *file)
SDL_FreeSurface(temp); SDL_FreeSurface(temp);
return (-1); return (-1);
} }
SDL_SetTextureBlendMode(sprites[i], blendMode);
SDL_SetTextureScaleMode(sprites[i], scaleMode);
} }
SDL_FreeSurface(temp); SDL_FreeSurface(temp);
...@@ -85,9 +91,36 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) ...@@ -85,9 +91,36 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
/* Query the sizes */ /* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h); SDL_GetWindowSize(window, &window_w, &window_h);
/* Cycle the color and alpha, if desired */
if (cycle_color) {
current_color += cycle_direction;
if (current_color < 0) {
current_color = 0;
cycle_direction = -cycle_direction;
}
if (current_color > 255) {
current_color = 255;
cycle_direction = -cycle_direction;
}
SDL_SetTextureColorMod(sprite, 255, (Uint8) current_color,
(Uint8) current_color);
}
if (cycle_alpha) {
current_alpha += cycle_direction;
if (current_alpha < 0) {
current_alpha = 0;
cycle_direction = -cycle_direction;
}
if (current_alpha > 255) {
current_alpha = 255;
cycle_direction = -cycle_direction;
}
SDL_SetTextureAlphaMod(sprite, (Uint8) current_alpha);
}
/* Move the sprite, bounce at the wall, and draw */ /* Move the sprite, bounce at the wall, and draw */
n = 0; n = 0;
SDL_RenderFill(NULL, BACKGROUND); SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
for (i = 0; i < num_sprites; ++i) { for (i = 0; i < num_sprites; ++i) {
position = &positions[i]; position = &positions[i];
velocity = &velocities[i]; velocity = &velocities[i];
...@@ -103,7 +136,7 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) ...@@ -103,7 +136,7 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
} }
/* Blit the sprite onto the screen */ /* Blit the sprite onto the screen */
SDL_RenderCopy(sprite, NULL, position, blendMode, scaleMode); SDL_RenderCopy(sprite, NULL, position);
} }
/* Update the screen! */ /* Update the screen! */
...@@ -166,6 +199,12 @@ main(int argc, char *argv[]) ...@@ -166,6 +199,12 @@ main(int argc, char *argv[])
consumed = 2; consumed = 2;
} }
} }
} else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) {
cycle_color = SDL_TRUE;
consumed = 1;
} else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) {
cycle_alpha = SDL_TRUE;
consumed = 1;
} else if (SDL_isdigit(*argv[i])) { } else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]); num_sprites = SDL_atoi(argv[i]);
consumed = 1; consumed = 1;
...@@ -173,7 +212,7 @@ main(int argc, char *argv[]) ...@@ -173,7 +212,7 @@ main(int argc, char *argv[])
} }
if (consumed < 0) { if (consumed < 0) {
fprintf(stderr, fprintf(stderr,
"Usage: %s %s [--blend none|mask|blend|add|mod] [--scale none|fast|slow|best]", "Usage: %s %s [--blend none|mask|blend|add|mod] [--scale none|fast|slow|best] [--cyclecolor] [--cyclealpha]\n",
argv[0], CommonUsage(state)); argv[0], CommonUsage(state));
quit(1); quit(1);
} }
...@@ -192,7 +231,7 @@ main(int argc, char *argv[]) ...@@ -192,7 +231,7 @@ main(int argc, char *argv[])
} }
for (i = 0; i < state->num_windows; ++i) { for (i = 0; i < state->num_windows; ++i) {
SDL_SelectRenderer(state->windows[i]); SDL_SelectRenderer(state->windows[i]);
SDL_RenderFill(NULL, BACKGROUND); SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
} }
if (LoadSprite("icon.bmp") < 0) { if (LoadSprite("icon.bmp") < 0) {
quit(2); quit(2);
...@@ -237,7 +276,7 @@ main(int argc, char *argv[]) ...@@ -237,7 +276,7 @@ main(int argc, char *argv[])
switch (event.window.event) { switch (event.window.event) {
case SDL_WINDOWEVENT_EXPOSED: case SDL_WINDOWEVENT_EXPOSED:
SDL_SelectRenderer(event.window.windowID); SDL_SelectRenderer(event.window.windowID);
SDL_RenderFill(NULL, BACKGROUND); SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL);
break; break;
} }
break; break;
......
...@@ -34,7 +34,7 @@ main(int argc, char *argv[]) ...@@ -34,7 +34,7 @@ main(int argc, char *argv[])
consumed = -1; consumed = -1;
} }
if (consumed < 0) { if (consumed < 0) {
fprintf(stderr, "Usage: %s %s", argv[0], CommonUsage(state)); fprintf(stderr, "Usage: %s %s\n", argv[0], CommonUsage(state));
quit(1); quit(1);
} }
i += consumed; i += consumed;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment