Date: Fri, 19 Dec 2008 20:17:35 +0100

From: Couriersud
Subject: Re: Aw: Experience using SDL1.3 in sdlmame/Proposal for api additions

> For consistency you'd probably want:
> SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a);
> SDL_SetRenderDrawBlendMode(SDL_BlendMode blendMode);
> SDL_RenderLine(int x1, int y1, int x2, int y2);
> SDL_RenderFill(SDL_Rect *rect);
>
> You probably also want to add API functions query the current state.
>

I have implemented the above api for the opengl, x11, directfb and
software renderers. I have also renamed *TEXTUREBLENDMODE* constants to
BLENDMODE*. The unix build compiles. The windows renderer still needs to
be updated, but I have no windows development machine at hand. Have a
look at the x11 renderer for a sample.

Vector games now run at 90% both on opengl and directfb in comparison to
sdlmame's own opengl renderer. The same applies to raster games.

The diff also includes

a) Changed XDrawRect to XFillRect in x11 renderer
b) A number of changes to fix blending and modulation issues in the
directfb renderer.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403346
This commit is contained in:
Sam Lantinga 2008-12-20 12:00:00 +00:00
parent 60c39418a7
commit 9ba7210778
26 changed files with 747 additions and 274 deletions

1
TODO
View File

@ -5,6 +5,7 @@
- in progress, software support is done, Ryan is working on OpenGL shaders - in progress, software support is done, Ryan is working on OpenGL shaders
* Implement desktop video mode change notification? * Implement desktop video mode change notification?
* Implement icon support (with translucency?) * Implement icon support (with translucency?)
* Add draw blend mode and line drawing support for software renderer and win32
* Verify mouse grab support * Verify mouse grab support
* Properly handle mouse grab with Vista DPI scaling * Properly handle mouse grab with Vista DPI scaling
* Make sure the mouse is where it's supposed to be when un-grabbed * Make sure the mouse is where it's supposed to be when un-grabbed

View File

@ -145,7 +145,7 @@ initializeTextures()
if (shipID == 0) { if (shipID == 0) {
fatalError("could not create ship texture"); fatalError("could not create ship texture");
} }
SDL_SetTextureBlendMode(shipID, SDL_TEXTUREBLENDMODE_BLEND); SDL_SetTextureBlendMode(shipID, SDL_BLENDMODE_BLEND);
/* set the width and height of the ship from the surface dimensions */ /* set the width and height of the ship from the surface dimensions */
ship.rect.w = bmp_surface->w; ship.rect.w = bmp_surface->w;

View File

@ -127,7 +127,7 @@ initializeTexture()
if (texture_id == 0) { if (texture_id == 0) {
fatalError("could not create texture"); fatalError("could not create texture");
} }
SDL_SetTextureBlendMode(texture_id, SDL_TEXTUREBLENDMODE_BLEND); SDL_SetTextureBlendMode(texture_id, SDL_BLENDMODE_BLEND);
/* free up allocated memory */ /* free up allocated memory */
SDL_FreeSurface(bmp_surface_rgba); SDL_FreeSurface(bmp_surface_rgba);

View File

@ -223,7 +223,7 @@ loadFont(void)
printf("texture creation failed: %s\n", SDL_GetError()); printf("texture creation failed: %s\n", SDL_GetError());
} else { } else {
/* set blend mode for our texture */ /* set blend mode for our texture */
SDL_SetTextureBlendMode(textureID, SDL_TEXTUREBLENDMODE_BLEND); SDL_SetTextureBlendMode(textureID, SDL_BLENDMODE_BLEND);
} }
SDL_FreeSurface(surface); SDL_FreeSurface(surface);
SDL_FreeSurface(converted); SDL_FreeSurface(converted);

View File

@ -65,7 +65,7 @@ initializeTexture()
fatalError("could not create brush texture"); fatalError("could not create brush texture");
} }
/* additive blending -- laying strokes on top of eachother makes them brighter */ /* additive blending -- laying strokes on top of eachother makes them brighter */
SDL_SetTextureBlendMode(brushID, SDL_TEXTUREBLENDMODE_ADD); SDL_SetTextureBlendMode(brushID, SDL_BLENDMODE_ADD);
/* set brush color (red) */ /* set brush color (red) */
SDL_SetTextureColorMod(brushID, 255, 100, 100); SDL_SetTextureColorMod(brushID, 255, 100, 100);
} }

View File

