--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/context.c Wed Nov 01 21:00:33 2023 +0100 @@ -0,0 +1,84 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * Copyright 2023 Mike Becker. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "ascension/context.h" +#include "ascension/error.h" +#include "ascension/utils.h" + +#include <cx/linked_list.h> + +#include <SDL2/SDL.h> +#include <SDL2/SDL_ttf.h> + +AscContext asc_context; + +void asc_context_initialize(void) { + if (asc_test_flag(asc_context.flags, ASC_FLAG_INITILIZED)) + return; + asc_clear_flag(&asc_context.flags, ASC_FLAG_HAS_ERROR); + + // initialize error buffer + cxBufferInit( + &asc_context.error_buffer, + NULL, + 256, + NULL, + CX_BUFFER_AUTO_EXTEND + ); + + // initialize data + memset(asc_context.windows, 0, sizeof (asc_context.windows)); + + // initialize SDL + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + asc_error(SDL_GetError()); + } else { + if (TTF_Init() < 0) { + asc_error(TTF_GetError()); + } + } + SDL_ClearError(); + asc_set_flag(&asc_context.flags, ASC_FLAG_INITILIZED); + asc_dprintf("Ascension context initialized."); +} + +void asc_context_destroy(void) { + // destroy data + for (unsigned int i = 0 ; i < ASC_MAX_WINDOWS ; i++) { + asc_window_destroy(&asc_context.windows[i]); + } + + // quit SDL + if (TTF_WasInit()) + TTF_Quit(); + SDL_Quit(); + + // destroy the error buffer + cxBufferDestroy(&asc_context.error_buffer); + asc_context.flags = 0; + asc_dprintf("Ascension context destroyed."); +}