use stb_image for image support

This commit is contained in:
tildearrow 2023-02-15 18:32:31 -05:00
parent 7d191b3db9
commit 0585d127a6
8 changed files with 12114 additions and 3681 deletions

View file

@ -572,6 +572,7 @@ extern/imgui_patched/misc/cpp/imgui_stdlib.cpp
extern/igfd/ImGuiFileDialog.cpp
src/gui/plot_nolerp.cpp
src/gui/font_exo.cpp
src/gui/font_liberationSans.cpp
src/gui/font_mononoki.cpp
@ -582,6 +583,10 @@ src/gui/font_ptMono.cpp
src/gui/font_unifont.cpp
src/gui/font_icon.cpp
src/gui/fonts.cpp
src/gui/image_icon.cpp
src/gui/image.cpp
src/gui/debug.cpp
src/gui/fileDialog.cpp
@ -646,9 +651,7 @@ if (APPLE)
list(APPEND GUI_SOURCES extern/nfd-modified/src/nfd_cocoa.mm)
endif()
if (NOT APPLE)
list(APPEND GUI_SOURCES src/gui/icon.c)
if (NOT WIN32 AND NOT APPLE)
CHECK_INCLUDE_FILE(sys/io.h SYS_IO_FOUND)
CHECK_INCLUDE_FILE(linux/input.h LINUX_INPUT_FOUND)
CHECK_INCLUDE_FILE(linux/kd.h LINUX_KD_FOUND)

View file

@ -25,7 +25,6 @@
#include "gui.h"
#include "util.h"
#include "icon.h"
#include "../ta-log.h"
#include "../fileutils.h"
#include "imgui.h"
@ -5445,8 +5444,9 @@ bool FurnaceGUI::init() {
#if !(defined(__APPLE__) || defined(_WIN32))
// get the icon (on macOS and Windows the icon is bundled with the app)
unsigned char* furIcon=getFurnaceIcon();
SDL_Surface* icon=SDL_CreateRGBSurfaceFrom(furIcon,256,256,32,256*4,0xff,0xff00,0xff0000,0xff000000);
const FurnaceGUIImage* furIcon=getImage(GUI_IMAGE_ICON);
SDL_Surface* icon=NULL;
if (furIcon!=NULL) SDL_CreateRGBSurfaceFrom(furIcon->data,furIcon->width,furIcon->height,32,256*4,0xff,0xff00,0xff0000,0xff000000);
#endif
#ifdef IS_MOBILE
@ -5538,7 +5538,6 @@ bool FurnaceGUI::init() {
if (icon!=NULL) {
SDL_SetWindowIcon(sdlWin,icon);
SDL_FreeSurface(icon);
free(furIcon);
} else {
logW("could not create icon!");
}

View file

@ -649,6 +649,12 @@ enum FurnaceGUIActions {
GUI_ACTION_MAX
};
enum FurnaceGUIImages {
GUI_IMAGE_ICON=0,
GUI_IMAGE_MAX
};
enum FurnaceGUIChanOscRef {
GUI_OSCREF_NONE=0,
GUI_OSCREF_CENTER,
@ -1095,6 +1101,16 @@ struct FurnaceGUIQueryResult {
}
};
struct FurnaceGUIImage {
unsigned char* data;
int width, height, ch;
FurnaceGUIImage():
data(NULL),
width(0),
height(0),
ch(0) {}
};
class FurnaceGUI {
DivEngine* e;
@ -1658,6 +1674,8 @@ class FurnaceGUI {
int renderTimeBegin, renderTimeEnd, renderTimeDelta;
int eventTimeBegin, eventTimeEnd, eventTimeDelta;
std::map<FurnaceGUIImages,FurnaceGUIImage*> images;
int chanToMove, sysToMove, sysToDelete, opToMove;
ImVec2 patWindowPos, patWindowSize;
@ -1855,6 +1873,8 @@ class FurnaceGUI {
void pushToggleColors(bool status);
void popToggleColors();
const FurnaceGUIImage* getImage(FurnaceGUIImages image);
void drawMobileControls();
void drawMobileOrderSel();
void drawEditControls();

File diff suppressed because it is too large Load diff

66
src/gui/image.cpp Normal file
View file

@ -0,0 +1,66 @@
/**
* Furnace Tracker - multi-system chiptune tracker
* Copyright (C) 2021-2023 tildearrow and contributors
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* this license only applies to the code. for the license of each font used,
* see `papers/`.
*/
#include "gui.h"
#include "image.h"
#include "../ta-log.h"
#define STB_IMAGE_IMPLEMENTATION
#define STBI_ONLY_PNG
#define STBI_NO_STDIO
#include "stb_image.h"
const unsigned char* imageData[GUI_IMAGE_MAX]={
image_icon_data
};
const unsigned int imageLen[GUI_IMAGE_MAX]={
image_icon_size
};
const FurnaceGUIImage* FurnaceGUI::getImage(FurnaceGUIImages image) {
FurnaceGUIImage* ret=NULL;
auto retPos=images.find(image);
if (retPos!=images.cend()) {
ret=retPos->second;
} else {
ret=new FurnaceGUIImage;
logV("loading image %d to pool.",(int)image);
ret->data=stbi_load_from_memory(imageData[image],imageLen[image],&ret->width,&ret->height,&ret->ch,STBI_rgb_alpha);
if (ret->data==NULL) {
logE("could not load image %d!",(int)image);
delete ret;
return NULL;
}
logV("%dx%d",ret->width,ret->height);
images[image]=ret;
}
// warning silencers
stbi__addints_valid(2,2);
stbi__mul2shorts_valid(2,2);
return ret;
}

View file

@ -17,10 +17,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifdef __cplusplus
extern "C" {
#endif
unsigned char* getFurnaceIcon();
#ifdef __cplusplus
}
#ifndef _IMAGE_H
#define _IMAGE_H
extern const unsigned char image_icon_data[];
extern const unsigned int image_icon_size;
#endif

4028
src/gui/image_icon.cpp Normal file

File diff suppressed because it is too large Load diff

7987
src/gui/stb_image.h Normal file

File diff suppressed because it is too large Load diff