@ -206,18 +206,18 @@ typedef enum
} SDL_TextureModulate; } SDL_TextureModulate;
/** /**
* \enum SDL_TextureBlendMode * \enum SDL_BlendMode
* *
* \brief The texture blend mode used in SDL_RenderCopy() * \brief The blend mode used in SDL_RenderCopy() and drawing operations
*/ */
typedef enum typedef enum
{ {
SDL_TEXTUREBLENDMODE_NONE = 0x00000000, /**< No blending */ SDL_BLENDMODE_NONE = 0x00000000, /**< No blending */
SDL_TEXTUREBLENDMODE_MASK = 0x00000001, /**< dst = A ? src : dst (alpha is mask) */ SDL_BLENDMODE_MASK = 0x00000001, /**< dst = A ? src : dst (alpha is mask) */
SDL_TEXTUREBLENDMODE_BLEND = 0x00000002, /**< dst = (src * A) + (dst * (1-A)) */ SDL_BLENDMODE_BLEND = 0x00000002, /**< dst = (src * A) + (dst * (1-A)) */
SDL_TEXTUREBLENDMODE_ADD = 0x00000004, /**< dst = (src * A) + dst */ SDL_BLENDMODE_ADD = 0x00000004, /**< dst = (src * A) + dst */
SDL_TEXTUREBLENDMODE_MOD = 0x00000008 /**< dst = src * dst */ SDL_BLENDMODE_MOD = 0x00000008 /**< dst = src * dst */
} SDL_TextureBlendMode; } SDL_BlendMode;
/** /**
* \enum SDL_TextureScaleMode * \enum SDL_TextureScaleMode
@ -1141,9 +1141,80 @@ extern DECLSPEC void SDLCALL SDL_DirtyTexture(SDL_TextureID textureID,
const SDL_Rect * rects); const SDL_Rect * rects);
/** /**
* \fn void SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect *rect) * \fn void SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a)
* *
* \brief Fill the current rendering target with the specified color. * \brief Set the color used for drawing operations (Fill and Line).
*
* \param r The red value used to draw on the rendering target
* \param g The green value used to draw on the rendering target
* \param b The blue value used to draw on the rendering target
* \param a The alpha value used to draw on the rendering target, usually SDL_ALPHA_OPAQUE (255)
* \return 0 on success, or -1 if there is no rendering context current
*/
extern DECLSPEC int SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b,
Uint8 a);
/**
* \fn void SDL_GetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a)
*
* \brief Get the color used for drawing operations (Fill and Line).
*
* \param r A pointer to the red value used to draw on the rendering target
* \param g A pointer to the green value used to draw on the rendering target
* \param b A pointer to the blue value used to draw on the rendering target
* \param a A pointer to the alpha value used to draw on the rendering target, usually SDL_ALPHA_OPAQUE (255)
* \return 0 on success, or -1 if there is no rendering context current
*/
extern DECLSPEC int SDL_GetRenderDrawColor(Uint8 * r, Uint8 * g, Uint8 * b,
Uint8 * a);
/**
* \fn int SDL_SetRenderDrawBlendMode(int blendMode)
*
* \brief Set the blend mode used for drawing operations
*
* \param blendMode SDL_BlendMode to use for blending
*
* \return 0 on success, or -1 if there is no rendering context current
*
* \note If the blend mode is not supported, the closest supported mode is chosen.
*
* \sa SDL_SetRenderDrawBlendMode()
*/
extern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(int blendMode);
/**
* \fn int SDL_GetRenderDrawBlendMode(int *blendMode)
*
* \brief Get the blend mode used for drawing operations
*
* \param blendMode A pointer filled in with the current blend mode
*
* \return 0 on success, or -1 if there is no rendering context current
*
* \sa SDL_SetRenderDrawBlendMode()
*/
extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(int *blendMode);
/**
* \fn void SDL_RenderLine(int x1, int y1, int x2, int y2)
*
* \brief Draw a line on the current rendering target.
*
* \param x1 The x coordinate of the start point
* \param y1 The y coordinate of the start point
* \param x2 The x coordinate of the end point
* \param y2 The y coordinate of the end point
*
* \return 0 on success, or -1 if there is no rendering context current
*/
extern DECLSPEC int SDLCALL SDL_RenderLine(int x1, int y1, int x2, int y2);
/**
* \fn void SDL_RenderFill(const SDL_Rect *rect)
*
* \brief Fill the current rendering target with the drawing color.
* *
* \param r The red value used to fill the rendering target * \param r The red value used to fill the rendering target
* \param g The green value used to fill the rendering target * \param g The green value used to fill the rendering target
@ -1153,8 +1224,7 @@ extern DECLSPEC void SDLCALL SDL_DirtyTexture(SDL_TextureID textureID,
* *
* \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(Uint8 r, Uint8 g, Uint8 b, Uint8 a, extern DECLSPEC int SDLCALL SDL_RenderFill(const SDL_Rect * rect);
const SDL_Rect * rect);
/** /**
* \fn int SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect *srcrect, const SDL_Rect *dstrect) * \fn int SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect *srcrect, const SDL_Rect *dstrect)

View File

@ -696,10 +696,10 @@ SDL_SetAlpha(SDL_Surface * surface, Uint32 flag, Uint8 value)
value = 0xFF; value = 0xFF;
} }
SDL_SetSurfaceAlphaMod(surface, value); SDL_SetSurfaceAlphaMod(surface, value);
SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_BLEND); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);
} else { } else {
SDL_SetSurfaceAlphaMod(surface, 0xFF); SDL_SetSurfaceAlphaMod(surface, 0xFF);
SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_NONE); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE);
} }
SDL_SetSurfaceRLE(surface, (flag & SDL_RLEACCEL)); SDL_SetSurfaceRLE(surface, (flag & SDL_RLEACCEL));

View File

@ -206,7 +206,7 @@ SDL_PROC_UNUSED(void, glLighti, (GLenum light, GLenum pname, GLint param))
SDL_PROC_UNUSED(void, glLightiv, SDL_PROC_UNUSED(void, glLightiv,
(GLenum light, GLenum pname, const GLint * params)) (GLenum light, GLenum pname, const GLint * params))
SDL_PROC_UNUSED(void, glLineStipple, (GLint factor, GLushort pattern)) SDL_PROC_UNUSED(void, glLineStipple, (GLint factor, GLushort pattern))
SDL_PROC_UNUSED(void, glLineWidth, (GLfloat width)) SDL_PROC(void, glLineWidth, (GLfloat width))
SDL_PROC_UNUSED(void, glListBase, (GLuint base)) SDL_PROC_UNUSED(void, glListBase, (GLuint base))
SDL_PROC(void, glLoadIdentity, (void)) SDL_PROC(void, glLoadIdentity, (void))
SDL_PROC_UNUSED(void, glLoadMatrixd, (const GLdouble * m)) SDL_PROC_UNUSED(void, glLoadMatrixd, (const GLdouble * m))
@ -272,7 +272,7 @@ SDL_PROC(void, glPixelStorei, (GLenum pname, GLint param))
SDL_PROC_UNUSED(void, glPixelTransferf, (GLenum pname, GLfloat param)) SDL_PROC_UNUSED(void, glPixelTransferf, (GLenum pname, GLfloat param))
SDL_PROC_UNUSED(void, glPixelTransferi, (GLenum pname, GLint param)) SDL_PROC_UNUSED(void, glPixelTransferi, (GLenum pname, GLint param))
SDL_PROC_UNUSED(void, glPixelZoom, (GLfloat xfactor, GLfloat yfactor)) SDL_PROC_UNUSED(void, glPixelZoom, (GLfloat xfactor, GLfloat yfactor))
SDL_PROC_UNUSED(void, glPointSize, (GLfloat size)) SDL_PROC(void, glPointSize, (GLfloat size))
SDL_PROC_UNUSED(void, glPolygonMode, (GLenum face, GLenum mode)) SDL_PROC_UNUSED(void, glPolygonMode, (GLenum face, GLenum mode))
SDL_PROC_UNUSED(void, glPolygonOffset, (GLfloat factor, GLfloat units)) SDL_PROC_UNUSED(void, glPolygonOffset, (GLfloat factor, GLfloat units))
SDL_PROC_UNUSED(void, glPolygonStipple, (const GLubyte * mask)) SDL_PROC_UNUSED(void, glPolygonStipple, (const GLubyte * mask))
@ -324,7 +324,7 @@ SDL_PROC_UNUSED(void, glRectdv, (const GLdouble * v1, const GLdouble * v2))
SDL_PROC_UNUSED(void, glRectf, SDL_PROC_UNUSED(void, glRectf,
(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)) (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2))
SDL_PROC_UNUSED(void, glRectfv, (const GLfloat * v1, const GLfloat * v2)) SDL_PROC_UNUSED(void, glRectfv, (const GLfloat * v1, const GLfloat * v2))
SDL_PROC_UNUSED(void, glRecti, (GLint x1, GLint y1, GLint x2, GLint y2)) SDL_PROC(void, glRecti, (GLint x1, GLint y1, GLint x2, GLint y2))
SDL_PROC_UNUSED(void, glRectiv, (const GLint * v1, const GLint * v2)) SDL_PROC_UNUSED(void, glRectiv, (const GLint * v1, const GLint * v2))
SDL_PROC_UNUSED(void, glRects, SDL_PROC_UNUSED(void, glRects,
(GLshort x1, GLshort y1, GLshort x2, GLshort y2)) (GLshort x1, GLshort y1, GLshort x2, GLshort y2))

View File

@ -51,14 +51,14 @@ bytes_per_pixel(const Uint32 format)
/* FOURCC format */ /* FOURCC format */
switch (format) { switch (format) {
case SDL_PIXELFORMAT_YV12: case SDL_PIXELFORMAT_YV12:
case SDL_PIXELFORMAT_IYUV: case SDL_PIXELFORMAT_IYUV:
case SDL_PIXELFORMAT_YUY2: case SDL_PIXELFORMAT_YUY2:
case SDL_PIXELFORMAT_UYVY: case SDL_PIXELFORMAT_UYVY:
case SDL_PIXELFORMAT_YVYU: case SDL_PIXELFORMAT_YVYU:
return 2; return 2;
default: default:
return 1; /* shouldn't ever hit this. */ return 1; /* shouldn't ever hit this. */
} }
} }
@ -96,10 +96,14 @@ static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
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, Uint8 r, Uint8 g, Uint8 b, static int GL_SetDrawColor(SDL_Renderer * renderer);
Uint8 a, const SDL_Rect * rect); static int GL_SetDrawBlendMode(SDL_Renderer * renderer);
static int GL_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2,
int y2);
static int GL_RenderFill(SDL_Renderer * renderer, 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);
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);
@ -113,9 +117,8 @@ SDL_RenderDriver GL_RenderDriver = {
SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED), SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA), SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
SDL_TEXTUREBLENDMODE_MOD),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST |
SDL_TEXTURESCALEMODE_SLOW), SDL_TEXTURESCALEMODE_SLOW),
15, 15,
@ -186,7 +189,7 @@ typedef struct
void *pixels; void *pixels;
int pitch; int pitch;
SDL_DirtyRectList dirty; SDL_DirtyRectList dirty;
int HACK_RYAN_FIXME; int HACK_RYAN_FIXME;
} GL_TextureData; } GL_TextureData;
@ -308,6 +311,9 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->LockTexture = GL_LockTexture; renderer->LockTexture = GL_LockTexture;
renderer->UnlockTexture = GL_UnlockTexture; renderer->UnlockTexture = GL_UnlockTexture;
renderer->DirtyTexture = GL_DirtyTexture; renderer->DirtyTexture = GL_DirtyTexture;
renderer->SetDrawColor = GL_SetDrawColor;
renderer->SetDrawBlendMode = GL_SetDrawBlendMode;
renderer->RenderLine = GL_RenderLine;
renderer->RenderFill = GL_RenderFill; renderer->RenderFill = GL_RenderFill;
renderer->RenderCopy = GL_RenderCopy; renderer->RenderCopy = GL_RenderCopy;
renderer->RenderPresent = GL_RenderPresent; renderer->RenderPresent = GL_RenderPresent;
@ -429,6 +435,36 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
return renderer; return renderer;
} }
static void
SetBlendMode(GL_RenderData * data, int blendMode)
{
if (blendMode != data->blendMode) {
switch (blendMode) {
case SDL_BLENDMODE_NONE:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
data->glDisable(GL_BLEND);
break;
case SDL_BLENDMODE_MASK:
case SDL_BLENDMODE_BLEND:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
break;
case SDL_BLENDMODE_ADD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
break;
case SDL_BLENDMODE_MOD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND);
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);
break;
}
data->blendMode = blendMode;
}
}
static int static int
GL_ActivateRenderer(SDL_Renderer * renderer) GL_ActivateRenderer(SDL_Renderer * renderer)
{ {
@ -476,7 +512,7 @@ power_of_2(int input)
//#define DEBUG_PROGRAM_COMPILE 1 //#define DEBUG_PROGRAM_COMPILE 1
static GLuint static GLuint
compile_shader(GL_RenderData *data, GLenum shader_type, const char *_code) compile_shader(GL_RenderData * data, GLenum shader_type, const char *_code)
{ {
const int have_texture_rects = data->GL_ARB_texture_rectangle_supported; const int have_texture_rects = data->GL_ARB_texture_rectangle_supported;
const char *replacement = have_texture_rects ? "RECT" : "2D"; const char *replacement = have_texture_rects ? "RECT" : "2D";
@ -496,16 +532,17 @@ compile_shader(GL_RenderData *data, GLenum shader_type, const char *_code)
if (code == NULL) if (code == NULL)
return 0; return 0;
for (ptr = SDL_strstr(code, token); ptr; ptr = SDL_strstr(ptr+1, token)) { for (ptr = SDL_strstr(code, token); ptr; ptr = SDL_strstr(ptr + 1, token)) {
memcpy(ptr, replacement, replacementlen); memcpy(ptr, replacement, replacementlen);
memmove(ptr+replacementlen, ptr+tokenlen, strlen(ptr+tokenlen)+1); memmove(ptr + replacementlen, ptr + tokenlen,
strlen(ptr + tokenlen) + 1);
} }
#if DEBUG_PROGRAM_COMPILE #if DEBUG_PROGRAM_COMPILE
printf("compiling shader:\n%s\n\n", code); printf("compiling shader:\n%s\n\n", code);
#endif #endif
data->glGetError(); /* flush any existing error state. */ data->glGetError(); /* flush any existing error state. */
data->glGenProgramsARB(1, &program); data->glGenProgramsARB(1, &program);
data->glBindProgramARB(shader_type, program); data->glBindProgramARB(shader_type, program);
data->glProgramStringARB(shader_type, GL_PROGRAM_FORMAT_ASCII_ARB, data->glProgramStringARB(shader_type, GL_PROGRAM_FORMAT_ASCII_ARB,
@ -513,15 +550,14 @@ compile_shader(GL_RenderData *data, GLenum shader_type, const char *_code)
SDL_free(code); SDL_free(code);
if (data->glGetError() == GL_INVALID_OPERATION) if (data->glGetError() == GL_INVALID_OPERATION) {
{
#if DEBUG_PROGRAM_COMPILE #if DEBUG_PROGRAM_COMPILE
GLint pos = 0; GLint pos = 0;
const GLubyte *errstr; const GLubyte *errstr;
data->glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); data->glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
errstr = data->glGetString(GL_PROGRAM_ERROR_STRING_ARB); errstr = data->glGetString(GL_PROGRAM_ERROR_STRING_ARB);
printf("program compile error at position %d: %s\n\n", printf("program compile error at position %d: %s\n\n",
(int) pos, (const char *) errstr); (int) pos, (const char *) errstr);
#endif #endif
data->glBindProgramARB(shader_type, 0); data->glBindProgramARB(shader_type, 0);
data->glDeleteProgramsARB(1, &program); data->glDeleteProgramsARB(1, &program);
@ -544,49 +580,33 @@ compile_shader(GL_RenderData *data, GLenum shader_type, const char *_code)
* !!! FIXME: this ignores blendmodes, etc. * !!! FIXME: this ignores blendmodes, etc.
* !!! FIXME: this could be more efficient...use a dot product for green, etc. * !!! FIXME: this could be more efficient...use a dot product for green, etc.
*/ */
static const char *fragment_program_UYVY_source_code = static const char *fragment_program_UYVY_source_code = "!!ARBfp1.0\n"
"!!ARBfp1.0\n"
/* outputs... */ /* outputs... */
"OUTPUT outcolor = result.color;\n" "OUTPUT outcolor = result.color;\n"
/* scratch registers... */ /* scratch registers... */
"TEMP uyvy;\n" "TEMP uyvy;\n" "TEMP luminance;\n" "TEMP work;\n"
"TEMP luminance;\n"
"TEMP work;\n"
/* Halve the coordinates to grab the correct 32 bits for the fragment. */ /* Halve the coordinates to grab the correct 32 bits for the fragment. */
"MUL work, fragment.texcoord, { 0.5, 1.0, 1.0, 1.0 };\n" "MUL work, fragment.texcoord, { 0.5, 1.0, 1.0, 1.0 };\n"
/* Sample the YUV texture. Cb, Y1, Cr, Y2, are stored in x, y, z, w. */ /* Sample the YUV texture. Cb, Y1, Cr, Y2, are stored in x, y, z, w. */
"TEX uyvy, work, texture[0], %TEXTURETARGET%;\n" "TEX uyvy, work, texture[0], %TEXTURETARGET%;\n"
/* Do subtractions (128/255, 16/255, 128/255, 16/255) */ /* Do subtractions (128/255, 16/255, 128/255, 16/255) */
"SUB uyvy, uyvy, { 0.501960784313726, 0.06274509803922, 0.501960784313726, 0.06274509803922 };\n" "SUB uyvy, uyvy, { 0.501960784313726, 0.06274509803922, 0.501960784313726, 0.06274509803922 };\n"
/* Choose the luminance component by texcoord. */ /* Choose the luminance component by texcoord. */
/* !!! FIXME: laziness wins out for now... just average Y1 and Y2. */ /* !!! FIXME: laziness wins out for now... just average Y1 and Y2. */
"ADD luminance, uyvy.yyyy, uyvy.wwww;\n" "ADD luminance, uyvy.yyyy, uyvy.wwww;\n"
"MUL luminance, luminance, { 0.5, 0.5, 0.5, 0.5 };\n" "MUL luminance, luminance, { 0.5, 0.5, 0.5, 0.5 };\n"
/* Multiply luminance by its magic value. */ /* Multiply luminance by its magic value. */
"MUL luminance, luminance, { 1.164, 1.164, 1.164, 1.164 };\n" "MUL luminance, luminance, { 1.164, 1.164, 1.164, 1.164 };\n"
/* uyvy.xyzw becomes Cr/Cr/Cb/Cb, with multiplications. */ /* uyvy.xyzw becomes Cr/Cr/Cb/Cb, with multiplications. */
"MUL uyvy, uyvy.zzxx, { 1.596, -0.813, 2.018, -0.391 };\n" "MUL uyvy, uyvy.zzxx, { 1.596, -0.813, 2.018, -0.391 };\n"
/* Add luminance to Cr and Cb, store to RGB channels. */ /* Add luminance to Cr and Cb, store to RGB channels. */
"ADD work.rgb, luminance, uyvy;\n" "ADD work.rgb, luminance, uyvy;\n"
/* Do final addition for Green channel. (!!! FIXME: this should be a DPH?) */ /* Do final addition for Green channel. (!!! FIXME: this should be a DPH?) */
"ADD work.g, work.g, uyvy.w;\n" "ADD work.g, work.g, uyvy.w;\n"
/* Make sure alpha channel is fully opaque. (!!! FIXME: blend modes!) */ /* Make sure alpha channel is fully opaque. (!!! FIXME: blend modes!) */
"MOV work.a, { 1.0 };\n" "MOV work.a, { 1.0 };\n"
/* Store out the final fragment color... */ /* Store out the final fragment color... */
"MOV outcolor, work;\n" "MOV outcolor, work;\n"
/* ...and we're done! */ /* ...and we're done! */
"END\n"; "END\n";
@ -801,14 +821,15 @@ GL_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
/* YUV formats use RGBA but are really two bytes per pixel */ /* YUV formats use RGBA but are really two bytes per pixel */
if (internalFormat == GL_RGBA && bytes_per_pixel(texture->format) < 4) { if (internalFormat == GL_RGBA && bytes_per_pixel(texture->format) < 4) {
data->HACK_RYAN_FIXME = 2; data->HACK_RYAN_FIXME = 2;
} else { } else {
data->HACK_RYAN_FIXME = 1; data->HACK_RYAN_FIXME = 1;
} }
texture_w /= data->HACK_RYAN_FIXME; texture_w /= data->HACK_RYAN_FIXME;
data->format = format; data->format = format;
data->formattype = type; data->formattype = type;
renderdata->glEnable(data->type);
renderdata->glBindTexture(data->type, data->texture); renderdata->glBindTexture(data->type, data->texture);
renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER, renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER,
GL_NEAREST); GL_NEAREST);
@ -894,6 +915,7 @@ GL_SetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture,
*palette++ = colors->b; *palette++ = colors->b;
++colors; ++colors;
} }
renderdata->glEnable(data->type);
renderdata->glBindTexture(data->type, data->texture); renderdata->glBindTexture(data->type, data->texture);
renderdata->glColorTableEXT(data->type, GL_RGB8, 256, GL_RGB, renderdata->glColorTableEXT(data->type, GL_RGB8, 256, GL_RGB,
GL_UNSIGNED_BYTE, data->palette); GL_UNSIGNED_BYTE, data->palette);
@ -934,7 +956,9 @@ SetupTextureUpdate(GL_RenderData * renderdata, SDL_Texture * texture,
} }
renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1); renderdata->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH, renderdata->glPixelStorei(GL_UNPACK_ROW_LENGTH,
(pitch / bytes_per_pixel(texture->format)) / ((GL_TextureData *)texture->driverdata)->HACK_RYAN_FIXME); (pitch / bytes_per_pixel(texture->format)) /
((GL_TextureData *) texture->driverdata)->
HACK_RYAN_FIXME);
} }
static int static int
@ -953,15 +977,15 @@ static int
GL_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) GL_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
return 0; return 0;
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
return -1; return -1;
} }
} }
@ -995,6 +1019,7 @@ GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
renderdata->glGetError(); renderdata->glGetError();
SetupTextureUpdate(renderdata, texture, pitch); SetupTextureUpdate(renderdata, texture, pitch);
renderdata->glEnable(data->type);
renderdata->glBindTexture(data->type, data->texture); renderdata->glBindTexture(data->type, data->texture);
renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w, renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w,
rect->h, data->format, data->formattype, rect->h, data->format, data->formattype,
@ -1043,17 +1068,57 @@ GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects,
} }
static int static int
GL_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, GL_SetDrawColor(SDL_Renderer * renderer)
const SDL_Rect * rect) {
return 0;
}
static int
GL_SetDrawBlendMode(SDL_Renderer * renderer)
{
return 0;
}
static int
GL_RenderFill(SDL_Renderer * renderer, 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);
data->glClearColor((GLclampf) r * inv255f, (GLclampf) g * inv255f, data->glColor4f((GLfloat) renderer->r * inv255f,
(GLclampf) b * inv255f, (GLclampf) a * inv255f); (GLfloat) renderer->g * inv255f,
data->glViewport(rect->x, window->h - rect->y, rect->w, rect->h); (GLfloat) renderer->b * inv255f,
data->glClear(GL_COLOR_BUFFER_BIT); (GLfloat) renderer->a * inv255f);
data->glViewport(0, 0, window->w, window->h); SetBlendMode(data, renderer->blendMode);
data->glRecti(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);
return 0;
}
static int
GL_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
{
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
//data->glLineWidth(1.0);
//data->glPointSize(1.0);
SetBlendMode(data, renderer->blendMode);
data->glColor4f((GLfloat) renderer->r * inv255f,
(GLfloat) renderer->g * inv255f,
(GLfloat) renderer->b * inv255f,
(GLfloat) renderer->a * inv255f);
if ((x1 == x2) && (y1 == y2)) {
data->glBegin(GL_POINTS);
data->glVertex2i(x1, y1);
data->glEnd();
} else {
data->glBegin(GL_LINES);
data->glVertex2i(x1, y1);
data->glVertex2i(x2, y2);
data->glEnd();
}
return 0; return 0;
} }
@ -1073,6 +1138,7 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
int pitch = texturedata->pitch; int pitch = texturedata->pitch;
SetupTextureUpdate(data, texture, pitch); SetupTextureUpdate(data, texture, pitch);
data->glEnable(texturedata->type);
data->glBindTexture(texturedata->type, texturedata->texture); data->glBindTexture(texturedata->type, texturedata->texture);
for (dirty = texturedata->dirty.list; dirty; dirty = dirty->next) { for (dirty = texturedata->dirty.list; dirty; dirty = dirty->next) {
SDL_Rect *rect = &dirty->rect; SDL_Rect *rect = &dirty->rect;
@ -1080,7 +1146,8 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
(void *) ((Uint8 *) texturedata->pixels + rect->y * pitch + (void *) ((Uint8 *) texturedata->pixels + rect->y * pitch +
rect->x * bpp); rect->x * bpp);
data->glTexSubImage2D(texturedata->type, 0, rect->x, rect->y, data->glTexSubImage2D(texturedata->type, 0, rect->x, rect->y,
rect->w / texturedata->HACK_RYAN_FIXME, rect->h, texturedata->format, rect->w / texturedata->HACK_RYAN_FIXME,
rect->h, texturedata->format,
texturedata->formattype, pixels); texturedata->formattype, pixels);
} }
SDL_ClearDirtyRects(&texturedata->dirty); SDL_ClearDirtyRects(&texturedata->dirty);
@ -1100,6 +1167,7 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
maxv = (GLfloat) (srcrect->y + srcrect->h) / texture->h; maxv = (GLfloat) (srcrect->y + srcrect->h) / texture->h;
maxv *= texturedata->texh; maxv *= texturedata->texh;
data->glEnable(texturedata->type);
data->glBindTexture(texturedata->type, texturedata->texture); data->glBindTexture(texturedata->type, texturedata->texture);
if (texture->modMode) { if (texture->modMode) {
@ -1111,31 +1179,7 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
data->glColor4f(1.0f, 1.0f, 1.0f, 1.0f); data->glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
} }
if (texture->blendMode != data->blendMode) { SetBlendMode(data, texture->blendMode);
switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
data->glDisable(GL_BLEND);
break;
case SDL_TEXTUREBLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
break;
case SDL_TEXTUREBLENDMODE_ADD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
break;
case SDL_TEXTUREBLENDMODE_MOD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND);
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);
break;
}
data->blendMode = texture->blendMode;
}
if (texture->scaleMode != data->scaleMode) { if (texture->scaleMode != data->scaleMode) {
switch (texture->scaleMode) { switch (texture->scaleMode) {
@ -1176,6 +1220,9 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
if (texturedata->shader != 0) { if (texturedata->shader != 0) {
data->glDisable(GL_FRAGMENT_PROGRAM_ARB); data->glDisable(GL_FRAGMENT_PROGRAM_ARB);
} }
data->glDisable(texturedata->type);
return 0; return 0;
} }
@ -1219,7 +1266,8 @@ GL_DestroyRenderer(SDL_Renderer * renderer)
data->glDisable(GL_FRAGMENT_PROGRAM_ARB); data->glDisable(GL_FRAGMENT_PROGRAM_ARB);
data->glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0); data->glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0);
if (data->fragment_program_UYVY != 0) { if (data->fragment_program_UYVY != 0) {
data->glDeleteProgramsARB(1, &data->fragment_program_UYVY); data->glDeleteProgramsARB(1,
&data->fragment_program_UYVY);
} }
} }

