/* * Copyright (c) 2025 Aldrik Ramaekers * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include "assets.hpp" #include "strops.hpp" #include "assets/splash.h" #include "assets/logos/MailSender.h" #include "assets/logos/Perplexity.h" #include "assets/logos/OpenAI.h" #include "assets/logos/Gemini.h" #define MAX_IMAGE_COUNT 5 image _image_dict[MAX_IMAGE_COUNT] = { (image){-1, "img/splash", (const void*)img_splash, img_splash_length}, (image){-1, "img/logos/mailsender", (const void*)img_mailsender, img_mailsender_length}, (image){-1, "img/logos/openai", (const void*)img_openai, img_openai_length}, (image){-1, "img/logos/perplexity", (const void*)img_perplexity, img_perplexity_length}, (image){-1, "img/logos/gemini", (const void*)img_gemini, img_gemini_length}, }; static int _load_image(image img) { int width, height, channels; unsigned char* data = stbi_load_from_memory((const stbi_uc*)img.data_start, img.data_length, &width, &height, &channels, 0); if (!data) { printf("%s\n", stbi_failure_reason()); return 0; } GLuint textureID; glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_2D, textureID); // Set texture parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Upload texture data GLenum format = (channels == 4) ? GL_RGBA : GL_RGB; glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data); //glGenerateMipmap(GL_TEXTURE_2D); // Free image memory stbi_image_free(data); return textureID; } s32 assets::load_image(const char* name) { for (u32 i = 0; i < MAX_IMAGE_COUNT; i++) { if (strops::equals(_image_dict[i].name, name)) { if (_image_dict[i].img_id == -1) { _image_dict[i].img_id = _load_image(_image_dict[i]); } return _image_dict[i].img_id; } } return 0; }