From 70dd504b7b7c33fcdef79d8f251d4b6c20b3cffa Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Wed, 11 Dec 2019 20:41:10 -0600 Subject: [PATCH] Overlay is now using Surfaces instead of Textures. --- singe/singe.c | 138 ++++++++++++++++++-------------------------------- 1 file changed, 48 insertions(+), 90 deletions(-) diff --git a/singe/singe.c b/singe/singe.c index 7a755b1ad..1ce9a0c75 100644 --- a/singe/singe.c +++ b/singe/singe.c @@ -68,7 +68,7 @@ typedef struct SpriteS { int id; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpadded" - SDL_Texture *texture; + SDL_Surface *surface; #pragma GCC diagnostic pop UT_hash_handle hh; } SpriteT; @@ -162,7 +162,7 @@ static MouseT _mice[MAX_MICE]; static lua_State *_luaContext = NULL; static SDL_Color _colorForeground = { 255, 255, 255, 255 }; static SDL_Color _colorBackground = { 0, 0, 0, 0 }; -static SDL_Texture *_overlay = NULL; +static SDL_Surface *_overlay = NULL; static SDL_Window *_window = NULL; static SDL_Renderer *_renderer = NULL; static int _nextSpriteId = 0; @@ -417,7 +417,6 @@ int apiDaphneScreenshot(lua_State *L) { luaTrace(L, "daphneScreenshot", "%s", filename); - SDL_SetRenderTarget(_renderer, NULL); texture = SDL_GetRenderTarget(_renderer); if (SDL_QueryTexture(texture, &format, NULL, &x, &y) < 0) luaDie(L, "daphneScreenshot", "%s", SDL_GetError()); pixels = malloc((size_t)x * (size_t)y * SDL_BYTESPERPIXEL(format)); @@ -428,7 +427,6 @@ int apiDaphneScreenshot(lua_State *L) { if (IMG_SavePNG(surface, filename) < 0) luaDie(L, "daphneScreenshot", "%s", IMG_GetError()); SDL_FreeSurface(surface); free(pixels); - SDL_SetRenderTarget(_renderer, _overlay); return 0; } @@ -546,13 +544,9 @@ int apiDiscPauseAtFrame(lua_State *L) { int apiDiscPlay(lua_State *L) { (void)L; - if (_discStopped) { - videoPlay(_videoHandle); - _discStopped = false; - luaTrace(L, "discPlay", ""); - } else { - luaTrace(L, "discPlay", "Failed! Disc is stopped."); - } + videoPlay(_videoHandle); + _discStopped = false; + luaTrace(L, "discPlay", ""); return 0; } @@ -764,7 +758,6 @@ int apiFontPrint(lua_State *L) { const char *message = NULL; double d = 0; SDL_Surface *textSurface = NULL; - SDL_Texture *texture = NULL; SDL_Rect dest; if (n == 3) { @@ -795,11 +788,10 @@ int apiFontPrint(lua_State *L) { SDL_SetSurfaceBlendMode(textSurface, SDL_BLENDMODE_BLEND); // Transparent index is 0 SDL_SetColorKey(textSurface, true, 0); - texture = SDL_CreateTextureFromSurface(_renderer, textSurface); + dest.w = textSurface->w; + dest.h = textSurface->h; + SDL_BlitSurface(textSurface, NULL, _overlay, &dest); SDL_FreeSurface(textSurface); - if (!texture) luaDie(L, "fontPrint", "%s", SDL_GetError()); - if (SDL_QueryTexture(texture, NULL, NULL, &dest.w, &dest.h) < 0) luaDie(L, "fontPrint", "%s", SDL_GetError()); - SDL_RenderCopy(_renderer, texture, NULL, &dest); } } } @@ -871,40 +863,34 @@ int apiFontToSprite(lua_State *L) { int n = lua_gettop(L); int result = -1; const char *message = NULL; - SDL_Surface *textSurface = NULL; SpriteT *sprite = NULL; if (n == 1) { if (lua_isstring(L, 1)) { if (_fontCurrent) { - textSurface = NULL; + // Create spirte + sprite = (SpriteT *)calloc(1, sizeof(SpriteT)); + if (!sprite) luaDie(L, "fontToSprite", "Unable to allocate new text sprite."); message = lua_tostring(L, 1); switch (_fontQuality) { case 1: - textSurface = TTF_RenderText_Solid(_fontCurrent->font, message, _colorForeground); + sprite->surface = TTF_RenderText_Solid(_fontCurrent->font, message, _colorForeground); break; case 2: - textSurface = TTF_RenderText_Shaded(_fontCurrent->font, message, _colorForeground, _colorBackground); + sprite->surface = TTF_RenderText_Shaded(_fontCurrent->font, message, _colorForeground, _colorBackground); break; case 3: - textSurface = TTF_RenderText_Blended(_fontCurrent->font, message, _colorForeground); + sprite->surface = TTF_RenderText_Blended(_fontCurrent->font, message, _colorForeground); break; } - if (!textSurface) { + if (!sprite->surface) { luaDie(L, "fontToSprite", "Font surface is null!"); } else { - SDL_SetSurfaceBlendMode(textSurface, SDL_BLENDMODE_BLEND); - // Transparent index is 0 - SDL_SetColorKey(textSurface, true, 0); - // Create spirte - sprite = (SpriteT *)calloc(1, sizeof(SpriteT)); - if (!sprite) luaDie(L, "fontToSprite", "Unable to allocate new text sprite."); - sprite->texture = SDL_CreateTextureFromSurface(_renderer, textSurface); - SDL_FreeSurface(textSurface); - if (!sprite->texture) luaDie(L, "fontToSprite", "%s", SDL_GetError()); + SDL_SetColorKey(sprite->surface, true, 0); + //SDL_SetSurfaceAlphaMod(sprite->surface, 255); sprite->id = _nextSpriteId; result = _nextSpriteId++; HASH_ADD_INT(_spriteList, id, sprite); @@ -913,7 +899,7 @@ int apiFontToSprite(lua_State *L) { } } - if (textSurface) { + if (sprite->surface) { luaTrace(L, "fontToSprite", "%d %s", result, message); } else { luaTrace(L, "fontToSprite", "Failed!"); @@ -926,39 +912,22 @@ int apiFontToSprite(lua_State *L) { int apiOverlayClear(lua_State *L) { (void)L; - SDL_SetRenderDrawColor(_renderer, _colorBackground.r, _colorBackground.g, _colorBackground.b, _colorBackground.a); - SDL_RenderClear(_renderer); + SDL_FillRect(_overlay, NULL, SDL_MapRGBA(_overlay->format, _colorBackground.r, _colorBackground.g, _colorBackground.b, _colorBackground.a)); luaTrace(L, "overlayClear", ""); return 0; } int apiOverlayGetHeight(lua_State *L) { - Uint32 format; - int access; - int x; - int y; - - if (SDL_QueryTexture(_overlay, &format, &access, &x, &y) < 0) luaDie(L, "overlayGetHeight", "%s", SDL_GetError()); - - luaTrace(L, "overlayGetHeight", "%d", y); - - lua_pushinteger(L, y); + luaTrace(L, "overlayGetWidth", "%d", _overlay->h); + lua_pushinteger(L, _overlay->h); return 1; } int apiOverlayGetWidth(lua_State *L) { - Uint32 format; - int access; - int x; - int y; - - if (SDL_QueryTexture(_overlay, &format, &access, &x, &y) < 0) luaDie(L, "overlayGetWidth", "%s", SDL_GetError()); - - luaTrace(L, "overlayGetWidth", "%d", x); - - lua_pushinteger(L, x); + luaTrace(L, "overlayGetWidth", "%d", _overlay->w); + lua_pushinteger(L, _overlay->w); return 1; } @@ -1275,8 +1244,9 @@ int apiSpriteDraw(lua_State *L) { d = lua_tonumber(L, 3); id = (int)d; HASH_FIND_INT(_spriteList, &id, sprite); if (!sprite) luaDie(L, "spriteDraw", "No sprite at index %d in apiSpriteGetWidth.", id); - if (SDL_QueryTexture(sprite->texture, NULL, NULL, &dest.w, &dest.h) < 0) luaDie(L, "spriteDraw", "%s", SDL_GetError()); - SDL_RenderCopy(_renderer, sprite->texture, NULL, &dest); + dest.w = sprite->surface->w; + dest.h = sprite->surface->h; + SDL_BlitSurface(sprite->surface, NULL, _overlay, &dest); } } } @@ -1296,11 +1266,7 @@ int apiSpriteGetHeight(lua_State *L) { int n = lua_gettop(L); int result = -1; int id = -1; - int access; - int x; - int y; double d; - Uint32 format; SpriteT *sprite = NULL; if (n == 1) { @@ -1309,8 +1275,7 @@ int apiSpriteGetHeight(lua_State *L) { // Get our sprite structure HASH_FIND_INT(_spriteList, &id, sprite); if (!sprite) luaDie(L, "spriteGetHeight", "No sprite at index %d in apiSpriteGetWidth.", id); - if (SDL_QueryTexture(sprite->texture, &format, &access, &x, &y) < 0) luaDie(L, "spriteGetHeight", "%s", SDL_GetError()); - result = y; + result = sprite->surface->h; } } @@ -1329,11 +1294,7 @@ int apiSpriteGetWidth(lua_State *L) { int n = lua_gettop(L); int result = -1; int id = -1; - int access; - int x; - int y; double d; - Uint32 format; SpriteT *sprite = NULL; lua_Debug ar; @@ -1346,8 +1307,7 @@ int apiSpriteGetWidth(lua_State *L) { // Get our sprite structure HASH_FIND_INT(_spriteList, &id, sprite); if (!sprite) luaDie(L, "spriteGetWidth", "No sprite at index %d in apiSpriteGetWidth.", id); - if (SDL_QueryTexture(sprite->texture, &format, &access, &x, &y) < 0) luaDie(L, "spriteGetWidth", "%s", SDL_GetError()); - result = x; + result = sprite->surface->w; } } @@ -1367,25 +1327,22 @@ int apiSpriteLoad(lua_State *L) { int result = -1; const char *name = NULL; SpriteT *sprite = NULL; - SDL_Surface *image = NULL; if (n == 1) { if (lua_isstring(L, 1)) { - name = lua_tostring(L, 1); - image = IMG_Load(name); - if (!image) luaDie(L, "spriteLoad", "%s", IMG_GetError()); sprite = (SpriteT *)calloc(1, sizeof(SpriteT)); if (!sprite) luaDie(L, "spriteLoad", "Unable to allocate new sprite."); - sprite->texture = SDL_CreateTextureFromSurface(_renderer, image); - SDL_FreeSurface(image); - if (!sprite->texture) luaDie(L, "spriteLoad", "%s", SDL_GetError()); + name = lua_tostring(L, 1); + sprite->surface = IMG_Load(name); + if (!sprite->surface) luaDie(L, "spriteLoad", "%s", IMG_GetError()); + SDL_SetColorKey(sprite->surface, true, 0); sprite->id = _nextSpriteId; result = _nextSpriteId++; HASH_ADD_INT(_spriteList, id, sprite); } } - if (sprite) { + if (sprite->surface) { luaTrace(L, "spriteLoad", "%d %s", result, name); } else { luaTrace(L, "spriteLoad", "Failed!"); @@ -1418,9 +1375,7 @@ int apiVldpGetPixel(lua_State *L) { rect.w = 1; d = lua_tonumber(L, 1); rect.x = (int)d; d = lua_tonumber(L, 2); rect.y = (int)d; - SDL_SetRenderTarget(_renderer, NULL); - if (SDL_RenderReadPixels(_renderer, &rect, SDL_PIXELFORMAT_BGRA32, pixel, SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32)) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); - SDL_SetRenderTarget(_renderer, _overlay); + if (SDL_RenderReadPixels(_renderer, &rect, SDL_PIXELFORMAT_BGRA32, pixel, SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_BGRA32) * videoGetWidth(_videoHandle)) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); result = true; } } @@ -1973,6 +1928,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { int lastFrame = -1; int intReturn = 0; SDL_Texture *videoTexture = NULL; + SDL_Texture *overlayTexture = NULL; SpriteT *sprite = NULL; SpriteT *spriteTemp = NULL; SoundT *sound = NULL; @@ -2083,17 +2039,14 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { // Should we resize the window? //***TODO*** - // Create overlay texture + // Create overlay surface _overlayScaleX = 0.5; _overlayScaleY = 0.5; x = (int)(videoGetWidth(_videoHandle) * _overlayScaleX); y = (int)(videoGetHeight(_videoHandle) * _overlayScaleY); - _overlay = SDL_CreateTexture(_renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_TARGET, x, y); + _overlay = SDL_CreateRGBSurfaceWithFormat(0, x, y, 32, SDL_PIXELFORMAT_BGRA32); if (_overlay == NULL) utilDie("%s", SDL_GetError()); - SDL_SetTextureBlendMode(_overlay, SDL_BLENDMODE_BLEND); - if (_confStretchVideo) { - SDL_RenderSetLogicalSize(_renderer, x, y); - } + SDL_SetColorKey(_overlay, true, 0); // Mouse setup _mouseCount = ManyMouse_Init(); @@ -2270,7 +2223,6 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { } // Call game code - SDL_SetRenderTarget(_renderer, _overlay); callLua("onOverlayUpdate", ">i", &intReturn); if (intReturn == 1) { _refreshDisplay = true; @@ -2286,10 +2238,16 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { // Update display if (_refreshDisplay) { //***TODO*** Handle overlay and blank disk frames - SDL_SetRenderTarget(_renderer, NULL); SDL_RenderCopy(_renderer, videoTexture, NULL, NULL); //makeZeroTransparent(_overlay); - SDL_RenderCopy(_renderer, _overlay, NULL, NULL); + overlayTexture = SDL_CreateTextureFromSurface(_renderer, _overlay); + if (!overlayTexture) utilDie("%s", SDL_GetError()); + if (!_confStretchVideo) { + SDL_RenderSetLogicalSize(renderer, videoGetWidth(_videoHandle), videoGetHeight(_videoHandle)); + } + SDL_RenderCopy(_renderer, overlayTexture, NULL, NULL); + SDL_DestroyTexture(overlayTexture); + overlayTexture = NULL; SDL_RenderPresent(_renderer); _refreshDisplay = false; } @@ -2306,7 +2264,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { lua_close(_luaContext); // Free overlay - SDL_DestroyTexture(_overlay); + SDL_FreeSurface(_overlay); // Unload fonts HASH_ITER(hh, _fontList, font, fontTemp) { @@ -2334,7 +2292,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { #pragma GCC diagnostic ignored "-Wcast-align" HASH_DEL(_spriteList, sprite); #pragma GCC diagnostic pop - SDL_DestroyTexture(sprite->texture); + SDL_FreeSurface(sprite->surface); free(sprite); }