View File

@ -85,9 +85,8 @@ SDL_RenderDriver GL_ES_RenderDriver = {
SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED), SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA), SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
SDL_TEXTUREBLENDMODE_MOD),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST |
SDL_TEXTURESCALEMODE_SLOW), 2, SDL_TEXTURESCALEMODE_SLOW), 2,
{ {
@ -499,15 +498,15 @@ static int
GLES_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) GLES_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
return 0; return 0;
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
return -1; return -1;
} }
} }
@ -680,22 +679,22 @@ GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
if (texture->blendMode != data->blendMode) { if (texture->blendMode != data->blendMode) {
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_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);
break; break;
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); data->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
break; break;
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_SRC_ALPHA, GL_ONE); data->glBlendFunc(GL_SRC_ALPHA, GL_ONE);
break; break;
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); data->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
data->glEnable(GL_BLEND); data->glEnable(GL_BLEND);
data->glBlendFunc(GL_ZERO, GL_SRC_COLOR); data->glBlendFunc(GL_ZERO, GL_SRC_COLOR);

View File

@ -59,8 +59,8 @@ static int SW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, int markDirty, void **pixels, const SDL_Rect * rect, int markDirty, void **pixels,
int *pitch); int *pitch);
static void SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static int SW_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, static int SW_SetDrawColor(SDL_Renderer * renderer);
Uint8 a, const SDL_Rect * rect); static int SW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect);
static int SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect); const SDL_Rect * srcrect, const SDL_Rect * dstrect);
static void SW_RenderPresent(SDL_Renderer * renderer); static void SW_RenderPresent(SDL_Renderer * renderer);
@ -77,9 +77,8 @@ SDL_RenderDriver SW_RenderDriver = {
SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC), SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA), SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
SDL_TEXTUREBLENDMODE_MOD),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST),
14, 14,
{ {
@ -222,6 +221,13 @@ SW_CreateRenderer(SDL_Window * window, Uint32 flags)
} }
renderer->ActivateRenderer = SW_ActivateRenderer; renderer->ActivateRenderer = SW_ActivateRenderer;
renderer->DisplayModeChanged = SW_DisplayModeChanged; renderer->DisplayModeChanged = SW_DisplayModeChanged;
renderer->SetDrawColor = SW_SetDrawColor;
/* FIXME : Implement
renderer->SetDrawBlendMode = GL_SetDrawBlendMode;
renderer->RenderLine = GL_RenderLine;
*/
renderer->RenderFill = SW_RenderFill; renderer->RenderFill = SW_RenderFill;
renderer->RenderCopy = SW_RenderCopy; renderer->RenderCopy = SW_RenderCopy;
renderer->RenderPresent = SW_RenderPresent; renderer->RenderPresent = SW_RenderPresent;
@ -520,8 +526,13 @@ SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
} }
static int static int
SW_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, SW_SetDrawColor(SDL_Renderer * renderer)
const SDL_Rect * rect) {
return 0;
}
static int
SW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect)
{ {
SW_RenderData *data = (SW_RenderData *) renderer->driverdata; SW_RenderData *data = (SW_RenderData *) renderer->driverdata;
Uint32 color; Uint32 color;
@ -532,7 +543,8 @@ SW_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a,
SDL_AddDirtyRect(&data->dirty, rect); SDL_AddDirtyRect(&data->dirty, rect);
} }
color = SDL_MapRGBA(data->surface.format, r, g, b, a); color = SDL_MapRGBA(data->surface.format,
renderer->r, renderer->g, renderer->b, renderer->a);
if (data->renderer->LockTexture(data->renderer, if (data->renderer->LockTexture(data->renderer,
data->texture[data->current_texture], data->texture[data->current_texture],

View File

@ -140,7 +140,7 @@ SDL_CreateRGBSurface(Uint32 flags,
/* By default surface with an alpha mask are set up for blending */ /* By default surface with an alpha mask are set up for blending */
if (Amask) { if (Amask) {
SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_BLEND); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);
} }
/* The surface is ready to go */ /* The surface is ready to go */
@ -336,7 +336,7 @@ SDL_ConvertColorkeyToAlpha(SDL_Surface * surface)
SDL_UnlockSurface(surface); SDL_UnlockSurface(surface);
SDL_SetColorKey(surface, 0, 0); SDL_SetColorKey(surface, 0, 0);
SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_BLEND); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND);
} }
int int
@ -434,18 +434,18 @@ SDL_SetSurfaceBlendMode(SDL_Surface * surface, int blendMode)
surface->map->info.flags &= surface->map->info.flags &=
~(SDL_COPY_MASK | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD); ~(SDL_COPY_MASK | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD);
switch (blendMode) { switch (blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
break; break;
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
surface->map->info.flags |= SDL_COPY_MASK; surface->map->info.flags |= SDL_COPY_MASK;
break; break;
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
surface->map->info.flags |= SDL_COPY_BLEND; surface->map->info.flags |= SDL_COPY_BLEND;
break; break;
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
surface->map->info.flags |= SDL_COPY_ADD; surface->map->info.flags |= SDL_COPY_ADD;
break; break;
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
surface->map->info.flags |= SDL_COPY_MOD; surface->map->info.flags |= SDL_COPY_MOD;
break; break;
default: default:
@ -483,19 +483,19 @@ SDL_GetSurfaceBlendMode(SDL_Surface * surface, int *blendMode)
info.flags & (SDL_COPY_MASK | SDL_COPY_BLEND | SDL_COPY_ADD | info.flags & (SDL_COPY_MASK | SDL_COPY_BLEND | SDL_COPY_ADD |
SDL_COPY_MOD)) { SDL_COPY_MOD)) {
case SDL_COPY_MASK: case SDL_COPY_MASK:
*blendMode = SDL_TEXTUREBLENDMODE_MASK; *blendMode = SDL_BLENDMODE_MASK;
break; break;
case SDL_COPY_BLEND: case SDL_COPY_BLEND:
*blendMode = SDL_TEXTUREBLENDMODE_BLEND; *blendMode = SDL_BLENDMODE_BLEND;
break; break;
case SDL_COPY_ADD: case SDL_COPY_ADD:
*blendMode = SDL_TEXTUREBLENDMODE_ADD; *blendMode = SDL_BLENDMODE_ADD;
break; break;
case SDL_COPY_MOD: case SDL_COPY_MOD:
*blendMode = SDL_TEXTUREBLENDMODE_MOD; *blendMode = SDL_BLENDMODE_MOD;
break; break;
default: default:
*blendMode = SDL_TEXTUREBLENDMODE_NONE; *blendMode = SDL_BLENDMODE_NONE;
break; break;
} }
return 0; return 0;
@ -835,7 +835,7 @@ SDL_ConvertSurface(SDL_Surface * surface, SDL_PixelFormat * format,
* alpha channel or alpha modulation */ * alpha channel or alpha modulation */
if ((surface->format->Amask && format->Amask) || if ((surface->format->Amask && format->Amask) ||
(copy_flags & SDL_COPY_MODULATE_ALPHA)) { (copy_flags & SDL_COPY_MODULATE_ALPHA)) {
SDL_SetSurfaceBlendMode(convert, SDL_TEXTUREBLENDMODE_BLEND); SDL_SetSurfaceBlendMode(convert, SDL_BLENDMODE_BLEND);
} }
if ((copy_flags & SDL_COPY_RLE_DESIRED) || (flags & SDL_RLEACCEL)) { if ((copy_flags & SDL_COPY_RLE_DESIRED) || (flags & SDL_RLEACCEL)) {
SDL_SetSurfaceRLE(convert, SDL_RLEACCEL); SDL_SetSurfaceRLE(convert, SDL_RLEACCEL);

View File

@ -88,8 +88,11 @@ 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, Uint8 r, Uint8 g, Uint8 b, int (*SetDrawColor) (SDL_Renderer * renderer);
Uint8 a, const SDL_Rect * rect); int (*SetDrawBlendMode) (SDL_Renderer * renderer);
int (*RenderLine) (SDL_Renderer * renderer, int x1, int y1, int x2,
int y2);
int (*RenderFill) (SDL_Renderer * renderer, 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);
void (*RenderPresent) (SDL_Renderer * renderer); void (*RenderPresent) (SDL_Renderer * renderer);
@ -103,6 +106,9 @@ struct SDL_Renderer
/* The window associated with the renderer */ /* The window associated with the renderer */
SDL_WindowID window; SDL_WindowID window;
Uint8 r, g, b, a; /**< Color for drawing operations values */
int blendMode; /**< The drawing blend mode */
void *driverdata; void *driverdata;
}; };

