Skip to content

Commit dcf888c

Browse files
committed
Add an upscaled filter option
1 parent 0ad0fb8 commit dcf888c

15 files changed

+207
-172
lines changed

src/android/cpp/interface.cpp

+28-29
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include "../../common/nds_icon.h"
2929
#include "../../common/screen_layout.h"
3030

31-
int screenFilter = 1;
3231
int micEnable = 0;
3332
int showFpsCounter = 0;
3433
int buttonScale = 5;
@@ -90,24 +89,23 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_hydra_noods_FileBrowser_loadSetti
9089
// Define the platform settings
9190
std::vector<Setting> platformSettings =
9291
{
93-
Setting("screenFilter", &screenFilter, false),
94-
Setting("micEnable", &micEnable, false),
95-
Setting("showFpsCounter", &showFpsCounter, false),
96-
Setting("buttonScale", &buttonScale, false),
97-
Setting("buttonSpacing", &buttonSpacing, false),
92+
Setting("micEnable", &micEnable, false),
93+
Setting("showFpsCounter", &showFpsCounter, false),
94+
Setting("buttonScale", &buttonScale, false),
95+
Setting("buttonSpacing", &buttonSpacing, false),
9896
Setting("vibrateStrength", &vibrateStrength, false),
99-
Setting("keyA", &keyBinds[0], false),
100-
Setting("keyB", &keyBinds[1], false),
101-
Setting("keySelect", &keyBinds[2], false),
102-
Setting("keyStart", &keyBinds[3], false),
103-
Setting("keyRight", &keyBinds[4], false),
104-
Setting("keyLeft", &keyBinds[5], false),
105-
Setting("keyUp", &keyBinds[6], false),
106-
Setting("keyDown", &keyBinds[7], false),
107-
Setting("keyR", &keyBinds[8], false),
108-
Setting("keyL", &keyBinds[9], false),
109-
Setting("keyX", &keyBinds[10], false),
110-
Setting("keyY", &keyBinds[11], false)
97+
Setting("keyA", &keyBinds[0], false),
98+
Setting("keyB", &keyBinds[1], false),
99+
Setting("keySelect", &keyBinds[2], false),
100+
Setting("keyStart", &keyBinds[3], false),
101+
Setting("keyRight", &keyBinds[4], false),
102+
Setting("keyLeft", &keyBinds[5], false),
103+
Setting("keyUp", &keyBinds[6], false),
104+
Setting("keyDown", &keyBinds[7], false),
105+
Setting("keyR", &keyBinds[8], false),
106+
Setting("keyL", &keyBinds[9], false),
107+
Setting("keyX", &keyBinds[10], false),
108+
Setting("keyY", &keyBinds[11], false)
111109
};
112110

113111
// Add the platform settings
@@ -305,7 +303,8 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_hydra_noods_NooRenderer_copyFrame
305303
// Copy the frame to the bitmap
306304
uint32_t *data;
307305
AndroidBitmap_lockPixels(env, bitmap, (void**)&data);
308-
size_t count = (gbaCrop ? (240 * 160) : (256 * 192 * 2)) << (Settings::highRes3D * 2);
306+
int shift = (Settings::highRes3D || Settings::screenFilter == 1) * 2;
307+
size_t count = (gbaCrop ? (240 * 160) : (256 * 192 * 2)) << shift;
309308
memcpy(data, framebuffer, count * sizeof(uint32_t));
310309
AndroidBitmap_unlockPixels(env, bitmap);
311310
return true;
@@ -348,6 +347,11 @@ extern "C" JNIEXPORT jint JNICALL Java_com_hydra_noods_SettingsMenu_getHighRes3D
348347
return Settings::highRes3D;
349348
}
350349

