Re: Weird behaviour on the Raspberry Pi
Andreas Falkenhahn <[email protected]>
| Newsgroups | gmane.comp.lib.sdl |
|---|---|
| Message-ID | <[email protected]> |
On 28.09.2016 at 17:59 rtrussell wrote:
> One thing I would question is that there's no SDL_RenderClear().
> The docs say "You are strongly encouraged to call SDL_RenderClear()
> to initialize the backbuffer before starting each new frame's
> drawing". Does it make any difference if you change it as follows:
No, doesn't make any difference. The screen still alternates between
red and black. Here is the updated code for reference:
#include <SDL.h>
int main(int argc, char *argv[])
{
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Texture *texture1, *texture2, *texture3;
SDL_Event se;
int quit = 0, k;
int w = 295, reverse = 0;
char *pixbuf = malloc(640 * 480 * 4);
unsigned int *ptr;
SDL_Init(SDL_INIT_VIDEO);
SDL_VideoInit("RPI");
window = SDL_CreateWindow("Foo", 0, 0, 640, 480, 0);
renderer = SDL_CreateRenderer(window, -1, 0);
texture1 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);
texture2 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 480);
memset(pixbuf, 0, 640 * 480 * 4);
SDL_UpdateTexture(texture1, NULL, pixbuf, 640 * 4);
SDL_RenderCopy(renderer, texture1, NULL, NULL);
SDL_RenderPresent(renderer);
ptr = (unsigned int *) pixbuf;
for(k = 0; k < 640 * 480; k++) *ptr++ = 0xffff0000;
SDL_UpdateTexture(texture2, NULL, pixbuf, 640 * 4);
SDL_ShowWindow(window);
SDL_RaiseWindow(window);
while(!quit) {
texture3 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, w);
SDL_SetRenderTarget(renderer, texture3);
SDL_SetTextureBlendMode(texture2, SDL_BLENDMODE_NONE);
SDL_RenderCopy(renderer, texture2, NULL, NULL);
SDL_SetTextureBlendMode(texture3, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(renderer, NULL);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture1, NULL, NULL);
SDL_RenderCopy(renderer, texture3, NULL, NULL);
SDL_RenderPresent(renderer);
while(SDL_PollEvent(&se)) {
if(se.type == SDL_MOUSEBUTTONDOWN) quit = 1;
}
SDL_DestroyTexture(texture3);
if(reverse) {
w -= 10;
} else {
w += 10;
}
if(w >= 640) {
w = 640;
reverse = 1;
} else if(w <= 2) {
w = 2;
reverse = 0;
}
}
SDL_DestroyTexture(texture1);
SDL_DestroyTexture(texture2);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
free(pixbuf);
return 0;
}
--
Best regards,
Andreas Falkenhahn mailto:[email protected]