View File

@ -1975,7 +1975,104 @@ SDL_DirtyTexture(SDL_TextureID textureID, int numrects,
} }
int int
SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect) SDL_SetRenderDrawColor(Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) {
return -1;
}
if (!renderer->SetDrawColor) {
SDL_Unsupported();
return -1;
}
renderer->r = r;
renderer->g = g;
renderer->b = b;
renderer->a = a;
renderer->SetDrawColor(renderer);
return 0;
}
int
SDL_GetRenderDrawColor(Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) {
return -1;
}
if (!renderer->SetDrawColor) {
SDL_Unsupported();
return -1;
}
if (r) {
*r = renderer->r;
}
if (g) {
*g = renderer->g;
}
if (b) {
*b = renderer->b;
}
if (a) {
*a = renderer->a;
}
return 0;
}
int
SDL_SetRenderDrawBlendMode(int blendMode)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) {
return -1;
}
if (!renderer->SetDrawBlendMode) {
SDL_Unsupported();
return -1;
}
renderer->blendMode = blendMode;
renderer->SetDrawBlendMode(renderer);
return 0;
}
int
SDL_GetRenderDrawBlendMode(int *blendMode)
{
SDL_Renderer *renderer;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) {
return -1;
}
*blendMode = renderer->blendMode;
return 0;
}
int
SDL_RenderFill(const SDL_Rect * rect)
{ {
SDL_Renderer *renderer; SDL_Renderer *renderer;
SDL_Window *window; SDL_Window *window;
@ -2003,7 +2100,42 @@ SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect)
return 0; return 0;
} }
} }
return renderer->RenderFill(renderer, r, g, b, a, &real_rect); return renderer->RenderFill(renderer, &real_rect);
}
int
SDL_RenderLine(int x1, int y1, int x2, int y2)
{
SDL_Renderer *renderer;
SDL_Window *window;
SDL_Rect real_rect;
if (!_this) {
SDL_UninitializedVideo();
return -1;
}
renderer = SDL_CurrentDisplay.current_renderer;
if (!renderer) {
return -1;
}
if (!renderer->RenderLine) {
SDL_Unsupported();
return -1;
}
#if 0
//FIXME: Need line intersect routine
window = SDL_GetWindowFromID(renderer->window);
real_rect.x = 0;
real_rect.y = 0;
real_rect.w = window->w;
real_rect.h = window->h;
if (rect) {
if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) {
return 0;
}
}
#endif
return renderer->RenderLine(renderer, x1, y1, x2, y2);
} }
int int