350+
extern "C" JNIEXPORT jint JNICALL Java_com_hydra_noods_SettingsMenu_getScreenFilter(JNIEnv* env, jobject obj)
351+
{
352+
return Settings::screenFilter;
353+
}
354+
351355
extern "C" JNIEXPORT jint JNICALL Java_com_hydra_noods_SettingsMenu_getScreenPosition(JNIEnv* env, jobject obj)
352356
{
353357
return ScreenLayout::screenPosition;
@@ -383,11 +387,6 @@ extern "C" JNIEXPORT jint JNICALL Java_com_hydra_noods_SettingsMenu_getGbaCrop(J
383387
return ScreenLayout::gbaCrop;
384388
}
385389

386-
extern "C" JNIEXPORT jint JNICALL Java_com_hydra_noods_SettingsMenu_getScreenFilter(JNIEnv* env, jobject obj)
387-
{
388-
return screenFilter;
389-
}
390-
391390
extern "C" JNIEXPORT jint JNICALL Java_com_hydra_noods_SettingsMenu_getMicEnable(JNIEnv* env, jobject obj)
392391
{
393392
return micEnable;
@@ -438,6 +437,11 @@ extern "C" JNIEXPORT void JNICALL Java_com_hydra_noods_SettingsMenu_setHighRes3D
438437
Settings::highRes3D = value;
439438
}
440439

440+
extern "C" JNIEXPORT void JNICALL Java_com_hydra_noods_SettingsMenu_setScreenFilter(JNIEnv* env, jobject obj, jint value)
441+
{
442+
Settings::screenFilter = value;
443+
}
444+
441445
extern "C" JNIEXPORT void JNICALL Java_com_hydra_noods_SettingsMenu_setScreenPosition(JNIEnv* env, jobject obj, jint value)
442446
{
443447
ScreenLayout::screenPosition = value;
@@ -473,11 +477,6 @@ extern "C" JNIEXPORT void JNICALL Java_com_hydra_noods_SettingsMenu_setGbaCrop(J
473477
ScreenLayout::gbaCrop = value;
474478
}
475479

476-
extern "C" JNIEXPORT void JNICALL Java_com_hydra_noods_SettingsMenu_setScreenFilter(JNIEnv* env, jobject obj, jint value)
477-
{
478-
screenFilter = value;
479-
}
480-
481480
extern "C" JNIEXPORT void JNICALL Java_com_hydra_noods_SettingsMenu_setMicEnable(JNIEnv* env, jobject obj, jint value)
482481
{
483482
micEnable = value;

src/android/java/com/hydra/noods/NooRenderer.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class NooRenderer implements GLSurfaceView.Renderer
4040
private int program;
4141
private int textures[];
4242
private Bitmap bitmap;
43-
private int highRes3D;
43+
private int shift;
4444
private boolean gbaMode;
4545

4646
private final String vertexShader =
@@ -99,12 +99,12 @@ public void onSurfaceCreated(GL10 unused, EGLConfig config)
9999
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
100100
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
101101
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
102-
int filter = (SettingsMenu.getScreenFilter() == 1) ? GLES20.GL_LINEAR : GLES20.GL_NEAREST;
102+
int filter = (SettingsMenu.getScreenFilter() == 0) ? GLES20.GL_NEAREST : GLES20.GL_LINEAR;
103103
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter);
104104
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, filter);
105105

106106
bitmap = Bitmap.createBitmap(256, 192 * 2, Bitmap.Config.ARGB_8888);
107-
highRes3D = 0;
107+
shift = 0;
108108
gbaMode = false;
109109
}
110110

