From f8c4ad81ab95a4e4c314186d2c7e6c0f7c4c5a1f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 20 Dec 2008 12:00:00 +0000 Subject: [PATCH] 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. --- TODO | 1 + XCodeiPhoneOS/Demos/src/accelerometer.c | 2 +- XCodeiPhoneOS/Demos/src/happy.c | 2 +- XCodeiPhoneOS/Demos/src/keyboard.c | 2 +- XCodeiPhoneOS/Demos/src/touch.c | 2 +- include/SDL_video.h | 94 ++++++- src/SDL_compat.c | 4 +- src/video/SDL_glfuncs.h | 6 +- src/video/SDL_renderer_gl.c | 212 +++++++++------- src/video/SDL_renderer_gles.c | 27 +- src/video/SDL_renderer_sw.c | 28 ++- src/video/SDL_surface.c | 26 +- src/video/SDL_sysvideo.h | 10 +- src/video/SDL_video.c | 136 +++++++++- src/video/directfb/SDL_DirectFB_render.c | 232 ++++++++++++++---- src/video/dummy/SDL_nullrender.c | 18 +- src/video/nds/SDL_ndsrender.c | 2 +- src/video/win32/SDL_d3drender.c | 27 +- src/video/win32/SDL_gdirender.c | 14 +- src/video/x11/SDL_x11render.c | 89 ++++++- src/video/x11/SDL_x11sym.h | 2 + test/common.c | 10 +- test/nds-test-progs/sprite/source/common.c | 10 +- test/nds-test-progs/sprite2/source/common.c | 10 +- .../sprite2/source/testsprite2.c | 2 +- test/testsprite2.c | 21 +- 26 files changed, 731 insertions(+), 258 deletions(-) diff --git a/TODO b/TODO index 9b206f1ef..36c852671 100644 --- a/TODO +++ b/TODO @@ -5,6 +5,7 @@ - in progress, software support is done, Ryan is working on OpenGL shaders * Implement desktop video mode change notification? * Implement icon support (with translucency?) + * Add draw blend mode and line drawing support for software renderer and win32 * Verify mouse grab support * Properly handle mouse grab with Vista DPI scaling * Make sure the mouse is where it's supposed to be when un-grabbed diff --git a/XCodeiPhoneOS/Demos/src/accelerometer.c b/XCodeiPhoneOS/Demos/src/accelerometer.c index 22fa8c511..7d980263a 100644 --- a/XCodeiPhoneOS/Demos/src/accelerometer.c +++ b/XCodeiPhoneOS/Demos/src/accelerometer.c @@ -145,7 +145,7 @@ initializeTextures() if (shipID == 0) { 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 */ ship.rect.w = bmp_surface->w; diff --git a/XCodeiPhoneOS/Demos/src/happy.c b/XCodeiPhoneOS/Demos/src/happy.c index 3c87c9ef5..6bd4ba28a 100644 --- a/XCodeiPhoneOS/Demos/src/happy.c +++ b/XCodeiPhoneOS/Demos/src/happy.c @@ -127,7 +127,7 @@ initializeTexture() if (texture_id == 0) { fatalError("could not create texture"); } - SDL_SetTextureBlendMode(texture_id, SDL_TEXTUREBLENDMODE_BLEND); + SDL_SetTextureBlendMode(texture_id, SDL_BLENDMODE_BLEND); /* free up allocated memory */ SDL_FreeSurface(bmp_surface_rgba); diff --git a/XCodeiPhoneOS/Demos/src/keyboard.c b/XCodeiPhoneOS/Demos/src/keyboard.c index 104a015cd..017485d99 100644 --- a/XCodeiPhoneOS/Demos/src/keyboard.c +++ b/XCodeiPhoneOS/Demos/src/keyboard.c @@ -223,7 +223,7 @@ loadFont(void) printf("texture creation failed: %s\n", SDL_GetError()); } else { /* set blend mode for our texture */ - SDL_SetTextureBlendMode(textureID, SDL_TEXTUREBLENDMODE_BLEND); + SDL_SetTextureBlendMode(textureID, SDL_BLENDMODE_BLEND); } SDL_FreeSurface(surface); SDL_FreeSurface(converted); diff --git a/XCodeiPhoneOS/Demos/src/touch.c b/XCodeiPhoneOS/Demos/src/touch.c index 22d9eb2f8..ab8ffa200 100644 --- a/XCodeiPhoneOS/Demos/src/touch.c +++ b/XCodeiPhoneOS/Demos/src/touch.c @@ -65,7 +65,7 @@ initializeTexture() fatalError("could not create brush texture"); } /* 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) */ SDL_SetTextureColorMod(brushID, 255, 100, 100); } diff --git a/include/SDL_video.h b/include/SDL_video.h index 7c9e20abd..67c711766 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -206,18 +206,18 @@ typedef enum } 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 { - SDL_TEXTUREBLENDMODE_NONE = 0x00000000, /**< No blending */ - SDL_TEXTUREBLENDMODE_MASK = 0x00000001, /**< dst = A ? src : dst (alpha is mask) */ - SDL_TEXTUREBLENDMODE_BLEND = 0x00000002, /**< dst = (src * A) + (dst * (1-A)) */ - SDL_TEXTUREBLENDMODE_ADD = 0x00000004, /**< dst = (src * A) + dst */ - SDL_TEXTUREBLENDMODE_MOD = 0x00000008 /**< dst = src * dst */ -} SDL_TextureBlendMode; + SDL_BLENDMODE_NONE = 0x00000000, /**< No blending */ + SDL_BLENDMODE_MASK = 0x00000001, /**< dst = A ? src : dst (alpha is mask) */ + SDL_BLENDMODE_BLEND = 0x00000002, /**< dst = (src * A) + (dst * (1-A)) */ + SDL_BLENDMODE_ADD = 0x00000004, /**< dst = (src * A) + dst */ + SDL_BLENDMODE_MOD = 0x00000008 /**< dst = src * dst */ +} SDL_BlendMode; /** * \enum SDL_TextureScaleMode @@ -1141,9 +1141,80 @@ extern DECLSPEC void SDLCALL SDL_DirtyTexture(SDL_TextureID textureID, 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 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 */ -extern DECLSPEC int SDLCALL SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, - const SDL_Rect * rect); +extern DECLSPEC int SDLCALL SDL_RenderFill(const SDL_Rect * rect); /** * \fn int SDL_RenderCopy(SDL_TextureID textureID, const SDL_Rect *srcrect, const SDL_Rect *dstrect) diff --git a/src/SDL_compat.c b/src/SDL_compat.c index df17fda14..68e233554 100644 --- a/src/SDL_compat.c +++ b/src/SDL_compat.c @@ -696,10 +696,10 @@ SDL_SetAlpha(SDL_Surface * surface, Uint32 flag, Uint8 value) value = 0xFF; } SDL_SetSurfaceAlphaMod(surface, value); - SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_BLEND); + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); } else { SDL_SetSurfaceAlphaMod(surface, 0xFF); - SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_NONE); + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); } SDL_SetSurfaceRLE(surface, (flag & SDL_RLEACCEL)); diff --git a/src/video/SDL_glfuncs.h b/src/video/SDL_glfuncs.h index 0cc4f6ecd..4f13ed734 100644 --- a/src/video/SDL_glfuncs.h +++ b/src/video/SDL_glfuncs.h @@ -206,7 +206,7 @@ SDL_PROC_UNUSED(void, glLighti, (GLenum light, GLenum pname, GLint param)) SDL_PROC_UNUSED(void, glLightiv, (GLenum light, GLenum pname, const GLint * params)) 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(void, glLoadIdentity, (void)) 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, glPixelTransferi, (GLenum pname, GLint param)) 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, glPolygonOffset, (GLfloat factor, GLfloat units)) 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, (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)) 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, glRects, (GLshort x1, GLshort y1, GLshort x2, GLshort y2)) diff --git a/src/video/SDL_renderer_gl.c b/src/video/SDL_renderer_gl.c index e595feca1..c0e6f0607 100644 --- a/src/video/SDL_renderer_gl.c +++ b/src/video/SDL_renderer_gl.c @@ -51,14 +51,14 @@ bytes_per_pixel(const Uint32 format) /* FOURCC format */ switch (format) { - case SDL_PIXELFORMAT_YV12: - case SDL_PIXELFORMAT_IYUV: - case SDL_PIXELFORMAT_YUY2: - case SDL_PIXELFORMAT_UYVY: - case SDL_PIXELFORMAT_YVYU: - return 2; - default: - return 1; /* shouldn't ever hit this. */ + case SDL_PIXELFORMAT_YV12: + case SDL_PIXELFORMAT_IYUV: + case SDL_PIXELFORMAT_YUY2: + case SDL_PIXELFORMAT_UYVY: + case SDL_PIXELFORMAT_YVYU: + return 2; + default: + 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_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, const SDL_Rect * rects); -static int GL_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, - Uint8 a, const SDL_Rect * rect); +static int GL_SetDrawColor(SDL_Renderer * renderer); +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, const SDL_Rect * srcrect, const SDL_Rect * dstrect); + static void GL_RenderPresent(SDL_Renderer * renderer); static void GL_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GL_DestroyRenderer(SDL_Renderer * renderer); @@ -113,9 +117,8 @@ SDL_RenderDriver GL_RenderDriver = { SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED), (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA), - (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | - SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | - SDL_TEXTUREBLENDMODE_MOD), + (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | + SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_SLOW), 15, @@ -186,7 +189,7 @@ typedef struct void *pixels; int pitch; SDL_DirtyRectList dirty; -int HACK_RYAN_FIXME; + int HACK_RYAN_FIXME; } GL_TextureData; @@ -308,6 +311,9 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->LockTexture = GL_LockTexture; renderer->UnlockTexture = GL_UnlockTexture; renderer->DirtyTexture = GL_DirtyTexture; + renderer->SetDrawColor = GL_SetDrawColor; + renderer->SetDrawBlendMode = GL_SetDrawBlendMode; + renderer->RenderLine = GL_RenderLine; renderer->RenderFill = GL_RenderFill; renderer->RenderCopy = GL_RenderCopy; renderer->RenderPresent = GL_RenderPresent; @@ -429,6 +435,36 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) 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 GL_ActivateRenderer(SDL_Renderer * renderer) { @@ -476,7 +512,7 @@ power_of_2(int input) //#define DEBUG_PROGRAM_COMPILE 1 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 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) 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); - memmove(ptr+replacementlen, ptr+tokenlen, strlen(ptr+tokenlen)+1); + memmove(ptr + replacementlen, ptr + tokenlen, + strlen(ptr + tokenlen) + 1); } #if DEBUG_PROGRAM_COMPILE printf("compiling shader:\n%s\n\n", code); #endif - data->glGetError(); /* flush any existing error state. */ + data->glGetError(); /* flush any existing error state. */ data->glGenProgramsARB(1, &program); data->glBindProgramARB(shader_type, program); 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); - if (data->glGetError() == GL_INVALID_OPERATION) - { + if (data->glGetError() == GL_INVALID_OPERATION) { #if DEBUG_PROGRAM_COMPILE GLint pos = 0; const GLubyte *errstr; data->glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); errstr = data->glGetString(GL_PROGRAM_ERROR_STRING_ARB); printf("program compile error at position %d: %s\n\n", - (int) pos, (const char *) errstr); + (int) pos, (const char *) errstr); #endif data->glBindProgramARB(shader_type, 0); 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 could be more efficient...use a dot product for green, etc. */ -static const char *fragment_program_UYVY_source_code = - "!!ARBfp1.0\n" - +static const char *fragment_program_UYVY_source_code = "!!ARBfp1.0\n" /* outputs... */ "OUTPUT outcolor = result.color;\n" - /* scratch registers... */ - "TEMP uyvy;\n" - "TEMP luminance;\n" - "TEMP work;\n" - + "TEMP uyvy;\n" "TEMP luminance;\n" "TEMP work;\n" /* 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" - /* Sample the YUV texture. Cb, Y1, Cr, Y2, are stored in x, y, z, w. */ "TEX uyvy, work, texture[0], %TEXTURETARGET%;\n" - /* Do subtractions (128/255, 16/255, 128/255, 16/255) */ "SUB uyvy, uyvy, { 0.501960784313726, 0.06274509803922, 0.501960784313726, 0.06274509803922 };\n" - /* Choose the luminance component by texcoord. */ /* !!! FIXME: laziness wins out for now... just average Y1 and Y2. */ "ADD luminance, uyvy.yyyy, uyvy.wwww;\n" "MUL luminance, luminance, { 0.5, 0.5, 0.5, 0.5 };\n" - /* Multiply luminance by its magic value. */ "MUL luminance, luminance, { 1.164, 1.164, 1.164, 1.164 };\n" - /* uyvy.xyzw becomes Cr/Cr/Cb/Cb, with multiplications. */ "MUL uyvy, uyvy.zzxx, { 1.596, -0.813, 2.018, -0.391 };\n" - /* Add luminance to Cr and Cb, store to RGB channels. */ "ADD work.rgb, luminance, uyvy;\n" - /* Do final addition for Green channel. (!!! FIXME: this should be a DPH?) */ "ADD work.g, work.g, uyvy.w;\n" - /* Make sure alpha channel is fully opaque. (!!! FIXME: blend modes!) */ "MOV work.a, { 1.0 };\n" - /* Store out the final fragment color... */ "MOV outcolor, work;\n" - /* ...and we're done! */ "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 */ if (internalFormat == GL_RGBA && bytes_per_pixel(texture->format) < 4) { -data->HACK_RYAN_FIXME = 2; + data->HACK_RYAN_FIXME = 2; } else { -data->HACK_RYAN_FIXME = 1; + data->HACK_RYAN_FIXME = 1; } texture_w /= data->HACK_RYAN_FIXME; data->format = format; data->formattype = type; + renderdata->glEnable(data->type); renderdata->glBindTexture(data->type, data->texture); renderdata->glTexParameteri(data->type, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -894,6 +915,7 @@ GL_SetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture, *palette++ = colors->b; ++colors; } + renderdata->glEnable(data->type); renderdata->glBindTexture(data->type, data->texture); renderdata->glColorTableEXT(data->type, GL_RGB8, 256, GL_RGB, 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_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 @@ -953,15 +977,15 @@ 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: + case SDL_BLENDMODE_NONE: + case SDL_BLENDMODE_MASK: + case SDL_BLENDMODE_BLEND: + case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_MOD: return 0; default: SDL_Unsupported(); - texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; + texture->blendMode = SDL_BLENDMODE_NONE; return -1; } } @@ -995,6 +1019,7 @@ GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, renderdata->glGetError(); SetupTextureUpdate(renderdata, texture, pitch); + renderdata->glEnable(data->type); renderdata->glBindTexture(data->type, data->texture); renderdata->glTexSubImage2D(data->type, 0, rect->x, rect->y, rect->w, rect->h, data->format, data->formattype, @@ -1043,17 +1068,57 @@ GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, } static int -GL_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - const SDL_Rect * rect) +GL_SetDrawColor(SDL_Renderer * renderer) +{ + 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; SDL_Window *window = SDL_GetWindowFromID(renderer->window); - 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->glClear(GL_COLOR_BUFFER_BIT); - data->glViewport(0, 0, window->w, window->h); + data->glColor4f((GLfloat) renderer->r * inv255f, + (GLfloat) renderer->g * inv255f, + (GLfloat) renderer->b * inv255f, + (GLfloat) renderer->a * inv255f); + 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; } @@ -1073,6 +1138,7 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, int pitch = texturedata->pitch; SetupTextureUpdate(data, texture, pitch); + data->glEnable(texturedata->type); data->glBindTexture(texturedata->type, texturedata->texture); for (dirty = texturedata->dirty.list; dirty; dirty = dirty->next) { SDL_Rect *rect = &dirty->rect; @@ -1080,7 +1146,8 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, (void *) ((Uint8 *) texturedata->pixels + rect->y * pitch + rect->x * bpp); 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); } 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 *= texturedata->texh; + data->glEnable(texturedata->type); data->glBindTexture(texturedata->type, texturedata->texture); 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); } - if (texture->blendMode != data->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; - } + SetBlendMode(data, texture->blendMode); if (texture->scaleMode != data->scaleMode) { switch (texture->scaleMode) { @@ -1176,6 +1220,9 @@ GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, if (texturedata->shader != 0) { data->glDisable(GL_FRAGMENT_PROGRAM_ARB); } + + data->glDisable(texturedata->type); + return 0; } @@ -1219,7 +1266,8 @@ GL_DestroyRenderer(SDL_Renderer * renderer) data->glDisable(GL_FRAGMENT_PROGRAM_ARB); data->glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0); if (data->fragment_program_UYVY != 0) { - data->glDeleteProgramsARB(1, &data->fragment_program_UYVY); + data->glDeleteProgramsARB(1, + &data->fragment_program_UYVY); } } diff --git a/src/video/SDL_renderer_gles.c b/src/video/SDL_renderer_gles.c index c56b414ad..dd7c45559 100644 --- a/src/video/SDL_renderer_gles.c +++ b/src/video/SDL_renderer_gles.c @@ -85,9 +85,8 @@ SDL_RenderDriver GL_ES_RenderDriver = { SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED), (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA), - (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | - SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | - SDL_TEXTUREBLENDMODE_MOD), + (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | + SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_SLOW), 2, { @@ -499,15 +498,15 @@ static int GLES_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: + case SDL_BLENDMODE_NONE: + case SDL_BLENDMODE_MASK: + case SDL_BLENDMODE_BLEND: + case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_MOD: return 0; default: SDL_Unsupported(); - texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; + texture->blendMode = SDL_BLENDMODE_NONE; return -1; } } @@ -680,22 +679,22 @@ GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, if (texture->blendMode != data->blendMode) { switch (texture->blendMode) { - case SDL_TEXTUREBLENDMODE_NONE: + case SDL_BLENDMODE_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: + 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_TEXTUREBLENDMODE_ADD: + 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_TEXTUREBLENDMODE_MOD: + 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); diff --git a/src/video/SDL_renderer_sw.c b/src/video/SDL_renderer_sw.c index 62a28309d..264c33b32 100644 --- a/src/video/SDL_renderer_sw.c +++ b/src/video/SDL_renderer_sw.c @@ -59,8 +59,8 @@ static int SW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch); static void SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); -static int SW_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, - Uint8 a, const SDL_Rect * rect); +static int SW_SetDrawColor(SDL_Renderer * renderer); +static int SW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect); static int SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect); static void SW_RenderPresent(SDL_Renderer * renderer); @@ -77,9 +77,8 @@ SDL_RenderDriver SW_RenderDriver = { SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC), (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA), - (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | - SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | - SDL_TEXTUREBLENDMODE_MOD), + (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | + SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST), 14, { @@ -222,6 +221,13 @@ SW_CreateRenderer(SDL_Window * window, Uint32 flags) } renderer->ActivateRenderer = SW_ActivateRenderer; renderer->DisplayModeChanged = SW_DisplayModeChanged; + + renderer->SetDrawColor = SW_SetDrawColor; + /* FIXME : Implement + renderer->SetDrawBlendMode = GL_SetDrawBlendMode; + renderer->RenderLine = GL_RenderLine; + */ + renderer->RenderFill = SW_RenderFill; renderer->RenderCopy = SW_RenderCopy; renderer->RenderPresent = SW_RenderPresent; @@ -520,8 +526,13 @@ SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) } static int -SW_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - const SDL_Rect * rect) +SW_SetDrawColor(SDL_Renderer * renderer) +{ + return 0; +} + +static int +SW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) { SW_RenderData *data = (SW_RenderData *) renderer->driverdata; Uint32 color; @@ -532,7 +543,8 @@ SW_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, 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, data->texture[data->current_texture], diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index 232fa3776..ee642dc97 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -140,7 +140,7 @@ SDL_CreateRGBSurface(Uint32 flags, /* By default surface with an alpha mask are set up for blending */ if (Amask) { - SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_BLEND); + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); } /* The surface is ready to go */ @@ -336,7 +336,7 @@ SDL_ConvertColorkeyToAlpha(SDL_Surface * surface) SDL_UnlockSurface(surface); SDL_SetColorKey(surface, 0, 0); - SDL_SetSurfaceBlendMode(surface, SDL_TEXTUREBLENDMODE_BLEND); + SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); } int @@ -434,18 +434,18 @@ SDL_SetSurfaceBlendMode(SDL_Surface * surface, int blendMode) surface->map->info.flags &= ~(SDL_COPY_MASK | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD); switch (blendMode) { - case SDL_TEXTUREBLENDMODE_NONE: + case SDL_BLENDMODE_NONE: break; - case SDL_TEXTUREBLENDMODE_MASK: + case SDL_BLENDMODE_MASK: surface->map->info.flags |= SDL_COPY_MASK; break; - case SDL_TEXTUREBLENDMODE_BLEND: + case SDL_BLENDMODE_BLEND: surface->map->info.flags |= SDL_COPY_BLEND; break; - case SDL_TEXTUREBLENDMODE_ADD: + case SDL_BLENDMODE_ADD: surface->map->info.flags |= SDL_COPY_ADD; break; - case SDL_TEXTUREBLENDMODE_MOD: + case SDL_BLENDMODE_MOD: surface->map->info.flags |= SDL_COPY_MOD; break; default: @@ -483,19 +483,19 @@ SDL_GetSurfaceBlendMode(SDL_Surface * surface, int *blendMode) info.flags & (SDL_COPY_MASK | SDL_COPY_BLEND | SDL_COPY_ADD | SDL_COPY_MOD)) { case SDL_COPY_MASK: - *blendMode = SDL_TEXTUREBLENDMODE_MASK; + *blendMode = SDL_BLENDMODE_MASK; break; case SDL_COPY_BLEND: - *blendMode = SDL_TEXTUREBLENDMODE_BLEND; + *blendMode = SDL_BLENDMODE_BLEND; break; case SDL_COPY_ADD: - *blendMode = SDL_TEXTUREBLENDMODE_ADD; + *blendMode = SDL_BLENDMODE_ADD; break; case SDL_COPY_MOD: - *blendMode = SDL_TEXTUREBLENDMODE_MOD; + *blendMode = SDL_BLENDMODE_MOD; break; default: - *blendMode = SDL_TEXTUREBLENDMODE_NONE; + *blendMode = SDL_BLENDMODE_NONE; break; } return 0; @@ -835,7 +835,7 @@ SDL_ConvertSurface(SDL_Surface * surface, SDL_PixelFormat * format, * alpha channel or alpha modulation */ if ((surface->format->Amask && format->Amask) || (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)) { SDL_SetSurfaceRLE(convert, SDL_RLEACCEL); diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 6dea08669..cf48526e0 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -88,8 +88,11 @@ struct SDL_Renderer void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture); void (*DirtyTexture) (SDL_Renderer * renderer, SDL_Texture * texture, int numrects, const SDL_Rect * rects); - int (*RenderFill) (SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, - Uint8 a, const SDL_Rect * rect); + int (*SetDrawColor) (SDL_Renderer * renderer); + 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, const SDL_Rect * srcrect, const SDL_Rect * dstrect); void (*RenderPresent) (SDL_Renderer * renderer); @@ -103,6 +106,9 @@ struct SDL_Renderer /* The window associated with the renderer */ SDL_WindowID window; + Uint8 r, g, b, a; /**< Color for drawing operations values */ + int blendMode; /**< The drawing blend mode */ + void *driverdata; }; diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 45ebe4b83..b09b2252e 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -1975,7 +1975,104 @@ SDL_DirtyTexture(SDL_TextureID textureID, int numrects, } 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_Window *window; @@ -2003,7 +2100,42 @@ SDL_RenderFill(Uint8 r, Uint8 g, Uint8 b, Uint8 a, const SDL_Rect * rect) 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 diff --git a/src/video/directfb/SDL_DirectFB_render.c b/src/video/directfb/SDL_DirectFB_render.c index 634d914a6..201930a50 100644 --- a/src/video/directfb/SDL_DirectFB_render.c +++ b/src/video/directfb/SDL_DirectFB_render.c @@ -71,8 +71,12 @@ static void DirectFB_UnlockTexture(SDL_Renderer * renderer, static void DirectFB_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, const SDL_Rect * rects); -static int DirectFB_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, - Uint8 b, Uint8 a, const SDL_Rect * rect); +static int DirectFB_SetDrawColor(SDL_Renderer * renderer); +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, const SDL_Rect * srcrect, const SDL_Rect * dstrect); @@ -91,9 +95,8 @@ SDL_RenderDriver DirectFB_RenderDriver = { SDL_RENDERER_ACCELERATED), (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA), - (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | - SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | - SDL_TEXTUREBLENDMODE_MOD), + (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | + SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_SLOW | SDL_TEXTURESCALEMODE_BEST), 14, @@ -122,6 +125,9 @@ typedef struct DFBSurfaceFlipFlags flipflags; int isyuvdirect; int size_changed; + int lastBlendMode; + DFBSurfaceBlittingFlags blitFlags; + DFBSurfaceDrawingFlags drawFlags; } DirectFB_RenderData; typedef struct @@ -147,6 +153,79 @@ SDLtoDFBRect(const SDL_Rect * sr, DFBRectangle * dr) 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 DirectFB_AddRenderDriver(_THIS) { @@ -214,6 +293,9 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->LockTexture = DirectFB_LockTexture; renderer->UnlockTexture = DirectFB_UnlockTexture; renderer->DirtyTexture = DirectFB_DirtyTexture; + renderer->SetDrawColor = DirectFB_SetDrawColor; + renderer->SetDrawBlendMode = DirectFB_SetDrawBlendMode; + renderer->RenderLine = DirectFB_RenderLine; renderer->RenderFill = DirectFB_RenderFill; renderer->RenderCopy = DirectFB_RenderCopy; renderer->RenderPresent = DirectFB_RenderPresent; @@ -304,7 +386,11 @@ SDLToDFBPixelFormat(Uint32 format) case SDL_PIXELFORMAT_INDEX4MSB: return DSPF_UNKNOWN; case SDL_PIXELFORMAT_RGB444: +#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) + return DSPF_RGB444; +#else return DSPF_UNKNOWN; +#endif case SDL_PIXELFORMAT_BGR24: return DSPF_UNKNOWN; case SDL_PIXELFORMAT_BGR888: @@ -576,15 +662,15 @@ static int DirectFB_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: + case SDL_BLENDMODE_NONE: + case SDL_BLENDMODE_MASK: + case SDL_BLENDMODE_BLEND: + case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_MOD: return 0; default: SDL_Unsupported(); - texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; + texture->blendMode = SDL_BLENDMODE_NONE; return -1; } } @@ -710,13 +796,73 @@ DirectFB_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, } static int -DirectFB_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, - Uint8 a, const SDL_Rect * rect) +DirectFB_SetDrawColor(SDL_Renderer * renderer) +{ + 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; + DFBResult ret; + + 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-> FillRectangle(data->surface, rect->x, rect->y, rect->w, rect->h)); @@ -733,6 +879,7 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_TextureData *texturedata = (DirectFB_TextureData *) texture->driverdata; + Uint8 alpha = 0xFF; DFBResult ret; if (texturedata->display) { @@ -772,67 +919,44 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, } SDL_ClearDirtyRects(&texturedata->dirty); } -#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) - SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface, - texturedata-> - render_options)); -#endif 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)) { - 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; + flags |= DSBLIT_COLORIZE; } - } + if (alpha < 0xFF) + flags |= DSBLIT_SRC_PREMULTCOLOR; + } else + SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, 0xFF, + 0xFF, 0xFF, 0xFF)); - 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; - } + SetBlendMode(data, texture->blendMode, texturedata); SDL_DFB_CHECKERR(data->surface-> - SetBlittingFlags(data->surface, flags)); + SetBlittingFlags(data->surface, + data->blitFlags | flags)); + +#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 2) + SDL_DFB_CHECKERR(data->surface->SetRenderOptions(data->surface, + texturedata-> + render_options)); +#endif if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) { SDL_DFB_CHECKERR(data->surface-> diff --git a/src/video/dummy/SDL_nullrender.c b/src/video/dummy/SDL_nullrender.c index 0a1d9f22a..0ed409e6a 100644 --- a/src/video/dummy/SDL_nullrender.c +++ b/src/video/dummy/SDL_nullrender.c @@ -31,8 +31,9 @@ static SDL_Renderer *SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags); -static int SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, - Uint8 b, Uint8 a, const SDL_Rect * rect); +static int SDL_DUMMY_SetDrawColor(SDL_Renderer * renderer); +static int SDL_DUMMY_RenderFill(SDL_Renderer * renderer, + const SDL_Rect * rect); static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, @@ -88,6 +89,7 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags) } SDL_zerop(data); + renderer->SetDrawColor = SDL_DUMMY_SetDrawColor; renderer->RenderFill = SDL_DUMMY_RenderFill; renderer->RenderCopy = SDL_DUMMY_RenderCopy; renderer->RenderPresent = SDL_DUMMY_RenderPresent; @@ -124,8 +126,13 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags) } static int -SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, - Uint8 a, const SDL_Rect * rect) +SDL_DUMMY_SetDrawColor(SDL_Renderer * renderer) +{ + return 0; +} + +static int +SDL_DUMMY_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) { SDL_DUMMY_RenderData *data = (SDL_DUMMY_RenderData *) renderer->driverdata; @@ -133,7 +140,8 @@ SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint32 color; 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); } diff --git a/src/video/nds/SDL_ndsrender.c b/src/video/nds/SDL_ndsrender.c index 36d54d603..3904b5146 100644 --- a/src/video/nds/SDL_ndsrender.c +++ b/src/video/nds/SDL_ndsrender.c @@ -140,7 +140,7 @@ SDL_RenderDriver NDS_RenderDriver = { {"nds", /* char* name */ (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_PRESENTVSYNC), /* u32 flags */ (SDL_TEXTUREMODULATE_NONE), /* u32 mod_modes */ - (SDL_TEXTUREBLENDMODE_MASK), /* u32 blend_modes */ + (SDL_BLENDMODE_MASK), /* u32 blend_modes */ (SDL_TEXTURESCALEMODE_FAST), /* u32 scale_modes */ 3, /* u32 num_texture_formats */ { diff --git a/src/video/win32/SDL_d3drender.c b/src/video/win32/SDL_d3drender.c index b5174c50b..cdb93a9c5 100644 --- a/src/video/win32/SDL_d3drender.c +++ b/src/video/win32/SDL_d3drender.c @@ -82,9 +82,8 @@ SDL_RenderDriver D3D_RenderDriver = { SDL_RENDERER_ACCELERATED), (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA), - (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | - SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD | - SDL_TEXTUREBLENDMODE_MOD), + (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | + SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MOD), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_SLOW | SDL_TEXTURESCALEMODE_BEST), 12, @@ -525,15 +524,15 @@ 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: + case SDL_BLENDMODE_NONE: + case SDL_BLENDMODE_MASK: + case SDL_BLENDMODE_BLEND: + case SDL_BLENDMODE_ADD: + case SDL_BLENDMODE_MOD: return 0; default: SDL_Unsupported(); - texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; + texture->blendMode = SDL_BLENDMODE_NONE; return -1; } } @@ -798,12 +797,12 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, vertices[3].v = maxv; switch (texture->blendMode) { - case SDL_TEXTUREBLENDMODE_NONE: + case SDL_BLENDMODE_NONE: IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, FALSE); break; - case SDL_TEXTUREBLENDMODE_MASK: - case SDL_TEXTUREBLENDMODE_BLEND: + case SDL_BLENDMODE_MASK: + case SDL_BLENDMODE_BLEND: IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, TRUE); IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND, @@ -811,7 +810,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); break; - case SDL_TEXTUREBLENDMODE_ADD: + case SDL_BLENDMODE_ADD: IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, TRUE); IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND, @@ -819,7 +818,7 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND, D3DBLEND_ONE); break; - case SDL_TEXTUREBLENDMODE_MOD: + case SDL_BLENDMODE_MOD: IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE, TRUE); IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND, diff --git a/src/video/win32/SDL_gdirender.c b/src/video/win32/SDL_gdirender.c index ab617c28b..1da4285f9 100644 --- a/src/video/win32/SDL_gdirender.c +++ b/src/video/win32/SDL_gdirender.c @@ -73,8 +73,7 @@ SDL_RenderDriver GDI_RenderDriver = { SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED), (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_ALPHA), - (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK | - SDL_TEXTUREBLENDMODE_BLEND), + (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST), 14, { @@ -459,13 +458,13 @@ 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: + case SDL_BLENDMODE_NONE: + case SDL_BLENDMODE_MASK: + case SDL_BLENDMODE_BLEND: return 0; default: SDL_Unsupported(); - texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; + texture->blendMode = SDL_BLENDMODE_NONE; return -1; } } @@ -617,8 +616,7 @@ GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, SelectPalette(data->memory_hdc, texturedata->hpal, TRUE); RealizePalette(data->memory_hdc); } - if (texture->blendMode & - (SDL_TEXTUREBLENDMODE_MASK | SDL_TEXTUREBLENDMODE_BLEND)) { + if (texture->blendMode & (SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND)) { BLENDFUNCTION blendFunc = { AC_SRC_OVER, 0, diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index bdc14a287..7a22b0652 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -47,8 +47,11 @@ static int X11_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch); static void X11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); -static int X11_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, - Uint8 a, const SDL_Rect * rect); +static int X11_SetDrawColor(SDL_Renderer * renderer); +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, const SDL_Rect * srcrect, const SDL_Rect * dstrect); static void X11_RenderPresent(SDL_Renderer * renderer); @@ -65,7 +68,7 @@ SDL_RenderDriver X11_RenderDriver = { SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED), SDL_TEXTUREMODULATE_NONE, - SDL_TEXTUREBLENDMODE_NONE, + SDL_BLENDMODE_NONE, SDL_TEXTURESCALEMODE_NONE, 0, {0}, @@ -191,6 +194,9 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->UpdateTexture = X11_UpdateTexture; renderer->LockTexture = X11_LockTexture; renderer->UnlockTexture = X11_UnlockTexture; + renderer->SetDrawColor = X11_SetDrawColor; + renderer->SetDrawBlendMode = X11_SetDrawBlendMode; + renderer->RenderLine = X11_RenderLine; renderer->RenderFill = X11_RenderFill; renderer->RenderCopy = X11_RenderCopy; renderer->RenderPresent = X11_RenderPresent; @@ -445,11 +451,11 @@ static int X11_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) { switch (texture->blendMode) { - case SDL_TEXTUREBLENDMODE_NONE: + case SDL_BLENDMODE_NONE: return 0; default: SDL_Unsupported(); - texture->blendMode = SDL_TEXTUREBLENDMODE_NONE; + texture->blendMode = SDL_BLENDMODE_NONE; return -1; } } @@ -552,8 +558,73 @@ X11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) } static int -X11_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - const SDL_Rect * rect) +X11_SetDrawColor(SDL_Renderer * renderer) +{ + 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; 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); } - foreground = SDL_MapRGBA(data->format, r, g, b, a); + foreground = renderdrawcolor(renderer, 1); 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); return 0; } diff --git a/src/video/x11/SDL_x11sym.h b/src/video/x11/SDL_x11sym.h index 43ca7ad48..c2977947b 100644 --- a/src/video/x11/SDL_x11sym.h +++ b/src/video/x11/SDL_x11sym.h @@ -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,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,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(int,XEventsQueued,(Display* a,int b),(a,b),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,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,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,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) diff --git a/test/common.c b/test/common.c index c9002861b..7f111c1c1 100644 --- a/test/common.c +++ b/test/common.c @@ -322,19 +322,19 @@ static void PrintBlendMode(Uint32 flag) { switch (flag) { - case SDL_TEXTUREBLENDMODE_NONE: + case SDL_BLENDMODE_NONE: fprintf(stderr, "None"); break; - case SDL_TEXTUREBLENDMODE_MASK: + case SDL_BLENDMODE_MASK: fprintf(stderr, "Mask"); break; - case SDL_TEXTUREBLENDMODE_BLEND: + case SDL_BLENDMODE_BLEND: fprintf(stderr, "Blend"); break; - case SDL_TEXTUREBLENDMODE_ADD: + case SDL_BLENDMODE_ADD: fprintf(stderr, "Add"); break; - case SDL_TEXTUREBLENDMODE_MOD: + case SDL_BLENDMODE_MOD: fprintf(stderr, "Mod"); break; default: diff --git a/test/nds-test-progs/sprite/source/common.c b/test/nds-test-progs/sprite/source/common.c index 364b8460a..021ab8b08 100755 --- a/test/nds-test-progs/sprite/source/common.c +++ b/test/nds-test-progs/sprite/source/common.c @@ -322,19 +322,19 @@ static void PrintBlendMode(Uint32 flag) { switch (flag) { - case SDL_TEXTUREBLENDMODE_NONE: + case SDL_BLENDMODE_NONE: fprintf(stderr, "None"); break; - case SDL_TEXTUREBLENDMODE_MASK: + case SDL_BLENDMODE_MASK: fprintf(stderr, "Mask"); break; - case SDL_TEXTUREBLENDMODE_BLEND: + case SDL_BLENDMODE_BLEND: fprintf(stderr, "Blend"); break; - case SDL_TEXTUREBLENDMODE_ADD: + case SDL_BLENDMODE_ADD: fprintf(stderr, "Add"); break; - case SDL_TEXTUREBLENDMODE_MOD: + case SDL_BLENDMODE_MOD: fprintf(stderr, "Mod"); break; default: diff --git a/test/nds-test-progs/sprite2/source/common.c b/test/nds-test-progs/sprite2/source/common.c index 364b8460a..021ab8b08 100755 --- a/test/nds-test-progs/sprite2/source/common.c +++ b/test/nds-test-progs/sprite2/source/common.c @@ -322,19 +322,19 @@ static void PrintBlendMode(Uint32 flag) { switch (flag) { - case SDL_TEXTUREBLENDMODE_NONE: + case SDL_BLENDMODE_NONE: fprintf(stderr, "None"); break; - case SDL_TEXTUREBLENDMODE_MASK: + case SDL_BLENDMODE_MASK: fprintf(stderr, "Mask"); break; - case SDL_TEXTUREBLENDMODE_BLEND: + case SDL_BLENDMODE_BLEND: fprintf(stderr, "Blend"); break; - case SDL_TEXTUREBLENDMODE_ADD: + case SDL_BLENDMODE_ADD: fprintf(stderr, "Add"); break; - case SDL_TEXTUREBLENDMODE_MOD: + case SDL_BLENDMODE_MOD: fprintf(stderr, "Mod"); break; default: diff --git a/test/nds-test-progs/sprite2/source/testsprite2.c b/test/nds-test-progs/sprite2/source/testsprite2.c index 541bcf282..15dfa0ed4 100755 --- a/test/nds-test-progs/sprite2/source/testsprite2.c +++ b/test/nds-test-progs/sprite2/source/testsprite2.c @@ -21,7 +21,7 @@ static int current_color = 0; static SDL_Rect *positions; static SDL_Rect *velocities; 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; /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ diff --git a/test/testsprite2.c b/test/testsprite2.c index b663f316b..9650b7710 100644 --- a/test/testsprite2.c +++ b/test/testsprite2.c @@ -20,7 +20,7 @@ static int current_color = 0; static SDL_Rect *positions; static SDL_Rect *velocities; 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; /* 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 */ 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) { position = &positions[i]; velocity = &velocities[i]; @@ -166,19 +167,19 @@ main(int argc, char *argv[]) if (SDL_strcasecmp(argv[i], "--blend") == 0) { if (argv[i + 1]) { if (SDL_strcasecmp(argv[i + 1], "none") == 0) { - blendMode = SDL_TEXTUREBLENDMODE_NONE; + blendMode = SDL_BLENDMODE_NONE; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) { - blendMode = SDL_TEXTUREBLENDMODE_MASK; + blendMode = SDL_BLENDMODE_MASK; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { - blendMode = SDL_TEXTUREBLENDMODE_BLEND; + blendMode = SDL_BLENDMODE_BLEND; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { - blendMode = SDL_TEXTUREBLENDMODE_ADD; + blendMode = SDL_BLENDMODE_ADD; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { - blendMode = SDL_TEXTUREBLENDMODE_MOD; + blendMode = SDL_BLENDMODE_MOD; consumed = 2; } } @@ -230,7 +231,8 @@ main(int argc, char *argv[]) } for (i = 0; i < state->num_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) { quit(2); @@ -275,7 +277,8 @@ main(int argc, char *argv[]) switch (event.window.event) { case SDL_WINDOWEVENT_EXPOSED: SDL_SelectRenderer(event.window.windowID); - SDL_RenderFill(0xA0, 0xA0, 0xA0, 0xFF, NULL); + SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); + SDL_RenderFill(NULL); break; } break;