View File

@ -71,8 +71,12 @@ static void DirectFB_UnlockTexture(SDL_Renderer * renderer,
static void DirectFB_DirtyTexture(SDL_Renderer * renderer, static void DirectFB_DirtyTexture(SDL_Renderer * renderer,
SDL_Texture * texture, int numrects, SDL_Texture * texture, int numrects,
const SDL_Rect * rects); const SDL_Rect * rects);
static int DirectFB_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, static int DirectFB_SetDrawColor(SDL_Renderer * renderer);
Uint8 b, Uint8 a, const SDL_Rect * rect); static int DirectFB_SetDrawBlendMode(SDL_Renderer * renderer);
static int DirectFB_RenderLine(SDL_Renderer * renderer, int x1, int y1,
int x2, int y2);
static int DirectFB_RenderFill(SDL_Renderer * renderer,
const SDL_Rect * rect);
static int DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * srcrect,
const SDL_Rect * dstrect); const SDL_Rect * dstrect);
@ -91,9 +95,8 @@ SDL_RenderDriver DirectFB_RenderDriver = {
SDL_RENDERER_ACCELERATED), SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA), SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
SDL_TEXTUREBLENDMODE_MOD),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST |
SDL_TEXTURESCALEMODE_SLOW | SDL_TEXTURESCALEMODE_BEST), SDL_TEXTURESCALEMODE_SLOW | SDL_TEXTURESCALEMODE_BEST),
14, 14,
@ -122,6 +125,9 @@ typedef struct
DFBSurfaceFlipFlags flipflags; DFBSurfaceFlipFlags flipflags;
int isyuvdirect; int isyuvdirect;
int size_changed; int size_changed;
int lastBlendMode;
DFBSurfaceBlittingFlags blitFlags;
DFBSurfaceDrawingFlags drawFlags;
} DirectFB_RenderData; } DirectFB_RenderData;
typedef struct typedef struct
@ -147,6 +153,79 @@ SDLtoDFBRect(const SDL_Rect * sr, DFBRectangle * dr)
dr->w = sr->w; dr->w = sr->w;
} }
static int
TextureHasAlpha(DirectFB_TextureData * data)
{
/* Drawing primitive ? */
if (!data)
return 0;
switch (data->format) {
case SDL_PIXELFORMAT_INDEX4LSB:
case SDL_PIXELFORMAT_ARGB4444:
case SDL_PIXELFORMAT_ARGB1555:
case SDL_PIXELFORMAT_ARGB8888:
case SDL_PIXELFORMAT_RGBA8888:
case SDL_PIXELFORMAT_ABGR8888:
case SDL_PIXELFORMAT_BGRA8888:
case SDL_PIXELFORMAT_ARGB2101010:
return 1;
default:
return 0;
}
}
static void
SetBlendMode(DirectFB_RenderData * data, int blendMode,
DirectFB_TextureData * source)
{
//FIXME: check for format change
if (1 || data->lastBlendMode != blendMode) {
switch (blendMode) {
case SDL_BLENDMODE_NONE:
/**< No blending */
data->blitFlags = DSBLIT_NOFX;
data->drawFlags = DSDRAW_NOFX;
data->surface->SetSrcBlendFunction(data->surface, DSBF_ONE);
data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO);
break;
case SDL_BLENDMODE_MASK:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
data->drawFlags = DSDRAW_BLEND;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface,
DSBF_INVSRCALPHA);
break;
case SDL_BLENDMODE_BLEND:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
data->drawFlags = DSDRAW_BLEND;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface,
DSBF_INVSRCALPHA);
break;
case SDL_BLENDMODE_ADD:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
data->drawFlags = DSDRAW_BLEND;
//FIXME: SRCALPHA kills performance on radeon ...
//Eventually use a premultiplied texture
if (0 && TextureHasAlpha(source))
data->surface->SetSrcBlendFunction(data->surface,
DSBF_SRCALPHA);
else
data->surface->SetSrcBlendFunction(data->surface, DSBF_ONE);
data->surface->SetDstBlendFunction(data->surface, DSBF_ONE);
break;
case SDL_BLENDMODE_MOD:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
data->drawFlags = DSDRAW_BLEND;
data->surface->SetSrcBlendFunction(data->surface, DSBF_DESTCOLOR);
data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO);
break;
}
data->lastBlendMode = blendMode;
}
}
void void
DirectFB_AddRenderDriver(_THIS) DirectFB_AddRenderDriver(_THIS)
{ {
@ -214,6 +293,9 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->LockTexture = DirectFB_LockTexture; renderer->LockTexture = DirectFB_LockTexture;
renderer->UnlockTexture = DirectFB_UnlockTexture; renderer->UnlockTexture = DirectFB_UnlockTexture;
renderer->DirtyTexture = DirectFB_DirtyTexture; renderer->DirtyTexture = DirectFB_DirtyTexture;
renderer->SetDrawColor = DirectFB_SetDrawColor;
renderer->SetDrawBlendMode = DirectFB_SetDrawBlendMode;
renderer->RenderLine = DirectFB_RenderLine;
renderer->RenderFill = DirectFB_RenderFill; renderer->RenderFill = DirectFB_RenderFill;
renderer->RenderCopy = DirectFB_RenderCopy; renderer->RenderCopy = DirectFB_RenderCopy;
renderer->RenderPresent = DirectFB_RenderPresent; renderer->RenderPresent = DirectFB_RenderPresent;
@ -304,7 +386,11 @@ SDLToDFBPixelFormat(Uint32 format)
case SDL_PIXELFORMAT_INDEX4MSB: case SDL_PIXELFORMAT_INDEX4MSB:
return DSPF_UNKNOWN; return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_RGB444: case SDL_PIXELFORMAT_RGB444:
#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2)
return DSPF_RGB444;
#else
return DSPF_UNKNOWN; return DSPF_UNKNOWN;
#endif
case SDL_PIXELFORMAT_BGR24: case SDL_PIXELFORMAT_BGR24:
return DSPF_UNKNOWN; return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_BGR888: case SDL_PIXELFORMAT_BGR888:
@ -576,15 +662,15 @@ static int
DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
return 0; return 0;
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
return -1; return -1;
} }
} }
@ -710,13 +796,73 @@ DirectFB_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
} }
static int static int
DirectFB_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, DirectFB_SetDrawColor(SDL_Renderer * renderer)
Uint8 a, const SDL_Rect * rect) {
return 0;
}
static int
DirectFB_SetDrawBlendMode(SDL_Renderer * renderer)
{
return 0;
}
static int
PrepareDraw(SDL_Renderer * renderer)
{
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
DFBResult ret;
Uint8 r, g, b, a;
r = renderer->r;
g = renderer->g;
b = renderer->b;
a = renderer->a;
SetBlendMode(data, renderer->blendMode, NULL);
SDL_DFB_CHECKERR(data->surface->
SetDrawingFlags(data->surface, data->drawFlags));
switch (renderer->blendMode) {
case SDL_BLENDMODE_NONE:
case SDL_BLENDMODE_MASK:
case SDL_BLENDMODE_BLEND:
break;
case SDL_BLENDMODE_ADD:
case SDL_BLENDMODE_MOD:
r = ((int) r * (int) a) / 255;
g = ((int) g * (int) a) / 255;
b = ((int) b * (int) a) / 255;
a = 255;
break;
}
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, r, g, b, a));
return 0;
error:
return -1;
}
static int
DirectFB_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
{ {
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
DFBResult ret; DFBResult ret;
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, r, g, b, a)); PrepareDraw(renderer);
SDL_DFB_CHECKERR(data->surface->DrawLine(data->surface, x1, y1, x2, y2));
return 0;
error:
return -1;
}
static int
DirectFB_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect)
{
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
DFBResult ret;
PrepareDraw(renderer);
SDL_DFB_CHECKERR(data->surface-> SDL_DFB_CHECKERR(data->surface->
FillRectangle(data->surface, rect->x, rect->y, rect->w, FillRectangle(data->surface, rect->x, rect->y, rect->w,
rect->h)); rect->h));
@ -733,6 +879,7 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
DirectFB_TextureData *texturedata = DirectFB_TextureData *texturedata =
(DirectFB_TextureData *) texture->driverdata; (DirectFB_TextureData *) texture->driverdata;
Uint8 alpha = 0xFF;
DFBResult ret; DFBResult ret;
if (texturedata->display) { if (texturedata->display) {
@ -772,68 +919,45 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
} }
SDL_ClearDirtyRects(&texturedata->dirty); SDL_ClearDirtyRects(&texturedata->dirty);
} }
SDLtoDFBRect(srcrect, &sr);
SDLtoDFBRect(dstrect, &dr);
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, 0xFF,
0xFF, 0xFF, 0xFF));
if (texture->
modMode & (SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA))
{
if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA) {
alpha = texture->a;
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, 0xFF,
0xFF, 0xFF, alpha));
}
if (texture->modMode & SDL_TEXTUREMODULATE_COLOR) {
SDL_DFB_CHECKERR(data->surface->
SetColor(data->surface, texture->r,
texture->g, texture->b, alpha));
flags |= DSBLIT_COLORIZE;
}
if (alpha < 0xFF)
flags |= DSBLIT_SRC_PREMULTCOLOR;
} else
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, 0xFF,
0xFF, 0xFF, 0xFF));
SetBlendMode(data, texture->blendMode, texturedata);
SDL_DFB_CHECKERR(data->surface->
SetBlittingFlags(data->surface,
data->blitFlags | flags));
#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) #if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2)
SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface, SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface,
texturedata-> texturedata->
render_options)); render_options));
#endif #endif
SDLtoDFBRect(srcrect, &sr);
SDLtoDFBRect(dstrect, &dr);
if (texture->
modMode & (SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA))
{
Uint8 alpha = 0xFF;
if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA) {
alpha = texture->a;
flags |= DSBLIT_SRC_PREMULTCOLOR;
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, 0xFF,
0xFF, 0xFF, alpha));
}
if (texture->modMode & SDL_TEXTUREMODULATE_COLOR) {
SDL_DFB_CHECKERR(data->surface->
SetColor(data->surface, texture->r,
texture->g, texture->b, alpha));
/* Only works together .... */
flags |= DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR;
}
}
switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE:
/**< No blending */
flags |= DSBLIT_NOFX;
data->surface->SetSrcBlendFunction(data->surface, DSBF_ONE);
data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO);
break;
case SDL_TEXTUREBLENDMODE_MASK:
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface,
DSBF_INVSRCALPHA);
break;
case SDL_TEXTUREBLENDMODE_BLEND:
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface,
DSBF_INVSRCALPHA);
break;
case SDL_TEXTUREBLENDMODE_ADD:
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface, DSBF_ONE);
break;
case SDL_TEXTUREBLENDMODE_MOD:
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_DESTCOLOR);
data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO);
break;
}
SDL_DFB_CHECKERR(data->surface->
SetBlittingFlags(data->surface, flags));
if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) { if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) {
SDL_DFB_CHECKERR(data->surface-> SDL_DFB_CHECKERR(data->surface->
Blit(data->surface, texturedata->surface, Blit(data->surface, texturedata->surface,

View File

@ -31,8 +31,9 @@
static SDL_Renderer *SDL_DUMMY_CreateRenderer(SDL_Window * window, static SDL_Renderer *SDL_DUMMY_CreateRenderer(SDL_Window * window,
Uint32 flags); Uint32 flags);
static int SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, static int SDL_DUMMY_SetDrawColor(SDL_Renderer * renderer);
Uint8 b, Uint8 a, const SDL_Rect * rect); static int SDL_DUMMY_RenderFill(SDL_Renderer * renderer,
const SDL_Rect * rect);
static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer, static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer,
SDL_Texture * texture, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * srcrect,
@ -88,6 +89,7 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
} }
SDL_zerop(data); SDL_zerop(data);
renderer->SetDrawColor = SDL_DUMMY_SetDrawColor;
renderer->RenderFill = SDL_DUMMY_RenderFill; renderer->RenderFill = SDL_DUMMY_RenderFill;
renderer->RenderCopy = SDL_DUMMY_RenderCopy; renderer->RenderCopy = SDL_DUMMY_RenderCopy;
renderer->RenderPresent = SDL_DUMMY_RenderPresent; renderer->RenderPresent = SDL_DUMMY_RenderPresent;
@ -124,8 +126,13 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)
} }
static int static int
SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, SDL_DUMMY_SetDrawColor(SDL_Renderer * renderer)
Uint8 a, const SDL_Rect * rect) {
return 0;
}
static int
SDL_DUMMY_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect)
{ {
SDL_DUMMY_RenderData *data = SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata; (SDL_DUMMY_RenderData *) renderer->driverdata;
@ -133,7 +140,8 @@ SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b,
Uint32 color; Uint32 color;
SDL_Rect real_rect = *rect; SDL_Rect real_rect = *rect;
color = SDL_MapRGBA(target->format, r, g, b, a); color = SDL_MapRGBA(target->format,
renderer->r, renderer->g, renderer->b, renderer->a);
return SDL_FillRect(target, &real_rect, color); return SDL_FillRect(target, &real_rect, color);
} }

