diff --git a/singe/singe.c b/singe/singe.c index 1ce9a0c75..b04ab2a24 100644 --- a/singe/singe.c +++ b/singe/singe.c @@ -165,6 +165,7 @@ static SDL_Color _colorBackground = { 0, 0, 0, 0 }; static SDL_Surface *_overlay = NULL; static SDL_Window *_window = NULL; static SDL_Renderer *_renderer = NULL; +static SDL_Texture *_videoTexture = NULL; static int _nextSpriteId = 0; static int _nextSoundId = 0; static int _nextFontId = 0; @@ -301,7 +302,6 @@ void channelFinished(int channel); void luaDie(lua_State *L, char *method, char *fmt, ...); int luaError(lua_State *L); void luaTrace(lua_State *L, char *method, char *fmt, ...); -void makeZeroTransparent(SDL_Texture *texture); void processKey(bool down, int keysym); @@ -1373,9 +1373,11 @@ int apiVldpGetPixel(lua_State *L) { if (lua_isnumber(L, 2)) { rect.h = 1; rect.w = 1; - d = lua_tonumber(L, 1); rect.x = (int)d; - d = lua_tonumber(L, 2); rect.y = (int)d; + d = lua_tonumber(L, 1); rect.x = (int)(d / _overlayScaleX); + d = lua_tonumber(L, 2); rect.y = (int)(d / _overlayScaleY); + if (SDL_SetRenderTarget(_renderer, _videoTexture) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); 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_SetRenderTarget(_renderer, NULL) < 0) luaDie(L, "vldpGetPixel", "%s", SDL_GetError()); result = true; } } @@ -1830,29 +1832,6 @@ void luaTrace(lua_State *L, char *method, char *fmt, ...) { } -void makeZeroTransparent(SDL_Texture *texture) { - int x; - int y; - int w; - int h; - int access; - Uint32 format; - Uint32 *pixel = NULL; // Four bytes in BGRA order - size_t pixelSize = 0; - static size_t lastPixelsSize = 0; - - if (SDL_QueryTexture(texture, &format, &access, &w, &h) < 0) utilDie("%s", SDL_GetError()); - pixelSize = (size_t)(w * h * 4); - if (pixelSize != lastPixelsSize) { - // Reallocate buffer - if (_pixelBuffer) free(_pixelBuffer); - lastPixelsSize = pixelSize; - _pixelBuffer = malloc(lastPixelsSize); - if (!_pixelBuffer) utilDie("Unable to allocate pixels for transparency replacement."); - } -} - - void processKey(bool down, int keysym) { int move; @@ -1927,7 +1906,6 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { int thisFrame = -1; int lastFrame = -1; int intReturn = 0; - SDL_Texture *videoTexture = NULL; SDL_Texture *overlayTexture = NULL; SpriteT *sprite = NULL; SpriteT *spriteTemp = NULL; @@ -2229,7 +2207,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { } // Update video - thisFrame = videoUpdate(_videoHandle, &videoTexture); + thisFrame = videoUpdate(_videoHandle, &_videoTexture); if ((thisFrame != lastFrame) && (thisFrame>= 0)) { lastFrame = thisFrame; _refreshDisplay = true; @@ -2238,7 +2216,7 @@ void singe(SDL_Window *window, SDL_Renderer *renderer) { // Update display if (_refreshDisplay) { //***TODO*** Handle overlay and blank disk frames - SDL_RenderCopy(_renderer, videoTexture, NULL, NULL); + SDL_RenderCopy(_renderer, _videoTexture, NULL, NULL); //makeZeroTransparent(_overlay); overlayTexture = SDL_CreateTextureFromSurface(_renderer, _overlay); if (!overlayTexture) utilDie("%s", SDL_GetError()); diff --git a/singe/videoPlayer.c b/singe/videoPlayer.c index dc2020693..e14f72f05 100644 --- a/singe/videoPlayer.c +++ b/singe/videoPlayer.c @@ -304,7 +304,8 @@ int videoLoad(char *filename, char *indexPath, bool stretchVideo, SDL_Renderer * // Create video texture SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); - v->videoTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_STREAMING, v->propFrame->EncodedWidth, v->propFrame->EncodedHeight); + //v->videoTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_STREAMING, v->propFrame->EncodedWidth, v->propFrame->EncodedHeight); + v->videoTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_TARGET, v->propFrame->EncodedWidth, v->propFrame->EncodedHeight); if (v->videoTexture == NULL) utilDie("%s", SDL_GetError()); if (!stretchVideo) { SDL_RenderSetLogicalSize(renderer, v->propFrame->EncodedWidth, v->propFrame->EncodedHeight);