Merge branch 'tildearrow:master' into tuner

This commit is contained in:
recme 2025-08-19 23:09:55 -04:00 committed by GitHub
commit 33fcd57865
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
107 changed files with 54390 additions and 49527 deletions

View file

@ -146,7 +146,7 @@ const char* aboutLine[]={
_N("MAME µPD1771C-017 HLE core by David Viens"),
_N("SAASound by Dave Hooper and Simon Owen"),
_N("SameBoy by Lior Halphon"),
_N("Mednafen PCE, WonderSwan, T6W28 and Virtual Boy audio cores"),
_N("Mednafen PCE, WonderSwan, T6W28 (modified) and Virtual Boy audio cores"),
_N("WonderSwan new core by asiekierka"),
_N("SNES DSP core by Blargg"),
_N("puNES (NES, MMC5 and FDS) by FHorse (modified version)"),

View file

@ -7780,7 +7780,7 @@ bool FurnaceGUI::init() {
ImGui::CreateContext();
rend->initGUI(sdlWin);
ImGuiLocEntry guiLocalization[8];
ImGuiLocEntry guiLocalization[12];
guiLocalization[0].Key=ImGuiLocKey_TableSizeOne;
guiLocalization[0].Text=_("Size column to fit###SizeOne");
@ -7796,10 +7796,18 @@ bool FurnaceGUI::init() {
guiLocalization[5].Text=_("(Popup)");
guiLocalization[6].Key=ImGuiLocKey_WindowingUntitled;
guiLocalization[6].Text=_("(Untitled)");
guiLocalization[7].Key=ImGuiLocKey_DockingHideTabBar;
guiLocalization[7].Text=_("Hide tab bar###HideTabBar");
guiLocalization[7].Key=ImGuiLocKey_OpenLink_s;
guiLocalization[7].Text=_("Open '%s'");
guiLocalization[8].Key=ImGuiLocKey_CopyLink;
guiLocalization[8].Text=_("Copy Link###CopyLink");
guiLocalization[9].Key=ImGuiLocKey_DockingHideTabBar;
guiLocalization[9].Text=_("Hide tab bar###HideTabBar");
guiLocalization[10].Key=ImGuiLocKey_DockingHoldShiftToDock;
guiLocalization[10].Text=_("Hold SHIFT to enable Docking window.");
guiLocalization[11].Key=ImGuiLocKey_DockingDragToUndockOrMoveNode,
guiLocalization[11].Text=_("Click and drag to move or undock whole node.");
ImGui::LocalizeRegisterEntries(guiLocalization,8);
ImGui::LocalizeRegisterEntries(guiLocalization,12);
const char* localeSettings=_("LocaleSettings: ccjk");
if (strlen(localeSettings)<20) {

View file

@ -215,6 +215,11 @@ enum FurnaceGUIColors {
GUI_COLOR_TEXT_SELECTION,
GUI_COLOR_TABLE_ROW_EVEN,
GUI_COLOR_TABLE_ROW_ODD,
GUI_COLOR_INPUT_TEXT_CURSOR,
GUI_COLOR_TAB_SELECTED_OVERLINE,
GUI_COLOR_TAB_DIMMED_SELECTED_OVERLINE,
GUI_COLOR_TEXT_LINK,
GUI_COLOR_TREE_LINES,
GUI_COLOR_TOGGLE_OFF,
GUI_COLOR_TOGGLE_ON,
@ -458,6 +463,7 @@ enum FurnaceGUIColors {
GUI_COLOR_SAMPLE_CHIP_DISABLED,
GUI_COLOR_SAMPLE_CHIP_ENABLED,
GUI_COLOR_SAMPLE_CHIP_WARNING,
GUI_COLOR_SAMPLE_LOOP_HINT,
GUI_COLOR_PAT_MANAGER_NULL,
GUI_COLOR_PAT_MANAGER_USED,

View file

@ -912,6 +912,11 @@ const FurnaceGUIColorDef guiColors[GUI_COLOR_MAX]={
D(GUI_COLOR_TEXT_SELECTION,"",ImVec4(0.165f,0.313f,0.49f,1.0f)),
D(GUI_COLOR_TABLE_ROW_EVEN,"",ImVec4(0.0f,0.0f,0.0f,0.0f)),
D(GUI_COLOR_TABLE_ROW_ODD,"",ImVec4(1.0f,1.0f,1.0f,0.06f)),
D(GUI_COLOR_INPUT_TEXT_CURSOR,"",ImVec4(1.0f,1.0f,1.0f,1.0f)),
D(GUI_COLOR_TAB_SELECTED_OVERLINE,"",ImVec4(0.26f,0.59f,0.98f,1.0f)),
D(GUI_COLOR_TAB_DIMMED_SELECTED_OVERLINE,"",ImVec4(0.5f,0.5f,0.5f,1.0f)),
D(GUI_COLOR_TEXT_LINK,"",ImVec4(0.26f,0.59f,0.98f,1.0f)),
D(GUI_COLOR_TREE_LINES,"",ImVec4(0.43f,0.43f,0.5f,0.5f)),
D(GUI_COLOR_TOGGLE_OFF,"",ImVec4(0.2f,0.2f,0.2f,1.0f)),
D(GUI_COLOR_TOGGLE_ON,"",ImVec4(0.2f,0.6f,0.2f,1.0f)),
@ -1156,6 +1161,7 @@ const FurnaceGUIColorDef guiColors[GUI_COLOR_MAX]={
D(GUI_COLOR_SAMPLE_CHIP_DISABLED,"",ImVec4(0.6f,0.6f,0.6f,1.0f)),
D(GUI_COLOR_SAMPLE_CHIP_ENABLED,"",ImVec4(0.3f,1.0f,0.3f,1.0f)),
D(GUI_COLOR_SAMPLE_CHIP_WARNING,"",ImVec4(1.0f,0.75f,0.3f,1.0f)),
D(GUI_COLOR_SAMPLE_LOOP_HINT,"",ImVec4(1.0f,0.7f,0.0f,0.8f)),
D(GUI_COLOR_PAT_MANAGER_NULL,"",ImVec4(0.15f,0.15f,0.15f,1.0f)),
D(GUI_COLOR_PAT_MANAGER_USED,"",ImVec4(0.15f,1.0f,0.15f,1.0f)),

View file

@ -1233,7 +1233,9 @@ void FurnaceGUI::drawPattern() {
} else {
ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha);
}
ImGui::PushID("prevPatterns");
for (int i=0; i<dummyRows-1; i++) {
ImGui::PushID(i);
patternRow(viewRow,e->isPlaying(),lineHeight,chans,viewOrder,patCache,orderLock);
if (++viewRow>=e->curSubSong->patLen) {
viewRow=0;
@ -1242,7 +1244,9 @@ void FurnaceGUI::drawPattern() {
patCache[j]=e->curPat[j].getPattern(e->curOrders->ord[j][viewOrder],false);
}
}
ImGui::PopID();
}
ImGui::PopID();
if (orderLock) {
ImGui::EndDisabled();
} else {
@ -1273,7 +1277,9 @@ void FurnaceGUI::drawPattern() {
} else {
ImGui::PushStyleVar(ImGuiStyleVar_Alpha,ImGui::GetStyle().Alpha*ImGui::GetStyle().DisabledAlpha);
}
ImGui::PushID("nextPatterns");
for (int i=0; i<=dummyRows; i++) {
ImGui::PushID(i);
patternRow(viewRow,e->isPlaying(),lineHeight,chans,viewOrder,patCache,orderLock);
if (++viewRow>=e->curSubSong->patLen) {
viewRow=0;
@ -1282,7 +1288,9 @@ void FurnaceGUI::drawPattern() {
patCache[j]=e->curPat[j].getPattern(e->curOrders->ord[j][viewOrder],false);
}
}
ImGui::PopID();
}
ImGui::PopID();
if (orderLock) {
ImGui::EndDisabled();
} else {

View file

@ -30,6 +30,7 @@
#include "guiConst.h"
#include "sampleUtil.h"
#include "util.h"
#include "intConst.h"
#define SWAP_COLOR_ARGB(x) \
x=(x&0xff00ff00)|((x&0xff)<<16)|((x&0xff0000)>>16);
@ -80,6 +81,13 @@ const double timeMultipliers[13]={
} \
}
#define EXACT_2RATES(_name,_x,_y) \
if (e->isPreviewingSample()) { \
if (((int)e->getSamplePreviewRate()!=(int)(_x)) || (int)e->getSamplePreviewRate()!=(int)(_y)) { \
SAMPLE_WARN(warnRate,fmt::sprintf(_("%s: sample rate must be %d or %d"),_name,(int)(_x),(int)(_y))); \
} \
}
void FurnaceGUI::drawSampleEdit() {
if (nextWindow==GUI_WINDOW_SAMPLE_EDIT) {
sampleEditOpen=true;
@ -216,6 +224,9 @@ void FurnaceGUI::drawSampleEdit() {
memset(isMemVisible,0,DIV_MAX_CHIPS*DIV_MAX_SAMPLE_TYPE*sizeof(bool));
memset(isMemWarning,0,DIV_MAX_CHIPS*DIV_MAX_SAMPLE_TYPE*sizeof(bool));
bool displayLoopStartHints=false;
bool displayLoopEndHints=false;
for (int i=0; i<e->song.systemLen; i++) {
DivDispatch* dispatch=e->getDispatch(i);
@ -279,7 +290,7 @@ void FurnaceGUI::drawSampleEdit() {
SAMPLE_WARN(warnLoop,_("X1-010: samples can't loop"));
}
if (sample->samples>131072) {
SAMPLE_WARN(warnLength,_("X1-010: maximum sample length is 131072"));
SAMPLE_WARN(warnLength,_("X1-010: maximum bankswitched sample length is 131072"));
}
break;
case DIV_SYSTEM_GA20:
@ -301,6 +312,9 @@ void FurnaceGUI::drawSampleEdit() {
SAMPLE_WARN(warnLength,_("YM2608: sample length will be padded to multiple of 512"));
}
}
if (dispatch!=NULL) {
MAX_RATE("YM2608",dispatch->chipClock/144);
}
break;
case DIV_SYSTEM_YM2610_FULL:
case DIV_SYSTEM_YM2610_FULL_EXT:
@ -308,9 +322,12 @@ void FurnaceGUI::drawSampleEdit() {
case DIV_SYSTEM_YM2610B:
case DIV_SYSTEM_YM2610B_EXT:
if (sample->loop) {
SAMPLE_WARN(warnLoop,_("YM2610: ADPCM-A samples can't loop"));
if (sample->loopStart!=0 || sample->loopEnd!=(int)(sample->samples)) {
SAMPLE_WARN(warnLoopPos,_("YM2610: loop point ignored on ADPCM-B (may only loop entire sample)"));
if (sample->depth==DIV_SAMPLE_DEPTH_ADPCM_A) {
SAMPLE_WARN(warnLoop,_("YM2610: ADPCM-A samples can't loop"));
} else {
if (sample->loopStart!=0 || sample->loopEnd!=(int)(sample->samples)) {
SAMPLE_WARN(warnLoopPos,_("YM2610: loop point ignored on ADPCM-B (may only loop entire sample)"));
}
}
if (sample->samples&511) {
SAMPLE_WARN(warnLength,_("YM2610: sample length will be padded to multiple of 512"));
@ -320,7 +337,11 @@ void FurnaceGUI::drawSampleEdit() {
SAMPLE_WARN(warnLength,_("YM2610: maximum ADPCM-A sample length is 2097152"));
}
if (dispatch!=NULL) {
EXACT_RATE("YM2610 (ADPCM-A)",dispatch->chipClock/432);
if (sample->depth==DIV_SAMPLE_DEPTH_ADPCM_A) {
EXACT_RATE("YM2610 (ADPCM-A)",dispatch->chipClock/432);
} else {
MAX_RATE("YM2610 (ADPCM-B)",dispatch->chipClock/144);
}
}
break;
case DIV_SYSTEM_Y8950:
@ -332,6 +353,9 @@ void FurnaceGUI::drawSampleEdit() {
SAMPLE_WARN(warnLength,_("Y8950: sample length will be padded to multiple of 512"));
}
}
if (dispatch!=NULL) {
MAX_RATE("Y8950",dispatch->chipClock/72);
}
break;
case DIV_SYSTEM_AMIGA:
if (sample->loop) {
@ -355,7 +379,12 @@ void FurnaceGUI::drawSampleEdit() {
SAMPLE_WARN(warnLength,_("SegaPCM: maximum sample length is 65280"));
}
if (dispatch!=NULL) {
MAX_RATE("SegaPCM",dispatch->chipClock/256);
MAX_RATE("SegaPCM",dispatch->rate);
}
break;
case DIV_SYSTEM_K007232:
if (sample->samples>131071) {
SAMPLE_WARN(warnLength,_("K007232: maximum sample length is 131071"));
}
break;
case DIV_SYSTEM_K053260:
@ -399,6 +428,9 @@ void FurnaceGUI::drawSampleEdit() {
if (sample->samples>129024) {
SAMPLE_WARN(warnLength,_("MSM6295: maximum bankswitched sample length is 129024"));
}
if (dispatch!=NULL) {
EXACT_2RATES("MSM6295",dispatch->chipClock/165,dispatch->chipClock/132);
}
break;
case DIV_SYSTEM_GBA_DMA:
if (sample->loop) {
@ -432,6 +464,96 @@ void FurnaceGUI::drawSampleEdit() {
SAMPLE_WARN(warnLength,_("Supervision: maximum sample length is 8192"));
}
break;
case DIV_SYSTEM_YMZ280B:
if (sample->depth==DIV_SAMPLE_DEPTH_YMZ_ADPCM) {
if (sample->loop) {
if (sample->loopStart&1) {
SAMPLE_WARN(warnLoopStart,_("YMZ280B: loop start on ADPCM must be a multiple of 2"));
}
if (sample->loopEnd&1) {
SAMPLE_WARN(warnLoopEnd,_("YMZ280B: loop end on ADPCM must be a multiple of 2"));
}
}
if (dispatch!=NULL) {
MAX_RATE("YMZ280B (ADPCM)",dispatch->rate);
}
} else {
if (dispatch!=NULL) {
MAX_RATE("YMZ280B (PCM)",dispatch->chipClock/192);
}
}
break;
case DIV_SYSTEM_NDS:
switch (sample->depth) {
case DIV_SAMPLE_DEPTH_IMA_ADPCM:
if (sample->loop) {
if (sample->loopStart&7) {
SAMPLE_WARN(warnLoopStart,_("NDS: loop start on ADPCM must be a multiple of 8"));
}
if (sample->loopEnd&7) {
SAMPLE_WARN(warnLoopEnd,_("NDS: loop end on ADPCM must be a multiple of 8"));
}
if (sample->loopStart>524280) {
SAMPLE_WARN(warnLoopPos,_("NDS: loop cannot be longer than 524280 samples on ADPCM"));
}
if ((sample->loopEnd-sample->loopStart)>33554424) {
SAMPLE_WARN(warnLoopPos,_("NDS: maximum ADPCM loop length is 33554424"));
}
} else {
if (sample->samples>33554424) {
SAMPLE_WARN(warnLength,_("NDS: maximum ADPCM sample length is 33554424"));
}
}
break;
case DIV_SAMPLE_DEPTH_8BIT:
if (sample->loop) {
if (sample->loopStart&3) {
SAMPLE_WARN(warnLoopStart,_("NDS: loop start on 8 bit PCM must be a multiple of 4"));
}
if (sample->loopEnd&3) {
SAMPLE_WARN(warnLoopEnd,_("NDS: loop end on 8 bit PCM must be a multiple of 4"));
}
if (sample->loopStart>262140) {
SAMPLE_WARN(warnLoopPos,_("NDS: loop cannot be longer than 262140 samples on 8 bit PCM"));
}
if ((sample->loopEnd-sample->loopStart)>16777212) {
SAMPLE_WARN(warnLoopPos,_("NDS: maximum 8 bit PCM loop length is 16777212"));
}
} else {
if (sample->samples>16777212) {
SAMPLE_WARN(warnLength,_("NDS: maximum 8 bit PCM sample length is 16777212"));
}
}
break;
case DIV_SAMPLE_DEPTH_16BIT:
if (sample->loop) {
if (sample->loopStart&1) {
SAMPLE_WARN(warnLoopStart,_("NDS: loop start on 16 bit PCM must be a multiple of 2"));
}
if (sample->loopEnd&1) {
SAMPLE_WARN(warnLoopEnd,_("NDS: loop end on 16 bit PCM must be a multiple of 2"));
}
if (sample->loopStart>131070) {
SAMPLE_WARN(warnLoopPos,_("NDS: loop cannot be longer than 131070 samples on 16 bit PCM"));
}
if ((sample->loopEnd-sample->loopStart)>8388606) {
SAMPLE_WARN(warnLoopPos,_("NDS: maximum 16 bit PCM loop length is 8388606"));
}
} else {
if (sample->samples>8388606) {
SAMPLE_WARN(warnLength,_("NDS: maximum 16 bit PCM sample length is 8388606"));
}
}
break;
default:
break;
}
break;
case DIV_SYSTEM_ES5506:
if (sample->samples>2097024) {
SAMPLE_WARN(warnLength,_("ES5506: maximum sample length is 2097024"));
}
break;
default:
break;
}
@ -461,7 +583,7 @@ void FurnaceGUI::drawSampleEdit() {
for (int i=0; i<DIV_MAX_CHIPS; i++) {
if (isChipVisible[i]) selColumns++;
}
int targetRate=sampleCompatRate?sample->rate:sample->centerRate;
if (ImGui::BeginTable("SampleProps",(selColumns>1)?4:3,ImGuiTableFlags_SizingStretchSame|ImGuiTableFlags_BordersV|ImGuiTableFlags_BordersOuterH)) {
@ -753,9 +875,13 @@ void FurnaceGUI::drawSampleEdit() {
if (ImGui::IsItemActive()) {
keepLoopAlive=true;
sampleCheckLoopStart=false;
displayLoopStartHints=true;
} else {
sampleCheckLoopStart=true;
}
if (ImGui::IsItemHovered()) {
displayLoopStartHints=true;
}
if (ImGui::IsItemHovered() && (!warnLoopPos.empty() || (!warnLoopStart.empty() && sampleCheckLoopStart) || sample->depth==DIV_SAMPLE_DEPTH_BRR)) {
if (ImGui::BeginTooltip()) {
if (sample->depth==DIV_SAMPLE_DEPTH_BRR) {
@ -792,9 +918,13 @@ void FurnaceGUI::drawSampleEdit() {
if (ImGui::IsItemActive()) {
keepLoopAlive=true;
sampleCheckLoopEnd=false;
displayLoopEndHints=true;
} else {
sampleCheckLoopEnd=true;
}
if (ImGui::IsItemHovered()) {
displayLoopEndHints=true;
}
if (ImGui::IsItemHovered() && (!warnLoopPos.empty() || (!warnLoopEnd.empty() && sampleCheckLoopEnd) || sample->depth==DIV_SAMPLE_DEPTH_BRR)) {
if (ImGui::BeginTooltip()) {
if (sample->depth==DIV_SAMPLE_DEPTH_BRR) {
@ -979,14 +1109,27 @@ void FurnaceGUI::drawSampleEdit() {
ImGui::OpenPopup("SResampleOpt");
}
if (ImGui::BeginPopupContextItem("SResampleOpt",ImGuiPopupFlags_MouseButtonLeft)) {
ImGui::Text(_("Rate"));
if (ImGui::InputDouble("##SRRate",&resampleTarget,1.0,50.0,"%g")) {
if (resampleTarget<0) resampleTarget=0;
if (resampleTarget>96000) resampleTarget=96000;
if (ImGui::InputDouble("Rate##SRRate",&resampleTarget,1.0,50.0,"%g")) {
if (resampleTarget<100) resampleTarget=100;
if (resampleTarget>384000) resampleTarget=384000;
}
double factor=resampleTarget/(double)targetRate;
unsigned int targetLength=sample->samples*factor;
if (ImGui::InputScalar("Length##SRLen",ImGuiDataType_U32,&targetLength, &_ONE, &_SIXTEEN)) {
if (targetLength<1) targetLength=1;
resampleTarget=targetRate*targetLength/(double)sample->samples;
if (resampleTarget<100) resampleTarget=100;
if (resampleTarget>384000) resampleTarget=384000;
}
if (ImGui::InputDouble(_("Factor"),&factor,0.125,0.5,"%g")) {
resampleTarget=(double)targetRate*factor;
if (resampleTarget<100) resampleTarget=100;
if (resampleTarget>384000) resampleTarget=384000;
}
ImGui::SameLine();
if (ImGui::Button("0.5x")) {
resampleTarget*=0.5;
if (resampleTarget<100) resampleTarget=100;
if (resampleTarget>384000) resampleTarget=384000;
}
ImGui::SameLine();
if (ImGui::Button("==")) {
@ -995,19 +1138,15 @@ void FurnaceGUI::drawSampleEdit() {
ImGui::SameLine();
if (ImGui::Button("2.0x")) {
resampleTarget*=2.0;
}
double factor=resampleTarget/(double)targetRate;
if (ImGui::InputDouble(_("Factor"),&factor,0.125,0.5,"%g")) {
resampleTarget=(double)targetRate*factor;
if (resampleTarget<0) resampleTarget=0;
if (resampleTarget>96000) resampleTarget=96000;
if (resampleTarget<100) resampleTarget=100;
if (resampleTarget>384000) resampleTarget=384000;
}
ImGui::Combo(_("Filter"),&resampleStrat,LocalizedComboGetter,resampleStrats,6);
if (ImGui::Button(_("Resample"))) {
sample->prepareUndo(true);
e->lockEngine([this,sample,targetRate]() {
if (!sample->resample(targetRate,resampleTarget,resampleStrat)) {
showError(_("couldn't resample! make sure your sample is 8 or 16-bit."));
showError(_("couldn't resample! make sure your sample is 8 or 16-bit and that the target rate is at least 100Hz."));
}
e->renderSamples(curSample);
});
@ -1620,21 +1759,24 @@ void FurnaceGUI::drawSampleEdit() {
}
int ij=0;
for (int i=0; i<availY; i++) {
if (availY>0) {
for (int j=0; j<availX; j++) {
int scaledPos=samplePos+(j*sampleZoom);
if (sample->isLoopable() && (scaledPos>=sample->loopStart && scaledPos<=sample->loopEnd)) {
if (sample->isLoopable() && (scaledPos>=sample->loopStart && scaledPos<sample->loopEnd)) {
data[ij++]=bgColorLoop;
} else {
data[ij++]=bgColor;
}
}
}
if (availY>0) {
for (int i=1; i<availY; i++) {
memcpy(&data[ij],data,availX*sizeof(unsigned int));
ij+=availX;
}
for (int i=availX*(availY>>1); i<availX*(1+(availY>>1)); i++) {
data[i]=centerLineColor;
}
}
unsigned int xCoarse=samplePos;
unsigned int xFine=0;
unsigned int xAdvanceCoarse=sampleZoom;
@ -2028,6 +2170,173 @@ void FurnaceGUI::drawSampleEdit() {
}
dl->PopClipRect();
bool displayLoopHintsNES=false;
bool displayLoopHintsSNES=false;
bool displayLoopHintsNDSA=false;
bool displayLoopHintsNDS8=false;
bool displayLoopHintsAmiga=false;
bool displayLoopHintsGBADMA=false;
for (int i=0; i<e->song.systemLen; i++) {
if (e->song.system[i]==DIV_SYSTEM_NES) {
displayLoopHintsNES=true;
}
if (e->song.system[i]==DIV_SYSTEM_SNES) {
displayLoopHintsSNES=true;
}
if (((e->song.system[i]==DIV_SYSTEM_NDS) && (sample->depth==DIV_SAMPLE_DEPTH_IMA_ADPCM))) {
displayLoopHintsNDSA=true;
}
if (((e->song.system[i]==DIV_SYSTEM_NDS) && (sample->depth==DIV_SAMPLE_DEPTH_8BIT))) {
displayLoopHintsNDS8=true;
}
if (e->song.system[i]==DIV_SYSTEM_AMIGA ||
e->song.system[i]==DIV_SYSTEM_C219 ||
((e->song.system[i]==DIV_SYSTEM_YMZ280B) && (sample->depth==DIV_SAMPLE_DEPTH_YMZ_ADPCM)) ||
((e->song.system[i]==DIV_SYSTEM_NDS) && (sample->depth==DIV_SAMPLE_DEPTH_16BIT))) {
displayLoopHintsAmiga=true;
}
if (e->song.system[i]==DIV_SYSTEM_GBA_DMA) {
displayLoopHintsGBADMA=true;
}
}
if (displayLoopStartHints) {
if (displayLoopHintsNES) {
if (sampleZoom<3.0) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&511)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsSNES) {
if (sampleZoom<0.75) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&15)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsNDSA) {
if (sampleZoom<0.5) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&7)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsNDS8) {
if (sampleZoom<0.375) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&3)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsAmiga) {
if (sampleZoom<0.25) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&1)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsGBADMA) {
if (sampleZoom<0.6) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&3)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
}
if (displayLoopEndHints) {
if (displayLoopHintsNES) {
if (sampleZoom<3.0) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos-8)&128)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsSNES) {
if (sampleZoom<0.75) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&15)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsAmiga) {
if (sampleZoom<0.25) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos)&1)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
if (displayLoopHintsGBADMA) {
if (sampleZoom<0.6) {
for (int i=0; i<(int)(sampleZoom*avail.x); i++) {
if (((i+samplePos-sample->loopStart)&15)==0) {
ImVec2 p1=ImVec2(rectMin.x+((float)i/sampleZoom),rectMin.y);
ImVec2 p2=p1;
p2.y=rectMax.y;
dl->AddLine(p1,p2,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_LOOP_HINT]));
}
}
}
}
}
if (drawSelection) {
int start=sampleSelStart;
int end=sampleSelEnd;

View file

@ -82,7 +82,7 @@ const char* locales[][3]={
{"한국어 (25%)", "ko", "이 설정을 적용하려면 Furnace를 다시 시작해야 합니다."},
//{"Nederlands (4%)", "nl", "start Furnace opnieuw op om deze instelling effectief te maken."},
{"Polski (95%)", "pl", "aby to ustawienie było skuteczne, należy ponownie uruchomić program."},
{"Português (Brasil) (90%)", "pt_BR", "reinicie o Furnace para que essa configuração entre em vigor."},
{"Português (Brasil) (70%)", "pt_BR", "reinicie o Furnace para que essa configuração entre em vigor."},
{"Русский", "ru", "перезапустите программу, чтобы эта настройка вступила в силу."},
{"Slovenčina (15%)", "sk", "???"},
{"Svenska", "sv", "starta om programmet för att denna inställning ska träda i kraft."},
@ -3953,8 +3953,10 @@ void FurnaceGUI::drawSettings() {
UI_COLOR_CONFIG(GUI_COLOR_TAB,_("Tab"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_HOVER,_("Tab (hovered)"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_ACTIVE,_("Tab (active)"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_UNFOCUSED,_("Tab (unfocused)"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_UNFOCUSED_ACTIVE,_("Tab (unfocused and active)"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_SELECTED_OVERLINE,_("Tab (active overline)"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_UNFOCUSED,_("Tab (dimmed)"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_UNFOCUSED_ACTIVE,_("Tab (dimmed and active)"));
UI_COLOR_CONFIG(GUI_COLOR_TAB_DIMMED_SELECTED_OVERLINE,_("Tab (dimmed and active overline)"));
UI_COLOR_CONFIG(GUI_COLOR_IMGUI_HEADER,_("ImGui header"));
UI_COLOR_CONFIG(GUI_COLOR_IMGUI_HEADER_HOVER,_("ImGui header (hovered)"));
UI_COLOR_CONFIG(GUI_COLOR_IMGUI_HEADER_ACTIVE,_("ImGui header (active)"));
@ -3968,7 +3970,9 @@ void FurnaceGUI::drawSettings() {
UI_COLOR_CONFIG(GUI_COLOR_SLIDER_GRAB_ACTIVE,_("Slider grab (active)"));
UI_COLOR_CONFIG(GUI_COLOR_TITLE_BACKGROUND_ACTIVE,_("Title background (active)"));
UI_COLOR_CONFIG(GUI_COLOR_CHECK_MARK,_("Checkbox/radio button mark"));
UI_COLOR_CONFIG(GUI_COLOR_TEXT_LINK,_("Text link"));
UI_COLOR_CONFIG(GUI_COLOR_TEXT_SELECTION,_("Text selection"));
UI_COLOR_CONFIG(GUI_COLOR_TREE_LINES,_("Tree lines"));
UI_COLOR_CONFIG(GUI_COLOR_PLOT_LINES,_("Line plot"));
UI_COLOR_CONFIG(GUI_COLOR_PLOT_LINES_HOVER,_("Line plot (hovered)"));
UI_COLOR_CONFIG(GUI_COLOR_PLOT_HISTOGRAM,_("Histogram plot"));
@ -4008,6 +4012,7 @@ void FurnaceGUI::drawSettings() {
UI_COLOR_CONFIG(GUI_COLOR_DRAG_DROP_TARGET,_("Drag and drop target"));
UI_COLOR_CONFIG(GUI_COLOR_NAV_WIN_HIGHLIGHT,_("Window switcher (highlight)"));
UI_COLOR_CONFIG(GUI_COLOR_NAV_WIN_BACKDROP,_("Window switcher backdrop"));
UI_COLOR_CONFIG(GUI_COLOR_INPUT_TEXT_CURSOR,_("Text input cursor"));
ImGui::TreePop();
}
if (ImGui::TreeNode(_("Miscellaneous"))) {
@ -4282,6 +4287,7 @@ void FurnaceGUI::drawSettings() {
UI_COLOR_CONFIG(GUI_COLOR_SAMPLE_NEEDLE,_("Preview needle"));
UI_COLOR_CONFIG(GUI_COLOR_SAMPLE_NEEDLE_PLAYING,_("Playing needles"));
UI_COLOR_CONFIG(GUI_COLOR_SAMPLE_LOOP_POINT,_("Loop markers"));
UI_COLOR_CONFIG(GUI_COLOR_SAMPLE_LOOP_HINT,_("Valid loop position hints"));
UI_COLOR_CONFIG(GUI_COLOR_SAMPLE_CHIP_DISABLED,_("Chip select: disabled"));
UI_COLOR_CONFIG(GUI_COLOR_SAMPLE_CHIP_ENABLED,_("Chip select: enabled"));
UI_COLOR_CONFIG(GUI_COLOR_SAMPLE_CHIP_WARNING,_("Chip select: enabled (failure)"));
@ -6367,15 +6373,20 @@ void FurnaceGUI::applyUISettings(bool updateFonts) {
sty.Colors[ImGuiCol_Text]=uiColors[GUI_COLOR_TEXT];
sty.Colors[ImGuiCol_TextDisabled]=uiColors[GUI_COLOR_TEXT_DISABLED];
// new stuff
sty.Colors[ImGuiCol_InputTextCursor]=uiColors[GUI_COLOR_INPUT_TEXT_CURSOR];
if (settings.basicColors) {
sty.Colors[ImGuiCol_Button]=primary;
sty.Colors[ImGuiCol_ButtonHovered]=primaryHover;
sty.Colors[ImGuiCol_ButtonActive]=primaryActive;
sty.Colors[ImGuiCol_Tab]=primary;
sty.Colors[ImGuiCol_TabHovered]=secondaryHover;
sty.Colors[ImGuiCol_TabActive]=secondarySemiActive;
sty.Colors[ImGuiCol_TabUnfocused]=primary;
sty.Colors[ImGuiCol_TabUnfocusedActive]=primaryHover;
sty.Colors[ImGuiCol_TabSelected]=secondarySemiActive;
sty.Colors[ImGuiCol_TabSelectedOverline]=secondaryActive;
sty.Colors[ImGuiCol_TabDimmed]=primary;
sty.Colors[ImGuiCol_TabDimmedSelected]=primaryHover;
sty.Colors[ImGuiCol_TabDimmedSelectedOverline]=primaryActive;
sty.Colors[ImGuiCol_Header]=secondary;
sty.Colors[ImGuiCol_HeaderHovered]=secondaryHover;
sty.Colors[ImGuiCol_HeaderActive]=secondaryActive;
@ -6389,7 +6400,9 @@ void FurnaceGUI::applyUISettings(bool updateFonts) {
sty.Colors[ImGuiCol_SliderGrabActive]=primaryActive;
sty.Colors[ImGuiCol_TitleBgActive]=primary;
sty.Colors[ImGuiCol_CheckMark]=primaryActive;
sty.Colors[ImGuiCol_TextLink]=secondaryActive;
sty.Colors[ImGuiCol_TextSelectedBg]=secondaryHoverActual;
sty.Colors[ImGuiCol_TreeLines]=uiColors[GUI_COLOR_BORDER];
sty.Colors[ImGuiCol_PlotHistogram]=uiColors[GUI_COLOR_MACRO_OTHER];
sty.Colors[ImGuiCol_PlotHistogramHovered]=uiColors[GUI_COLOR_MACRO_OTHER];
} else {
@ -6398,9 +6411,11 @@ void FurnaceGUI::applyUISettings(bool updateFonts) {
sty.Colors[ImGuiCol_ButtonActive]=uiColors[GUI_COLOR_BUTTON_ACTIVE];
sty.Colors[ImGuiCol_Tab]=uiColors[GUI_COLOR_TAB];
sty.Colors[ImGuiCol_TabHovered]=uiColors[GUI_COLOR_TAB_HOVER];
sty.Colors[ImGuiCol_TabActive]=uiColors[GUI_COLOR_TAB_ACTIVE];
sty.Colors[ImGuiCol_TabUnfocused]=uiColors[GUI_COLOR_TAB_UNFOCUSED];
sty.Colors[ImGuiCol_TabUnfocusedActive]=uiColors[GUI_COLOR_TAB_UNFOCUSED_ACTIVE];
sty.Colors[ImGuiCol_TabSelected]=uiColors[GUI_COLOR_TAB_ACTIVE];
sty.Colors[ImGuiCol_TabSelectedOverline]=uiColors[GUI_COLOR_TAB_SELECTED_OVERLINE];
sty.Colors[ImGuiCol_TabDimmed]=uiColors[GUI_COLOR_TAB_UNFOCUSED];
sty.Colors[ImGuiCol_TabDimmedSelected]=uiColors[GUI_COLOR_TAB_UNFOCUSED_ACTIVE];
sty.Colors[ImGuiCol_TabDimmedSelectedOverline]=uiColors[GUI_COLOR_TAB_DIMMED_SELECTED_OVERLINE];
sty.Colors[ImGuiCol_Header]=uiColors[GUI_COLOR_IMGUI_HEADER];
sty.Colors[ImGuiCol_HeaderHovered]=uiColors[GUI_COLOR_IMGUI_HEADER_HOVER];
sty.Colors[ImGuiCol_HeaderActive]=uiColors[GUI_COLOR_IMGUI_HEADER_ACTIVE];
@ -6414,7 +6429,9 @@ void FurnaceGUI::applyUISettings(bool updateFonts) {
sty.Colors[ImGuiCol_SliderGrabActive]=uiColors[GUI_COLOR_SLIDER_GRAB_ACTIVE];
sty.Colors[ImGuiCol_TitleBgActive]=uiColors[GUI_COLOR_TITLE_BACKGROUND_ACTIVE];
sty.Colors[ImGuiCol_CheckMark]=uiColors[GUI_COLOR_CHECK_MARK];
sty.Colors[ImGuiCol_TextLink]=uiColors[GUI_COLOR_TEXT_LINK];
sty.Colors[ImGuiCol_TextSelectedBg]=uiColors[GUI_COLOR_TEXT_SELECTION];
sty.Colors[ImGuiCol_TreeLines]=uiColors[GUI_COLOR_TREE_LINES];
sty.Colors[ImGuiCol_PlotLines]=uiColors[GUI_COLOR_PLOT_LINES];
sty.Colors[ImGuiCol_PlotLinesHovered]=uiColors[GUI_COLOR_PLOT_LINES_HOVER];
sty.Colors[ImGuiCol_PlotHistogram]=uiColors[GUI_COLOR_PLOT_HISTOGRAM];
@ -6516,7 +6533,7 @@ void FurnaceGUI::applyUISettings(bool updateFonts) {
// prepare
#ifdef HAVE_FREETYPE
if (settings.fontBackend==1) {
ImGui::GetIO().Fonts->FontLoader=ImGuiFreeType::GetFontLoader();
ImGui::GetIO().Fonts->SetFontLoader(ImGuiFreeType::GetFontLoader());
ImGui::GetIO().Fonts->FontLoaderFlags&=~(
ImGuiFreeTypeLoaderFlags_NoHinting|
ImGuiFreeTypeLoaderFlags_NoAutoHint|
@ -6558,7 +6575,7 @@ void FurnaceGUI::applyUISettings(bool updateFonts) {
break;
}
} else {
ImGui::GetIO().Fonts->FontLoader=ImFontAtlasGetFontLoaderForStbTruetype();
ImGui::GetIO().Fonts->SetFontLoader(ImFontAtlasGetFontLoaderForStbTruetype());
}
#endif