void loop() { int i; SDL_Event event; /* Check for events */ while (SDL_PollEvent(&event)) { SDLTest_CommonEvent(state, &event, &done); } for (i = 0; i < state->num_windows; ++i) { SDL_Renderer *renderer = state->renderers[i]; if (state->windows[i] == NULL) continue; SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); DrawRects(renderer); DrawLines(renderer); DrawPoints(renderer); SDL_RenderPresent(renderer); } #ifdef __EMSCRIPTEN__ if (done) { emscripten_cancel_main_loop(); } #endif }
//Draws an array of rectangles with an outline color and fill color //param:rectangles->The array of rectangles //param:numberOfRectangles->The size of the array //param:outlineColor->The color to outline the rectangles with //param:fillColor->The color to fill the rectangles with //returns 0 for success, -1 for errors int SpriteBatch::DrawOutlinedFilledRects(SDL_Rect* rectangles, int numberOfRectangles, SDL_Color outlineColor, SDL_Color fillColor) { int result = 0; //Draw the filled rectangle result = DrawFilledRects(rectangles, numberOfRectangles, fillColor); //Check for filled rectangle drawing errors if(result != 0) { std::cout<<"DrawOutlinedFilledRect error: Error drawing filled rectangle"<<std::endl; return result; } //Draw outlined rectangle result = DrawRects(rectangles, numberOfRectangles, outlineColor); //Check for outline rectangle drawing errors if(result != 0) { std::cout<<"DrawOutlinedFilledRect error: Error drawing outline rectangle"<<std::endl; return result; } //Return success return result; }
static void loop(){ /* Check for events */ while (SDL_PollEvent(&event)) { SDLTest_CommonEvent(state, &event, &done); switch(event.type) { case SDL_MOUSEMOTION: { rect.x += event.motion.xrel; rect.y += event.motion.yrel; } break; } } for (i = 0; i < state->num_windows; ++i) { SDL_Rect viewport; SDL_Renderer *renderer = state->renderers[i]; if (state->windows[i] == NULL) continue; SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); /* Wrap the cursor rectangle at the screen edges to keep it visible */ SDL_RenderGetViewport(renderer, &viewport); if (rect.x < viewport.x) rect.x += viewport.w; if (rect.y < viewport.y) rect.y += viewport.h; if (rect.x > viewport.x + viewport.w) rect.x -= viewport.w; if (rect.y > viewport.y + viewport.h) rect.y -= viewport.h; DrawRects(renderer, &rect); SDL_RenderPresent(renderer); } }
/****************************************************************\ * Routine to start semaphore example * *--------------------------------------------------------------* * * * Name: StartSemExample(VOID) * * * * Purpose: Calls routines to create semaphores and draw * * resources. Creates consumer threads. * * * * Usage: Called in file usercmd.c when the user selects * * start from the semaphore menu. * * * * Method: Uses routines in paint.c to draw consumers and * * resources. This is done by creating a paint * * message, not calling the draw routines directly. * * * * Returns: TRUE if start succeeds, FALSE if start fails * * * \****************************************************************/ INT StartSemExample(VOID) { TID tid=0; ULONG rc; INT i; FONTMETRICS fntmet; HPS hps; SWP swp; InitSemaphExample(); rc = CreateAllSems(); if (rc) return FALSE; /****************************************************************\ * Create consumer threads. Note that values can be passed to * * threads in OS/2 2.0. We pass the ordinal number of the child * * to each child. * \****************************************************************/ for (usConsumerThreadsCreated = 0; usConsumerThreadsCreated < cNumUsers; usConsumerThreadsCreated++) { rc = DosCreateThread((PTID) &tid, (PFNTHREAD)ThreadConsumer, (ULONG) usConsumerThreadsCreated, (ULONG)1,(ULONG) STACKSIZE); if (rc) { SemError("DosCreateThread",rc); return FALSE; } else { thrConsumers[usConsumerThreadsCreated].tid = tid; thrConsumers[usConsumerThreadsCreated].lHits = 0L; } } for (i = 0; i < (INT) cNumUsers; i++) { DosResumeThread (thrConsumers[i].tid); } hps = WinGetPS (hwndMain); if (hps) { GpiQueryFontMetrics (hps, (LONG) sizeof fntmet, &fntmet); WinQueryWindowPos (hwndMain, &swp); SetRectPositions((SHORT)swp.cx, (SHORT)swp.cy, (SHORT) fntmet.lMaxBaselineExt, (SHORT) fntmet.lMaxDescender); DrawRects (hps); WinReleasePS (hps); } return TRUE; }
int main(int argc, char *argv[]) { int done; SDL_Event event; Uint32 then, now, frames; SDL_Window *window; SDL_Surface *surface; SDL_Renderer *renderer; SDL_DisplayMode mode; /* Enable standard application logging */ SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); /* Initialize parameters */ num_objects = NUM_OBJECTS; /* Initialize SDL */ if(SDL_Init(SDL_INIT_VIDEO) != 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_Init fail : %s\n", SDL_GetError()); return 1; } SDL_GetDesktopDisplayMode(0, &mode); /* Create window and renderer for given surface */ window = SDL_CreateWindow("Draw2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, mode.w, mode.h, SDL_WINDOW_SHOWN); if(!window) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Window creation fail : %s\n",SDL_GetError()); return 1; } surface = SDL_GetWindowSurface(window); renderer = SDL_CreateSoftwareRenderer(surface); if(!renderer) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Render creation for surface fail : %s\n",SDL_GetError()); return 1; } SDL_SetRenderDrawBlendMode(renderer, blendMode); SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); srand((unsigned int)time(NULL)); /* Main render loop */ frames = 0; then = SDL_GetTicks(); done = 0; while (!done) { /* Check for events */ ++frames; while (SDL_PollEvent(&event)) { if (event.type == SDL_KEYDOWN && event.key.keysym.scancode == SDL_SCANCODE_AC_BACK) { done = 1; } if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) { SDL_Log("update screen size"); SDL_DestroyRenderer(renderer); surface = SDL_GetWindowSurface(window); renderer = SDL_CreateSoftwareRenderer(surface); if(!renderer) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Render creation for surface fail : %s\n",SDL_GetError()); done = 1; break; } SDL_SetRenderDrawBlendMode(renderer, blendMode); SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); } } SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); DrawRects(renderer); DrawLines(renderer); DrawPoints(renderer); SDL_RenderPresent(renderer); SDL_UpdateWindowSurface(window); } /* Print out some timing information */ now = SDL_GetTicks(); if (now > then) { double fps = ((double) frames * 1000) / (now - then); SDL_Log("%2.2f frames per second\n", fps); } SDL_Quit(); return 0; }
int main(int argc, char *argv[]) { int i, done; SDL_Event event; /* Initialize test framework */ state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO); if (!state) { return 1; } for (i = 1; i < argc;i++) { SDLTest_CommonArg(state, i); } if (!SDLTest_CommonInit(state)) { return 2; } /* Create the windows and initialize the renderers */ for (i = 0; i < state->num_windows; ++i) { SDL_Renderer *renderer = state->renderers[i]; SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE); SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); } srand((unsigned int)time(NULL)); if(SDL_SetRelativeMouseMode(SDL_TRUE) < 0) { return 3; }; rect.x = DEFAULT_WINDOW_WIDTH / 2; rect.y = DEFAULT_WINDOW_HEIGHT / 2; rect.w = 10; rect.h = 10; /* Main render loop */ done = 0; while (!done) { /* Check for events */ while (SDL_PollEvent(&event)) { SDLTest_CommonEvent(state, &event, &done); switch(event.type) { case SDL_MOUSEMOTION: { /*printf("mouse motion ABS x %d y %d REL x %d y %d\n",event.motion.x,event.motion.y,event.motion.xrel,event.motion.yrel);*/ rect.x += event.motion.xrel; rect.y += event.motion.yrel; } break; } } for (i = 0; i < state->num_windows; ++i) { SDL_Renderer *renderer = state->renderers[i]; SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); DrawRects(renderer); SDL_RenderPresent(renderer); } } SDLTest_CommonQuit(state); return 0; }
int main(int argc, char *argv[]) { int i, done; SDL_Event event; Uint32 then, now, frames; /* Enable standard application logging */ SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); /* Initialize parameters */ num_objects = NUM_OBJECTS; /* Initialize test framework */ state = SDLTest_CommonCreateState(argv, SDL_INIT_VIDEO); if (!state) { return 1; } for (i = 1; i < argc;) { int consumed; consumed = SDLTest_CommonArg(state, i); if (consumed == 0) { consumed = -1; if (SDL_strcasecmp(argv[i], "--blend") == 0) { if (argv[i + 1]) { if (SDL_strcasecmp(argv[i + 1], "none") == 0) { blendMode = SDL_BLENDMODE_NONE; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { blendMode = SDL_BLENDMODE_BLEND; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { blendMode = SDL_BLENDMODE_ADD; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { blendMode = SDL_BLENDMODE_MOD; consumed = 2; } } } else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) { cycle_color = SDL_TRUE; consumed = 1; } else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) { cycle_alpha = SDL_TRUE; consumed = 1; } else if (SDL_isdigit(*argv[i])) { num_objects = SDL_atoi(argv[i]); consumed = 1; } } if (consumed < 0) { SDL_Log("Usage: %s %s [--blend none|blend|add|mod] [--cyclecolor] [--cyclealpha]\n", argv[0], SDLTest_CommonUsage(state)); return 1; } i += consumed; } if (!SDLTest_CommonInit(state)) { return 2; } /* Create the windows and initialize the renderers */ for (i = 0; i < state->num_windows; ++i) { SDL_Renderer *renderer = state->renderers[i]; SDL_SetRenderDrawBlendMode(renderer, blendMode); SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); } srand((unsigned int)time(NULL)); /* Main render loop */ frames = 0; then = SDL_GetTicks(); done = 0; while (!done) { /* Check for events */ ++frames; while (SDL_PollEvent(&event)) { SDLTest_CommonEvent(state, &event, &done); } for (i = 0; i < state->num_windows; ++i) { SDL_Renderer *renderer = state->renderers[i]; if (state->windows[i] == NULL) continue; SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); DrawRects(renderer); DrawLines(renderer); DrawPoints(renderer); SDL_RenderPresent(renderer); } } SDLTest_CommonQuit(state); /* Print out some timing information */ now = SDL_GetTicks(); if (now > then) { double fps = ((double) frames * 1000) / (now - then); SDL_Log("%2.2f frames per second\n", fps); } return 0; }
/* FileOpen -- uses GetOpenFileName to prompt user for AVI and HOT filenames. Uses fileOpenMovie to load the AVI file, and playMovie and setMovie and MCI_WHERE to get it into the window and on the first frame. Uses InitHotspots() to load hotspot file. */ BOOL FileOpen(HWND hWnd) { static OPENFILENAME ofn; char szBuf[129]; char szFileName[MAXFILENAME] = ""; char szFileTitle[MAXFILENAME] = ""; char szFilterSpec [128] = /* file type filters */ "AVI Files (*.AVI)\0*.AVI\0All Files (*.*)\0*.*\0"; char szFilterSpec2 [128] = "Hotspot Files (*.HOT)\0*.HOT\0All Files (*.*)\0*.*\0"; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAXFILENAME; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAXFILENAME; ofn.lpstrTitle = "Open AVI File"; ofn.lpstrDefExt = "AVI"; ofn.Flags = 0; if (!GetOpenFileName ((LPOPENFILENAME)&ofn)) return FALSE; if (pMovieInfo) // get rid of old stuff if there is { fileCloseMovie(pMovieInfo, TRUE); DeleteHotspotList(pMovieInfo); FREE(pMovieInfo); } lstrcpy(szWindowTitle, szBaseWindowTitle); lstrcat(szWindowTitle, " - "); lstrcat(szWindowTitle, szFileTitle); SetWindowText(hWnd, szWindowTitle); { // added SetProp to accomodate new drawproc HANDLE hglb; hglb = GlobalAlloc(GHND,(DWORD)(sizeof(MOVIEINFO))); if (hglb) { pMovieInfo = (PMOVIEINFO) GlobalLock(hglb); } else { pMovieInfo = NULL; } //pMovieInfo = (PMOVIEINFO) ((hglb = GlobalAlloc(GHND, (DWORD)(sizeof(MOVIEINFO)))) ? GlobalLock(hglb) : NULL); if (!pMovieInfo) return (FALSE); pMovieInfo->hwndParent = hWnd; lstrcpy(pMovieInfo->szAVIFileName, ofn.lpstrFile); fileOpenMovie(pMovieInfo, ofn.lpstrFile); SetProp(hWnd, (LPSTR) szMovieInfo,hglb); SetProp(pMovieInfo->hwndMovie, (LPSTR) szMovieInfo, hglb); { char a[256];wsprintf(a,"wnd1 %X wnd2 %X\n",hWnd,pMovieInfo->hwndMovie); OutputDebugString(a);} } //playMovie(pMovieInfo, 0); // screws up drawproc for some reason { MCI_DGV_SETVIDEO_PARMS dgv; UINT uDevice; dgv.dwValue = (DWORD) ICAVIDrawProc; //MakeProcInstance((FARPROC) ICAVIDrawProc,hInstApp); dgv.dwItem = MCI_AVI_SETVIDEO_DRAW_PROCEDURE; uDevice = pMovieInfo->wMCIDeviceID; if (uDevice) { DWORD dw; dw = mciSendCommand(uDevice, MCI_SETVIDEO, MCI_DGV_SETVIDEO_ITEM | MCI_DGV_SETVIDEO_VALUE, (DWORD) (MCI_DGV_SETVIDEO_PARMS FAR *)&dgv); OutputDebugString("set draw proc!\n"); if (dw != 0) { MessageBox(GetFocus(), "The currently installed MCIAVI does not " "support the MCI_AVI_SETVIDEO_DRAW_PROCEDURE " "command during play.","MCI Problem", MB_OK | MB_ICONHAND); } } else { MessageBox(GetFocus(),"movie info has no device id", "real bummer",MB_OK); } } setMovie(pMovieInfo, pMovieInfo->dwCurrentFrame, NULL); { RECT rcClient, rcWindow; //rcMovieBounds, rc MCI_DGV_RECT_PARMS mciRect; BOOL retcode = TRUE; /* if there is no movie yet then just get out of here */ GetClientRect(hWnd, &rcClient); /* get the parent windows rect */ GetWindowRect(hWnd, &rcWindow); mciSendCommand(pMovieInfo->wMCIDeviceID, MCI_WHERE, (DWORD)(MCI_DGV_WHERE_SOURCE), (DWORD)(LPMCI_DGV_RECT_PARMS)&mciRect); } pMovieInfo->fPlaying = FALSE; bFileLoaded = TRUE; wsprintf(szBuf, "%ld of %ld", pMovieInfo->dwCurrentFrame, pMovieInfo->dwMovieLength); SetDlgItemText(hwndDlg, ID_CURRENTFRAME, szBuf); // now try opening a HOT file memset(szFileName, 0, sizeof(szFileName)); memset(szFileTitle, 0, sizeof(szFileTitle)); memset(&ofn, 0, sizeof(OPENFILENAME)); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.lpstrFilter = szFilterSpec2; ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = 1; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAXFILENAME; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAXFILENAME; ofn.lpstrTitle = "Open Hotspot File"; ofn.lpstrDefExt = "HOT"; ofn.Flags = 0; if (!GetOpenFileName ((LPOPENFILENAME)&ofn)) return TRUE; lstrcpy(pMovieInfo->szIniFileName, ofn.lpstrFile); InitHotspots(pMovieInfo, ofn.lpstrFile); if (pMovieInfo->pHotspotList && pMovieInfo->hwndMovie) { HDC hDC; hDC = GetDC(pMovieInfo->hwndMovie); DrawRects(hDC, pMovieInfo); ReleaseDC(pMovieInfo->hwndMovie, hDC); } return TRUE; }
int main(int argc, char *argv[]) { int mouse_begin_x = -1, mouse_begin_y = -1; int i, done; SDL_Event event; Uint32 then, now, frames; /* Initialize parameters */ num_objects = NUM_OBJECTS; /* Initialize test framework */ state = CommonCreateState(argv, SDL_INIT_VIDEO); if (!state) { return 1; } for (i = 1; i < argc;) { int consumed; consumed = CommonArg(state, i); if (consumed == 0) { consumed = -1; if (SDL_strcasecmp(argv[i], "--blend") == 0) { if (argv[i + 1]) { if (SDL_strcasecmp(argv[i + 1], "none") == 0) { blendMode = SDL_BLENDMODE_NONE; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mask") == 0) { blendMode = SDL_BLENDMODE_MASK; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) { blendMode = SDL_BLENDMODE_BLEND; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "add") == 0) { blendMode = SDL_BLENDMODE_ADD; consumed = 2; } else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) { blendMode = SDL_BLENDMODE_MOD; consumed = 2; } } } else if (SDL_strcasecmp(argv[i], "--cyclecolor") == 0) { cycle_color = SDL_TRUE; consumed = 1; } else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) { cycle_alpha = SDL_TRUE; consumed = 1; } else if (SDL_isdigit(*argv[i])) { num_objects = SDL_atoi(argv[i]); consumed = 1; } } if (consumed < 0) { fprintf(stderr, "Usage: %s %s [--blend none|mask|blend|add|mod] [--cyclecolor] [--cyclealpha]\n", argv[0], CommonUsage(state)); return 1; } i += consumed; } if (!CommonInit(state)) { return 2; } /* Create the windows and initialize the renderers */ for (i = 0; i < state->num_windows; ++i) { SDL_SelectRenderer(state->windows[i]); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(); } srand(time(NULL)); /* Main render loop */ frames = 0; then = SDL_GetTicks(); done = 0; while (!done) { /* Check for events */ ++frames; while (SDL_PollEvent(&event)) { CommonEvent(state, &event, &done); switch (event.type) { case SDL_MOUSEBUTTONDOWN: if (event.button.which == 0) { mouse_begin_x = event.button.x; mouse_begin_y = event.button.y; } break; case SDL_MOUSEBUTTONUP: if (event.button.which == 0) { if (event.button.button == 3) add_line(mouse_begin_x, mouse_begin_y, event.button.x, event.button.y); if (event.button.button == 1) add_rect(mouse_begin_x, mouse_begin_y, event.button.x, event.button.y); } break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case 'l': if (event.key.keysym.mod & KMOD_SHIFT) num_lines = 0; else add_line(rand() % 640, rand() % 480, rand() % 640, rand() % 480); break; case 'r': if (event.key.keysym.mod & KMOD_SHIFT) num_rects = 0; else add_rect(rand() % 640, rand() % 480, rand() % 640, rand() % 480); break; } break; case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_EXPOSED: SDL_SelectRenderer(SDL_GetWindowFromID(event.window.windowID)); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(); break; } break; default: break; } } for (i = 0; i < state->num_windows; ++i) { SDL_SelectRenderer(state->windows[i]); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(); DrawRects(state->windows[i]); DrawPoints(state->windows[i]); DrawRectRectIntersections(state->windows[i]); DrawLines(state->windows[i]); DrawRectLineIntersections(state->windows[i]); SDL_RenderPresent(); } } CommonQuit(state); /* Print out some timing information */ now = SDL_GetTicks(); if (now > then) { double fps = ((double) frames * 1000) / (now - then); printf("%2.2f frames per second\n", fps); } return 0; }
void loop() { int i; SDL_Event event; /* Check for events */ while (SDL_PollEvent(&event)) { SDLTest_CommonEvent(state, &event, &done); switch (event.type) { case SDL_MOUSEBUTTONDOWN: mouse_begin_x = event.button.x; mouse_begin_y = event.button.y; break; case SDL_MOUSEBUTTONUP: if (event.button.button == 3) add_line(mouse_begin_x, mouse_begin_y, event.button.x, event.button.y); if (event.button.button == 1) add_rect(mouse_begin_x, mouse_begin_y, event.button.x, event.button.y); break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case 'l': if (event.key.keysym.mod & KMOD_SHIFT) num_lines = 0; else add_line(rand() % 640, rand() % 480, rand() % 640, rand() % 480); break; case 'r': if (event.key.keysym.mod & KMOD_SHIFT) num_rects = 0; else add_rect(rand() % 640, rand() % 480, rand() % 640, rand() % 480); break; } break; default: break; } } for (i = 0; i < state->num_windows; ++i) { SDL_Renderer *renderer = state->renderers[i]; if (state->windows[i] == NULL) continue; SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_RenderClear(renderer); DrawRects(renderer); DrawPoints(renderer); DrawRectRectIntersections(renderer); DrawLines(renderer); DrawRectLineIntersections(renderer); SDL_RenderPresent(renderer); } #ifdef __EMSCRIPTEN__ if (done) { emscripten_cancel_main_loop(); } #endif }