View File

@ -140,7 +140,7 @@ SDL_RenderDriver NDS_RenderDriver = {
{"nds", /* char* name */ {"nds", /* char* name */
(SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC), /* u32 flags */ (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC), /* u32 flags */
(SDL_TEXTUREMODULATE_NONE), /* u32 mod_modes */ (SDL_TEXTUREMODULATE_NONE), /* u32 mod_modes */
(SDL_TEXTUREBLENDMODE_MASK), /* u32 blend_modes */ (SDL_BLENDMODE_MASK), /* u32 blend_modes */
(SDL_TEXTURESCALEMODE_FAST), /* u32 scale_modes */ (SDL_TEXTURESCALEMODE_FAST), /* u32 scale_modes */
3, /* u32 num_texture_formats */ 3, /* u32 num_texture_formats */
{ {

View File

@ -82,9 +82,8 @@ SDL_RenderDriver D3D_RenderDriver = {
SDL_RENDERER_ACCELERATED), SDL_RENDERER_ACCELERATED),
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA), SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD),
SDL_TEXTUREBLENDMODE_MOD),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST |
SDL_TEXTURESCALEMODE_SLOW | SDL_TEXTURESCALEMODE_BEST), SDL_TEXTURESCALEMODE_SLOW | SDL_TEXTURESCALEMODE_BEST),
12, 12,
@ -525,15 +524,15 @@ static int
D3D_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) D3D_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
return 0; return 0;
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
return -1; return -1;
} }
} }
@ -798,12 +797,12 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
vertices[3].v = maxv; vertices[3].v = maxv;
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
FALSE); FALSE);
break; break;
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
TRUE); TRUE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
@ -811,7 +810,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_INVSRCALPHA); D3DBLEND_INVSRCALPHA);
break; break;
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
TRUE); TRUE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
@ -819,7 +818,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_ONE); D3DBLEND_ONE);
break; break;
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
TRUE); TRUE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND, IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,

