Overlay is now using Surfaces instead of Textures.

This commit is contained in:
Scott Duensing 2019-12-11 20:41:10 -06:00
parent 794177b078
commit 70dd504b7b

View file

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