@@ -146,21 +146,21 @@ public void run()
146146
@Override
147147
public void onDrawFrame(GL10 unused)
148148
{
149-
// Update the resolution if the high-res 3D setting changed
150-
if (highRes3D != SettingsMenu.getHighRes3D())
149+
// Update the resolution if it changed
150+
if (shift != ((SettingsMenu.getHighRes3D() != 0 || SettingsMenu.getScreenFilter() == 1) ? 1 : 0))
151151
{
152-
highRes3D = SettingsMenu.getHighRes3D();
153-
bitmap = Bitmap.createBitmap((gbaMode ? 240 : 256) << highRes3D,
154-
(gbaMode ? 160 : (192 * 2)) << highRes3D, Bitmap.Config.ARGB_8888);
152+
shift ^= 0x1;
153+
bitmap = Bitmap.createBitmap((gbaMode ? 240 : 256) << shift,
154+
(gbaMode ? 160 : (192 * 2)) << shift, Bitmap.Config.ARGB_8888);
155155
}
156156

157157
// Update the layout if GBA mode changed
158158
if (gbaMode != (activity.isGbaMode() && SettingsMenu.getGbaCrop() != 0))
159159
{
160160
gbaMode = !gbaMode;
161161
updateLayout(width, height);
162-
bitmap = Bitmap.createBitmap((gbaMode ? 240 : 256) << highRes3D,
163-
(gbaMode ? 160 : (192 * 2)) << highRes3D, Bitmap.Config.ARGB_8888);
162+
bitmap = Bitmap.createBitmap((gbaMode ? 240 : 256) << shift,
163+
(gbaMode ? 160 : (192 * 2)) << shift, Bitmap.Config.ARGB_8888);
164164
}
165165

166166
// Clear the display

src/android/java/com/hydra/noods/SettingsMenu.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,14 @@ protected void onCreate(Bundle savedInstanceState)
8484
editor.putBoolean("threaded_2d", (getThreaded2D() == 0) ? false : true);
8585
editor.putString("threaded_3d", Integer.toString(getThreaded3D()));
8686
editor.putBoolean("high_res_3d", (getHighRes3D() == 0) ? false : true);
87+
editor.putString("screen_filter", Integer.toString(getScreenFilter()));
8788
editor.putString("screen_position", Integer.toString(getScreenPosition()));
8889
editor.putString("screen_rotation", Integer.toString(getScreenRotation()));
8990
editor.putString("screen_arrangement", Integer.toString(getScreenArrangement()));
9091
editor.putString("screen_sizing", Integer.toString(getScreenSizing()));
9192
editor.putString("screen_gap", Integer.toString(getScreenGap()));
9293
editor.putBoolean("integer_scale", (getIntegerScale() == 0) ? false : true);
9394
editor.putBoolean("gba_crop", (getGbaCrop() == 0) ? false : true);
94-
editor.putBoolean("screen_filter", (getScreenFilter() == 0) ? false : true);
9595
editor.putBoolean("mic_enable", (getMicEnable() == 0) ? false : true);
9696
editor.putBoolean("show_fps_counter", (getShowFpsCounter() == 0) ? false : true);
9797
editor.putInt("button_scale", getButtonScale());
@@ -115,14 +115,14 @@ public void onBackPressed()
115115
setThreaded2D(prefs.getBoolean("threaded_2d", true) ? 1 : 0);
116116
setThreaded3D(Integer.parseInt(prefs.getString("threaded_3d", "1")));
117117
setHighRes3D(prefs.getBoolean("high_res_3d", true) ? 1 : 0);
118+
setScreenFilter(Integer.parseInt(prefs.getString("screen_filter", "1")));
118119
setScreenPosition(Integer.parseInt(prefs.getString("screen_position", "0")));
119120
setScreenRotation(Integer.parseInt(prefs.getString("screen_rotation", "0")));
120121
setScreenArrangement(Integer.parseInt(prefs.getString("screen_arrangement", "0")));
121122
setScreenSizing(Integer.parseInt(prefs.getString("screen_sizing", "0")));
122123
setScreenGap(Integer.parseInt(prefs.getString("screen_gap", "0")));
123124
setIntegerScale(prefs.getBoolean("integer_scale", false) ? 1 : 0);
124125
setGbaCrop(prefs.getBoolean("gba_crop", true) ? 1 : 0);
125-
setScreenFilter(prefs.getBoolean("screen_filter", true) ? 1 : 0);
126126
setMicEnable(prefs.getBoolean("mic_enable", false) ? 1 : 0);
127127
setShowFpsCounter(prefs.getBoolean("show_fps_counter", false) ? 1 : 0);
128128
setButtonScale(prefs.getInt("button_scale", 5));
@@ -139,14 +139,14 @@ public void onBackPressed()
139139
public static native int getThreaded2D();
140140
public static native int getThreaded3D();
141141
public static native int getHighRes3D();
142+
public static native int getScreenFilter();
142143
public static native int getScreenPosition();
143144
public static native int getScreenRotation();
144145
public static native int getScreenArrangement();
145146
public static native int getScreenSizing();
146147
public static native int getScreenGap();
147148
public static native int getIntegerScale();
148149
public static native int getGbaCrop();
149-
public static native int getScreenFilter();
150150
public static native int getMicEnable();
151151
public static native int getShowFpsCounter();
152152
public static native int getButtonScale();
@@ -157,14 +157,14 @@ public void onBackPressed()
157157
public static native void setThreaded2D(int value);
158158
public static native void setThreaded3D(int value);
159159
public static native void setHighRes3D(int value);
160+
public static native void setScreenFilter(int value);
160161
public static native void setScreenPosition(int value);
161162
public static native void setScreenRotation(int value);
162163
public static native void setScreenArrangement(int value);
163164
public static native void setScreenSizing(int value);
164165
public static native void setScreenGap(int value);
165166
public static native void setIntegerScale(int value);
166167
public static native void setGbaCrop(int value);
167-
public static native void setScreenFilter(int value);
168168
public static native void setMicEnable(int value);
169169
public static native void setShowFpsCounter(int value);
170170
public static native void setButtonScale(int value);

src/android/res/values/arrays.xml

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
<item>3 Threads</item>
1515
</string-array>
1616

17+
<string-array name="screen_filter_entries">
18+
<item>Nearest</item>
19+
<item>Upscaled</item>
20+
<item>Linear</item>
21+
</string-array>
22+
1723
<string-array name="screen_position_entries">
1824
<item>Center</item>
1925
<item>Top</item>

src/android/res/xml/settings.xml

+10-6
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@
6565
app:title="Screen Layout"
6666
app:iconSpaceReserved="false">
6767

68+
<ListPreference
69+
app:key="screen_filter"
70+
app:title="Screen Filter"
71+
app:entries="@array/screen_filter_entries"
72+
app:entryValues="@array/setting_values"
73+
app:useSimpleSummaryProvider="true"
74+
app:iconSpaceReserved="false"
75+
app:allowDividerAbove="true"
76+
app:allowDividerBelow="true" />
77+
6878
<ListPreference
6979
app:key="screen_position"
7080
app:title="Screen Position"
@@ -128,12 +138,6 @@
128138
app:iconSpaceReserved="false"
129139
app:allowDividerAbove="true"
130140
app:allowDividerBelow="true" />
131-
132-
<SwitchPreferenceCompat
133-
app:key="screen_filter"
134-
app:title="Screen Filter"
135-
app:iconSpaceReserved="false"
136-
app:allowDividerAbove="true" />
137141
</PreferenceCategory>
138142

139143
<PreferenceCategory

src/console/console_ui.cpp

+14-15
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ void *ConsoleUI::fileTextures[2];
3939
void *ConsoleUI::folderTextures[2];
4040
void *ConsoleUI::fontTexture;
4141

42-
int ConsoleUI::screenFilter = 1;
4342
int ConsoleUI::showFpsCounter = 0;
4443
int ConsoleUI::menuTheme = 0;
4544

@@ -183,7 +182,6 @@ void ConsoleUI::initialize(int width, int height, std::string root, std::string
183182
// Define the platform settings
184183
std::vector<Setting> platformSettings =
185184
{
186-
Setting("screenFilter", &screenFilter, false),
187185
Setting("showFpsCounter", &showFpsCounter, false),
188186
Setting("menuTheme", &menuTheme, false)
189187
};
@@ -235,7 +233,7 @@ void ConsoleUI::mainLoop(MenuTouch (*specialTouch)(), ScreenLayout *touchLayout)
235233

236234
// Update the framebuffer and start rendering
237235
void *gbaTexture = nullptr, *topTexture = nullptr, *botTexture = nullptr;
238-
int shift = Settings::highRes3D;
236+
bool shift = (Settings::highRes3D || Settings::screenFilter == 1);
239237
core->gpu.getFrame(framebuffer, gbaMode);
240238
startFrame(0);
241239

@@ -244,7 +242,7 @@ void ConsoleUI::mainLoop(MenuTouch (*specialTouch)(), ScreenLayout *touchLayout)
244242
// Draw the GBA screen
245243
gbaTexture = createTexture(&framebuffer[0], 240 << shift, 160 << shift);
246244
drawTexture(gbaTexture, 0, 0, 240 << shift, 160 << shift, layout.topX, layout.topY,
247-
layout.topWidth, layout.topHeight, screenFilter, ScreenLayout::screenRotation);
245+
layout.topWidth, layout.topHeight, Settings::screenFilter, ScreenLayout::screenRotation);
248246
}
249247
else // DS mode
250248
{
@@ -253,15 +251,15 @@ void ConsoleUI::mainLoop(MenuTouch (*specialTouch)(), ScreenLayout *touchLayout)
253251
{
254252
topTexture = createTexture(&framebuffer[0], 256 << shift, 192 << shift);
255253
drawTexture(topTexture, 0, 0, 256 << shift, 192 << shift, layout.topX, layout.topY,
256-
layout.topWidth, layout.topHeight, screenFilter, ScreenLayout::screenRotation);
254+
layout.topWidth, layout.topHeight, Settings::screenFilter, ScreenLayout::screenRotation);
257255
}
258256