View File

@ -73,8 +73,7 @@ SDL_RenderDriver GDI_RenderDriver = {
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_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND),
SDL_TEXTUREBLENDMODE_BLEND),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST),
14, 14,
{ {
@ -459,13 +458,13 @@ static int
GDI_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) GDI_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
return 0; return 0;
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
return -1; return -1;
} }
} }
@ -617,8 +616,7 @@ 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 (texture->blendMode & if (texture->blendMode & (SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND)) {
(SDL_TEXTUREBLENDMODE_MASK | SDL_TEXTUREBLENDMODE_BLEND)) {
BLENDFUNCTION blendFunc = { BLENDFUNCTION blendFunc = {
AC_SRC_OVER, AC_SRC_OVER,
0, 0,

View File

@ -47,8 +47,11 @@ static int X11_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, int markDirty, const SDL_Rect * rect, int markDirty,
void **pixels, int *pitch); void **pixels, int *pitch);
static void X11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void X11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static int X11_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, static int X11_SetDrawColor(SDL_Renderer * renderer);
Uint8 a, const SDL_Rect * rect); static int X11_SetDrawBlendMode(SDL_Renderer * renderer);
static int X11_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2,
int y2);
static int X11_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect);
static int X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect); const SDL_Rect * srcrect, const SDL_Rect * dstrect);
static void X11_RenderPresent(SDL_Renderer * renderer); static void X11_RenderPresent(SDL_Renderer * renderer);
@ -65,7 +68,7 @@ SDL_RenderDriver X11_RenderDriver = {
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_NONE,
SDL_TEXTUREBLENDMODE_NONE, SDL_BLENDMODE_NONE,
SDL_TEXTURESCALEMODE_NONE, SDL_TEXTURESCALEMODE_NONE,
0, 0,
{0}, {0},
@ -191,6 +194,9 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->UpdateTexture = X11_UpdateTexture; renderer->UpdateTexture = X11_UpdateTexture;
renderer->LockTexture = X11_LockTexture; renderer->LockTexture = X11_LockTexture;
renderer->UnlockTexture = X11_UnlockTexture; renderer->UnlockTexture = X11_UnlockTexture;
renderer->SetDrawColor = X11_SetDrawColor;
renderer->SetDrawBlendMode = X11_SetDrawBlendMode;
renderer->RenderLine = X11_RenderLine;
renderer->RenderFill = X11_RenderFill; renderer->RenderFill = X11_RenderFill;
renderer->RenderCopy = X11_RenderCopy; renderer->RenderCopy = X11_RenderCopy;
renderer->RenderPresent = X11_RenderPresent; renderer->RenderPresent = X11_RenderPresent;
@ -445,11 +451,11 @@ static int
X11_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) X11_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
return 0; return 0;
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
return -1; return -1;
} }
} }
@ -552,8 +558,73 @@ X11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
} }
static int static int
X11_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, X11_SetDrawColor(SDL_Renderer * renderer)
const SDL_Rect * rect) {
return 0;
}
static int
X11_SetDrawBlendMode(SDL_Renderer * renderer)
{
switch (renderer->blendMode) {
case SDL_BLENDMODE_NONE:
return 0;
default:
SDL_Unsupported();
renderer->blendMode = SDL_BLENDMODE_NONE;
return -1;
}
}
static Uint32
renderdrawcolor(SDL_Renderer * renderer, int premult)
{
X11_RenderData *data = (X11_RenderData *) renderer->driverdata;
Uint8 r = renderer->r;
Uint8 g = renderer->g;
Uint8 b = renderer->b;
Uint8 a = renderer->a;
if (premult)
return SDL_MapRGBA(data->format, ((int) r * (int) a) / 255,
((int) g * (int) a) / 255,
((int) b * (int) a) / 255, 255);
else
return SDL_MapRGBA(data->format, r, g, b, a);
}
static int
X11_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2)
{
X11_RenderData *data = (X11_RenderData *) renderer->driverdata;
unsigned long foreground;
if (data->makedirty) {
SDL_Rect rect;
if (x1 < x2) {
rect.x = x1;
rect.w = (x2 - x1) + 1;
} else {
rect.x = x2;
rect.w = (x1 - x2) + 1;
}
if (y1 < y2) {
rect.y = y1;
rect.h = (y2 - y1) + 1;
} else {
rect.y = y2;
rect.h = (y1 - y2) + 1;
}
SDL_AddDirtyRect(&data->dirty, &rect);
}
foreground = renderdrawcolor(renderer, 1);
XSetForeground(data->display, data->gc, foreground);
XDrawLine(data->display, data->drawable, data->gc, x1, y1, x2, y2);
}
static int
X11_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect)
{ {
X11_RenderData *data = (X11_RenderData *) renderer->driverdata; X11_RenderData *data = (X11_RenderData *) renderer->driverdata;
unsigned long foreground; unsigned long foreground;
@ -562,9 +633,9 @@ X11_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a,
SDL_AddDirtyRect(&data->dirty, rect); SDL_AddDirtyRect(&data->dirty, rect);
} }
foreground = SDL_MapRGBA(data->format, r, g, b, a); foreground = renderdrawcolor(renderer, 1);
XSetForeground(data->display, data->gc, foreground); XSetForeground(data->display, data->gc, foreground);
XDrawRectangle(data->display, data->drawable, data->gc, rect->x, rect->y, XFillRectangle(data->display, data->drawable, data->gc, rect->x, rect->y,
rect->w, rect->h); rect->w, rect->h);
return 0; return 0;
} }

