Overlay is now using Surfaces instead of Textures.
This commit is contained in:
parent
794177b078
commit
70dd504b7b
1 changed files with 48 additions and 90 deletions
138
singe/singe.c
138
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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue