Here’s the SDL_gfx demo modified to use exclusive-or plotting:
Code:
// Demo of exclusive-or plotting by Richard Russell http://www.rtrussell.co.uk/
#include <stdio.h>
#include “SDL2_gfxPrimitives.h”
#define WIDTH 640
#define HEIGHT 480
#define GL_COLOR_LOGIC_OP 0xBF2
#define GL_XOR 0x1506
#ifdef WINDOWS
void (__stdcall *glEnable) (int) ;
void (__stdcall *glLogicOp) (int) ;
void (__stdcall *glDisable) (int) ;
#else
void (*glEnable) (int) ;
void (*glLogicOp) (int) ;
void (*glDisable) (int) ;
#endif
int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_VIDEO))
{
printf ("SDL_Init Error: %s", SDL_GetError());
return 1;
}
SDL_SetHint (SDL_HINT_RENDER_DRIVER, "opengl") ;
SDL_Window *window = SDL_CreateWindow("SDL2_gfx test", 100, 100, WIDTH, HEIGHT, SDL_WINDOW_OPENGL);
if (window == NULL)
{
printf ("SDL_CreateWindow Error: %s", SDL_GetError());
SDL_Quit();
return 2;
}
glLogicOp = SDL_GL_GetProcAddress("glLogicOp") ;
glEnable = SDL_GL_GetProcAddress("glEnable") ;
glDisable = SDL_GL_GetProcAddress("glDisable") ;
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == NULL)
{
SDL_DestroyWindow(window);
printf ("SDL_CreateRenderer Error: %s", SDL_GetError());
SDL_Quit();
return 3;
}
SDL_Event e;
int quit = 0;
while (!quit)
{
if (SDL_PollEvent(&e))
{
if (e.type == SDL_QUIT)
quit = 1;
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0xFF, 0xFF);
SDL_RenderClear(renderer);
glEnable (GL_COLOR_LOGIC_OP) ;
glLogicOp (GL_XOR) ;
thickLineColor(renderer, 0, 0, WIDTH, HEIGHT, 20, 0xFFFFFFFF) ;
thickLineColor(renderer, 0, HEIGHT, WIDTH, 0, 20, 0xFFFFFFFF) ;
circleColor(renderer, WIDTH/2, HEIGHT/2, 80, 0xFF00FF00);
filledCircleColor(renderer, WIDTH/2, HEIGHT/2, 60, 0xFF0000FF);
glDisable (GL_COLOR_LOGIC_OP) ;
SDL_RenderPresent(renderer);
SDL_Delay(10);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}