View File

@ -51,6 +51,7 @@ SDL_X11_SYM(int,XDeleteProperty,(Display* a,Window b,Atom c),(a,b,c),return)
SDL_X11_SYM(int,XDestroyWindow,(Display* a,Window b),(a,b),return) SDL_X11_SYM(int,XDestroyWindow,(Display* a,Window b),(a,b),return)
SDL_X11_SYM(int,XDisplayKeycodes,(Display* a,int* b,int* c),(a,b,c),return) SDL_X11_SYM(int,XDisplayKeycodes,(Display* a,int* b,int* c),(a,b,c),return)
SDL_X11_SYM(int,XDrawRectangle,(Display* a,Drawable b,GC c,int d, int e, unsigned int f, unsigned int g),(a,b,c,d,e,f,g),return) SDL_X11_SYM(int,XDrawRectangle,(Display* a,Drawable b,GC c,int d, int e, unsigned int f, unsigned int g),(a,b,c,d,e,f,g),return)
SDL_X11_SYM(int,XFillRectangle,(Display* a,Drawable b,GC c,int d, int e, unsigned int f, unsigned int g),(a,b,c,d,e,f,g),return)
SDL_X11_SYM(char*,XDisplayName,(_Xconst char* a),(a),return) SDL_X11_SYM(char*,XDisplayName,(_Xconst char* a),(a),return)
SDL_X11_SYM(int,XEventsQueued,(Display* a,int b),(a,b),return) SDL_X11_SYM(int,XEventsQueued,(Display* a,int b),(a,b),return)
SDL_X11_SYM(Bool,XFilterEvent,(XEvent *event,Window w),(event,w),return) SDL_X11_SYM(Bool,XFilterEvent,(XEvent *event,Window w),(event,w),return)
@ -94,6 +95,7 @@ SDL_X11_SYM(Display*,XOpenDisplay,(_Xconst char* a),(a),return)
SDL_X11_SYM(int,XPeekEvent,(Display* a,XEvent* b),(a,b),return) SDL_X11_SYM(int,XPeekEvent,(Display* a,XEvent* b),(a,b),return)
SDL_X11_SYM(int,XPending,(Display* a),(a),return) SDL_X11_SYM(int,XPending,(Display* a),(a),return)
SDL_X11_SYM(int,XPutImage,(Display* a,Drawable b,GC c,XImage* d,int e,int f,int g,int h,unsigned int i,unsigned int j),(a,b,c,d,e,f,g,h,i,j),return) SDL_X11_SYM(int,XPutImage,(Display* a,Drawable b,GC c,XImage* d,int e,int f,int g,int h,unsigned int i,unsigned int j),(a,b,c,d,e,f,g,h,i,j),return)
SDL_X11_SYM(int,XDrawLine,(Display* a, Drawable b, GC c, int d, int e, int f, int g),(a,b,c,d,e,f,g),return)
SDL_X11_SYM(int,XQueryColors,(Display* a,Colormap b,XColor* c,int d),(a,b,c,d),return) SDL_X11_SYM(int,XQueryColors,(Display* a,Colormap b,XColor* c,int d),(a,b,c,d),return)
SDL_X11_SYM(int,XQueryKeymap,(Display* a,char *b),(a,b),return) SDL_X11_SYM(int,XQueryKeymap,(Display* a,char *b),(a,b),return)
SDL_X11_SYM(Bool,XQueryPointer,(Display* a,Window b,Window* c,Window* d,int* e,int* f,int* g,int* h,unsigned int* i),(a,b,c,d,e,f,g,h,i),return) SDL_X11_SYM(Bool,XQueryPointer,(Display* a,Window b,Window* c,Window* d,int* e,int* f,int* g,int* h,unsigned int* i),(a,b,c,d,e,f,g,h,i),return)

View File

@ -322,19 +322,19 @@ static void
PrintBlendMode(Uint32 flag) PrintBlendMode(Uint32 flag)
{ {
switch (flag) { switch (flag) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
fprintf(stderr, "None"); fprintf(stderr, "None");
break; break;
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
fprintf(stderr, "Mask"); fprintf(stderr, "Mask");
break; break;
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
fprintf(stderr, "Blend"); fprintf(stderr, "Blend");
break; break;
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
fprintf(stderr, "Add"); fprintf(stderr, "Add");
break; break;
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
fprintf(stderr, "Mod"); fprintf(stderr, "Mod");
break; break;
default: default:

View File

@ -322,19 +322,19 @@ static void
PrintBlendMode(Uint32 flag) PrintBlendMode(Uint32 flag)
{ {
switch (flag) { switch (flag) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
fprintf(stderr, "None"); fprintf(stderr, "None");
break; break;
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
fprintf(stderr, "Mask"); fprintf(stderr, "Mask");
break; break;
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
fprintf(stderr, "Blend"); fprintf(stderr, "Blend");
break; break;
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
fprintf(stderr, "Add"); fprintf(stderr, "Add");
break; break;
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
fprintf(stderr, "Mod"); fprintf(stderr, "Mod");
break; break;
default: default:

View File

@ -322,19 +322,19 @@ static void
PrintBlendMode(Uint32 flag) PrintBlendMode(Uint32 flag)
{ {
switch (flag) { switch (flag) {
case SDL_TEXTUREBLENDMODE_NONE: case SDL_BLENDMODE_NONE:
fprintf(stderr, "None"); fprintf(stderr, "None");
break; break;
case SDL_TEXTUREBLENDMODE_MASK: case SDL_BLENDMODE_MASK:
fprintf(stderr, "Mask"); fprintf(stderr, "Mask");
break; break;
case SDL_TEXTUREBLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
fprintf(stderr, "Blend"); fprintf(stderr, "Blend");
break; break;
case SDL_TEXTUREBLENDMODE_ADD: case SDL_BLENDMODE_ADD:
fprintf(stderr, "Add"); fprintf(stderr, "Add");
break; break;
case SDL_TEXTUREBLENDMODE_MOD: case SDL_BLENDMODE_MOD:
fprintf(stderr, "Mod"); fprintf(stderr, "Mod");
break; break;
default: default:

View File

@ -21,7 +21,7 @@ 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;
static SDL_TextureBlendMode blendMode = SDL_TEXTUREBLENDMODE_MASK; static SDL_BlendMode blendMode = SDL_BLENDMODE_MASK;
static SDL_TextureScaleMode scaleMode = SDL_TEXTURESCALEMODE_NONE; static SDL_TextureScaleMode scaleMode = SDL_TEXTURESCALEMODE_NONE;
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */

View File

@ -20,7 +20,7 @@ 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;
static SDL_TextureBlendMode blendMode = SDL_TEXTUREBLENDMODE_MASK; static SDL_BlendMode blendMode = SDL_BLENDMODE_MASK;
static SDL_TextureScaleMode scaleMode = SDL_TEXTURESCALEMODE_NONE; static SDL_TextureScaleMode scaleMode = SDL_TEXTURESCALEMODE_NONE;
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
@ -119,7 +119,8 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
/* Move the sprite, bounce at the wall, and draw */ /* Move the sprite, bounce at the wall, and draw */
n = 0; n = 0;
SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderFill(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];
@ -166,19 +167,19 @@ main(int argc, char *argv[])
if (SDL_strcasecmp(argv[i], "--blend") == 0) { if (SDL_strcasecmp(argv[i], "--blend") == 0) {
if (argv[i + 1]) { if (argv[i + 1]) {
if (SDL_strcasecmp(argv[i + 1], "none") == 0) { if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
blendMode = SDL_TEXTUREBLENDMODE_NONE; blendMode = SDL_BLENDMODE_NONE;
consumed = 2; consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) { } else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) {
blendMode = SDL_TEXTUREBLENDMODE_MASK; blendMode = SDL_BLENDMODE_MASK;
consumed = 2; consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
blendMode = SDL_TEXTUREBLENDMODE_BLEND; blendMode = SDL_BLENDMODE_BLEND;
consumed = 2; consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
blendMode = SDL_TEXTUREBLENDMODE_ADD; blendMode = SDL_BLENDMODE_ADD;
consumed = 2; consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
blendMode = SDL_TEXTUREBLENDMODE_MOD; blendMode = SDL_BLENDMODE_MOD;
consumed = 2; consumed = 2;
} }
} }
@ -230,7 +231,8 @@ 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(0xA0, 0xA0, 0xA0, 0xFF, NULL); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderFill(NULL);
} }
if (LoadSprite("icon.bmp") < 0) { if (LoadSprite("icon.bmp") < 0) {
quit(2); quit(2);
@ -275,7 +277,8 @@ 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(0xA0, 0xA0, 0xA0, 0xFF, NULL); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderFill(NULL);
break; break;
} }
break; break;