259257
// Draw the DS bottom screen
260258
if (ScreenLayout::screenArrangement != 3 || ScreenLayout::screenSizing == 2)
261259
{
262260
botTexture = createTexture(&framebuffer[(256 * 192) << (shift * 2)], 256 << shift, 192 << shift);
263261
drawTexture(botTexture, 0, 0, 256 << shift, 192 << shift, layout.botX, layout.botY,
264-
layout.botWidth, layout.botHeight, screenFilter, ScreenLayout::screenRotation);
262+
layout.botWidth, layout.botHeight, Settings::screenFilter, ScreenLayout::screenRotation);
265263
}
266264
}
267265

@@ -759,6 +757,7 @@ void ConsoleUI::settingsMenu()
759757
{
760758
// Define possible values for settings
761759
const std::vector<std::string> toggle = { "Off", "On" };
760+
const std::vector<std::string> filter = { "Nearest", "Upscaled", "Linear" };
762761
const std::vector<std::string> position = { "Center", "Top", "Bottom", "Left", "Right" };
763762
const std::vector<std::string> rotation = { "None", "Clockwise", "Counter-Clockwise" };
764763
const std::vector<std::string> arrangement = { "Automatic", "Vertical", "Horizontal", "Single Screen" };
@@ -777,14 +776,14 @@ void ConsoleUI::settingsMenu()
777776
MenuItem("Threaded 2D", toggle[Settings::threaded2D]),
778777
MenuItem("Threaded 3D", toggle[(bool)Settings::threaded3D]),
779778
MenuItem("High-Resolution 3D", toggle[Settings::highRes3D]),
779+
MenuItem("Screen Filter", filter[Settings::screenFilter]),
780780
MenuItem("Screen Position", position[ScreenLayout::screenPosition]),
781781
MenuItem("Screen Rotation", rotation[ScreenLayout::screenRotation]),
782782
MenuItem("Screen Arrangement", arrangement[ScreenLayout::screenArrangement]),
783783
MenuItem("Screen Sizing", sizing[ScreenLayout::screenSizing]),
784784
MenuItem("Screen Gap", gap[ScreenLayout::screenGap]),
785785
MenuItem("Integer Scale", toggle[ScreenLayout::integerScale]),
786786
MenuItem("GBA Crop", toggle[ScreenLayout::gbaCrop]),
787-
MenuItem("Screen Filter", toggle[screenFilter]),
788787
MenuItem("Show FPS Counter", toggle[showFpsCounter]),
789788
MenuItem("Menu Theme", theme[menuTheme])
790789
};
@@ -803,14 +802,14 @@ void ConsoleUI::settingsMenu()
803802
case 2: Settings::threaded2D = (Settings::threaded2D + 1) % 2; break;
804803
case 3: Settings::threaded3D = (Settings::threaded3D + 1) % 2; break;
805804
case 4: Settings::highRes3D = (Settings::highRes3D + 1) % 2; break;
806-
case 5: ScreenLayout::screenPosition = (ScreenLayout::screenPosition + 1) % 5; break;
807-
case 6: ScreenLayout::screenRotation = (ScreenLayout::screenRotation + 1) % 3; break;
808-
case 7: ScreenLayout::screenArrangement = (ScreenLayout::screenArrangement + 1) % 4; break;
809-
case 8: ScreenLayout::screenSizing = (ScreenLayout::screenSizing + 1) % 3; break;
810-
case 9: ScreenLayout::screenGap = (ScreenLayout::screenGap + 1) % 4; break;
811-
case 10: ScreenLayout::integerScale = (ScreenLayout::integerScale + 1) % 2; break;
812-
case 11: ScreenLayout::gbaCrop = (ScreenLayout::gbaCrop + 1) % 2; break;
813-
case 12: screenFilter = (screenFilter + 1) % 2; break;
805+
case 5: Settings::screenFilter = (Settings::screenFilter + 1) % 3; break;
806+
case 6: ScreenLayout::screenPosition = (ScreenLayout::screenPosition + 1) % 5; break;
807+
case 7: ScreenLayout::screenRotation = (ScreenLayout::screenRotation + 1) % 3; break;
808+
case 8: ScreenLayout::screenArrangement = (ScreenLayout::screenArrangement + 1) % 4; break;
809+
case 9: ScreenLayout::screenSizing = (ScreenLayout::screenSizing + 1) % 3; break;
810+
case 10: ScreenLayout::screenGap = (ScreenLayout::screenGap + 1) % 4; break;
811+
case 11: ScreenLayout::integerScale = (ScreenLayout::integerScale + 1) % 2; break;
812+
case 12: ScreenLayout::gbaCrop = (ScreenLayout::gbaCrop + 1) % 2; break;
814813
case 13: showFpsCounter = (showFpsCounter + 1) % 2; break;
815814

816815
case 14:

src/console/console_ui.h

-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ class ConsoleUI
101101
static void *folderTextures[2];
102102
static void *fontTexture;
103103

104-
static int screenFilter;
105104
static int showFpsCounter;
106105
static int menuTheme;
107106

0 commit comments

Comments
 (0)