mirror of
				https://github.com/thunderbrewhq/thunderbrew
				synced 2025-11-01 00:36:04 +03:00 
			
		
		
		
	 706c8903a1
			
		
	
	
		706c8903a1
		
			
		
	
	
	
	
		
			
			* chore(build): add vendored SDL 3.0.0 library * chore(build): add vendored glew-cmake-2.2.0 library * feat(console): in the presence of -opengl launch flag, change GxApi to OpenGl * feat(gx): add uncompleted CGxDeviceGLSDL targeting Windows and Linux * chore(build): change SDL3 linkage from shared (bad) to to static (good)
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|   Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org>
 | |
|   Copyright 2022 Collabora Ltd.
 | |
| 
 | |
|   This software is provided 'as-is', without any express or implied
 | |
|   warranty.  In no event will the authors be held liable for any damages
 | |
|   arising from the use of this software.
 | |
| 
 | |
|   Permission is granted to anyone to use this software for any purpose,
 | |
|   including commercial applications, and to alter it and redistribute it
 | |
|   freely.
 | |
| */
 | |
| 
 | |
| #include "testutils.h"
 | |
| 
 | |
| /**
 | |
|  * Return the absolute path to def in the SDL_GetBasePath() if possible, or
 | |
|  * the relative path to def on platforms that don't have a working
 | |
|  * SDL_GetBasePath(). Free the result with SDL_free.
 | |
|  *
 | |
|  * Fails and returns NULL if out of memory.
 | |
|  */
 | |
| char *
 | |
| GetNearbyFilename(const char *file)
 | |
| {
 | |
|     char *base;
 | |
|     char *path;
 | |
| 
 | |
|     base = SDL_GetBasePath();
 | |
| 
 | |
|     if (base != NULL) {
 | |
|         SDL_RWops *rw;
 | |
|         size_t len = SDL_strlen(base) + SDL_strlen(file) + 1;
 | |
| 
 | |
|         path = SDL_malloc(len);
 | |
| 
 | |
|         if (path == NULL) {
 | |
|             SDL_free(base);
 | |
|             SDL_OutOfMemory();
 | |
|             return NULL;
 | |
|         }
 | |
| 
 | |
|         (void)SDL_snprintf(path, len, "%s%s", base, file);
 | |
|         SDL_free(base);
 | |
| 
 | |
|         rw = SDL_RWFromFile(path, "rb");
 | |
|         if (rw) {
 | |
|             SDL_RWclose(rw);
 | |
|             return path;
 | |
|         }
 | |
| 
 | |
|         /* Couldn't find the file in the base path */
 | |
|         SDL_free(path);
 | |
|     }
 | |
| 
 | |
|     path = SDL_strdup(file);
 | |
|     if (path == NULL) {
 | |
|         SDL_OutOfMemory();
 | |
|     }
 | |
|     return path;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * If user_specified is non-NULL, return a copy of it. Free with SDL_free.
 | |
|  *
 | |
|  * Otherwise, return the absolute path to def in the SDL_GetBasePath() if
 | |
|  * possible, or the relative path to def on platforms that don't have a
 | |
|  * working SDL_GetBasePath(). Free the result with SDL_free.
 | |
|  *
 | |
|  * Fails and returns NULL if out of memory.
 | |
|  */
 | |
| char *
 | |
| GetResourceFilename(const char *user_specified, const char *def)
 | |
| {
 | |
|     if (user_specified != NULL) {
 | |
|         char *ret = SDL_strdup(user_specified);
 | |
| 
 | |
|         if (ret == NULL) {
 | |
|             SDL_OutOfMemory();
 | |
|         }
 | |
| 
 | |
|         return ret;
 | |
|     } else {
 | |
|         return GetNearbyFilename(def);
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Load the .bmp file whose name is file, from the SDL_GetBasePath() if
 | |
|  * possible or the current working directory if not.
 | |
|  *
 | |
|  * If transparent is true, set the transparent colour from the top left pixel.
 | |
|  *
 | |
|  * If width_out is non-NULL, set it to the texture width.
 | |
|  *
 | |
|  * If height_out is non-NULL, set it to the texture height.
 | |
|  */
 | |
| SDL_Texture *
 | |
| LoadTexture(SDL_Renderer *renderer, const char *file, SDL_bool transparent,
 | |
|             int *width_out, int *height_out)
 | |
| {
 | |
|     SDL_Surface *temp = NULL;
 | |
|     SDL_Texture *texture = NULL;
 | |
|     char *path;
 | |
| 
 | |
|     path = GetNearbyFilename(file);
 | |
| 
 | |
|     if (path != NULL) {
 | |
|         file = path;
 | |
|     }
 | |
| 
 | |
|     temp = SDL_LoadBMP(file);
 | |
|     if (temp == NULL) {
 | |
|         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s", file, SDL_GetError());
 | |
|     } else {
 | |
|         /* Set transparent pixel as the pixel at (0,0) */
 | |
|         if (transparent) {
 | |
|             if (temp->format->palette) {
 | |
|                 SDL_SetSurfaceColorKey(temp, SDL_TRUE, *(Uint8 *)temp->pixels);
 | |
|             } else {
 | |
|                 switch (temp->format->BitsPerPixel) {
 | |
|                 case 15:
 | |
|                     SDL_SetSurfaceColorKey(temp, SDL_TRUE,
 | |
|                                     (*(Uint16 *)temp->pixels) & 0x00007FFF);
 | |
|                     break;
 | |
|                 case 16:
 | |
|                     SDL_SetSurfaceColorKey(temp, SDL_TRUE, *(Uint16 *)temp->pixels);
 | |
|                     break;
 | |
|                 case 24:
 | |
|                     SDL_SetSurfaceColorKey(temp, SDL_TRUE,
 | |
|                                     (*(Uint32 *)temp->pixels) & 0x00FFFFFF);
 | |
|                     break;
 | |
|                 case 32:
 | |
|                     SDL_SetSurfaceColorKey(temp, SDL_TRUE, *(Uint32 *)temp->pixels);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (width_out != NULL) {
 | |
|             *width_out = temp->w;
 | |
|         }
 | |
| 
 | |
|         if (height_out != NULL) {
 | |
|             *height_out = temp->h;
 | |
|         }
 | |
| 
 | |
|         texture = SDL_CreateTextureFromSurface(renderer, temp);
 | |
|         if (texture == NULL) {
 | |
|             SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create texture: %s\n", SDL_GetError());
 | |
|         }
 | |
|     }
 | |
|     SDL_DestroySurface(temp);
 | |
|     if (path) {
 | |
|         SDL_free(path);
 | |
|     }
 | |
|     return texture;
 | |
| }
 |