Skip to content

Commit e4bacd8

Browse files
committed
Added missing graphics & overlay settings
1 parent 6026d2a commit e4bacd8

File tree

6 files changed

+199
-2
lines changed

6 files changed

+199
-2
lines changed

src/android/app/src/main/cpp/NativeSettings.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ Java_info_cemu_Cemu_nativeinterface_NativeSettings_setOverlayPosition([[maybe_un
1414
g_config.Save();
1515
}
1616

17+
extern "C" JNIEXPORT jint JNICALL
18+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_getOverlayTextScalePercentage([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
19+
{
20+
return g_config.data().overlay.text_scale;
21+
}
22+
23+
extern "C" JNIEXPORT void JNICALL
24+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_setOverlayTextScalePercentage([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint scalePercentage)
25+
{
26+
g_config.data().overlay.text_scale = scalePercentage;
27+
g_config.Save();
28+
}
29+
1730
extern "C" JNIEXPORT jboolean JNICALL
1831
Java_info_cemu_Cemu_nativeinterface_NativeSettings_isOverlayFPSEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
1932
{
@@ -118,6 +131,19 @@ Java_info_cemu_Cemu_nativeinterface_NativeSettings_setNotificationsPosition([[ma
118131
g_config.Save();
119132
}
120133

134+
extern "C" JNIEXPORT jint JNICALL
135+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_getNotificationsTextScalePercentage([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
136+
{
137+
return g_config.data().notification.text_scale;
138+
}
139+
140+
extern "C" JNIEXPORT void JNICALL
141+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_setNotificationsTextScalePercentage([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint scalePercentage)
142+
{
143+
g_config.data().notification.text_scale = scalePercentage;
144+
g_config.Save();
145+
}
146+
121147
extern "C" JNIEXPORT jboolean JNICALL
122148
Java_info_cemu_Cemu_nativeinterface_NativeSettings_isNotificationControllerProfilesEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
123149
{
@@ -215,6 +241,45 @@ Java_info_cemu_Cemu_nativeinterface_NativeSettings_getAccurateBarriers([[maybe_u
215241
return g_config.data().vk_accurate_barriers;
216242
}
217243

244+
extern "C" [[maybe_unused]] JNIEXPORT void JNICALL
245+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_setUpscalingFilter([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint upscaling_filter)
246+
{
247+
g_config.data().upscale_filter = upscaling_filter;
248+
g_config.Save();
249+
}
250+
251+
extern "C" [[maybe_unused]] JNIEXPORT jboolean JNICALL
252+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_getUpscalingFilter([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
253+
{
254+
return g_config.data().upscale_filter;
255+
}
256+
257+
extern "C" [[maybe_unused]] JNIEXPORT void JNICALL
258+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_setDownscalingFilter([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint downscaling_filter)
259+
{
260+
g_config.data().downscale_filter = downscaling_filter;
261+
g_config.Save();
262+
}
263+
264+
extern "C" [[maybe_unused]] JNIEXPORT jboolean JNICALL
265+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_getDownscalingFilter([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
266+
{
267+
return g_config.data().downscale_filter;
268+
}
269+
270+
extern "C" [[maybe_unused]] JNIEXPORT void JNICALL
271+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_setFullscreenScaling([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint fullscreen_scaling)
272+
{
273+
g_config.data().fullscreen_scaling = fullscreen_scaling;
274+
g_config.Save();
275+
}
276+
277+
extern "C" [[maybe_unused]] JNIEXPORT jboolean JNICALL
278+
Java_info_cemu_Cemu_nativeinterface_NativeSettings_getFullscreenScaling([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
279+
{
280+
return g_config.data().fullscreen_scaling;
281+
}
282+
218283
extern "C" [[maybe_unused]] JNIEXPORT void JNICALL
219284
Java_info_cemu_Cemu_nativeinterface_NativeSettings_setAccurateBarriers([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
220285
{

src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SliderRecyclerViewItem.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public SliderViewHolder(View itemView) {
3434
private float currentValue;
3535
private final OnChangeListener onChangeListener;
3636
private LabelFormatter labelFormatter;
37+
private float stepSize = 1.0f;
3738

3839
public SliderRecyclerViewItem(String label, float valueFrom, float valueTo, float currentValue, OnChangeListener onChangeListener, LabelFormatter labelFormatter) {
3940
this.label = label;
@@ -44,6 +45,16 @@ public SliderRecyclerViewItem(String label, float valueFrom, float valueTo, floa
4445
this.labelFormatter = labelFormatter;
4546
}
4647

48+
public SliderRecyclerViewItem(String label, float valueFrom, float valueTo, float currentValue, float stepSize, OnChangeListener onChangeListener, LabelFormatter labelFormatter) {
49+
this.label = label;
50+
this.valueFrom = valueFrom;
51+
this.valueTo = valueTo;
52+
this.currentValue = currentValue;
53+
this.stepSize = stepSize;
54+
this.onChangeListener = onChangeListener;
55+
this.labelFormatter = labelFormatter;
56+
}
57+
4758
public SliderRecyclerViewItem(String label, float valueFrom, float valueTo, float currentValue, OnChangeListener onChangeListener) {
4859
this.label = label;
4960
this.valueFrom = valueFrom;
@@ -64,7 +75,6 @@ public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, RecyclerView.Ad
6475
if (labelFormatter != null) sliderViewHolder.slider.setLabelFormatter(labelFormatter);
6576
sliderViewHolder.slider.setValueFrom(valueFrom);
6677
sliderViewHolder.slider.setValueTo(valueTo);
67-
float stepSize = 1.0f;
6878
sliderViewHolder.slider.setStepSize(stepSize);
6979
sliderViewHolder.slider.setValue(currentValue);
7080
sliderViewHolder.slider.addOnChangeListener((slider, value, fromUser) -> {

src/android/app/src/main/java/info/cemu/Cemu/nativeinterface/NativeSettings.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@ public class NativeSettings {
2121

2222
public static native void setVSyncMode(int vsyncMode);
2323

24+
public static final int FULLSCREEN_SCALING_KEEP_ASPECT_RATIO = 0;
25+
public static final int FULLSCREEN_SCALING_STRETCH = 1;
26+
27+
public static native int getFullscreenScaling();
28+
29+
public static native void setFullscreenScaling(int fullscreenScaling);
30+
31+
public static final int SCALING_FILTER_BILINEAR_FILTER = 0;
32+
public static final int SCALING_FILTER_BICUBIC_FILTER = 1;
33+
public static final int SCALING_FILTER_BICUBIC_HERMITE_FILTER = 2;
34+
public static final int SCALING_FILTER_NEAREST_NEIGHBOR_FILTER = 3;
35+
36+
public static native int getUpscalingFilter();
37+
38+
public static native void setUpscalingFilter(int upscalingFilter);
39+
40+
public static native int getDownscalingFilter();
41+
42+
public static native void setDownscalingFilter(int downscalingFilter);
43+
2444
public static native boolean getAccurateBarriers();
2545

2646
public static native void setAccurateBarriers(boolean enabled);
@@ -56,6 +76,14 @@ public class NativeSettings {
5676

5777
public static native void setOverlayPosition(int position);
5878

79+
public static final int OVERLAY_TEXT_SCALE_MIN = 50;
80+
public static final int OVERLAY_TEXT_SCALE_MAX = 300;
81+
82+
public static native int getOverlayTextScalePercentage();
83+
84+
public static native void setOverlayTextScalePercentage(int scalePercentage);
85+
86+
5987
public static native boolean isOverlayFPSEnabled();
6088

6189
public static native void setOverlayFPSEnabled(boolean enabled);
@@ -84,6 +112,10 @@ public class NativeSettings {
84112

85113
public static native void setNotificationsPosition(int position);
86114

115+
public static native int getNotificationsTextScalePercentage();
116+
117+
public static native void setNotificationsTextScalePercentage(int scalePercentage);
118+
87119
public static native boolean isNotificationControllerProfilesEnabled();
88120

89121
public static native void setNotificationControllerProfilesEnabled(boolean enabled);

src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,26 @@ private static int vsyncModeToResourceNameId(int vsyncMode) {
2929
};
3030
}
3131

32+
private static int fullscreenScalingModeToResourceNameId(int fullscreenScaling) {
33+
return switch (fullscreenScaling) {
34+
case NativeSettings.FULLSCREEN_SCALING_KEEP_ASPECT_RATIO -> R.string.keep_aspect_ratio;
35+
case NativeSettings.FULLSCREEN_SCALING_STRETCH -> R.string.stretch;
36+
default ->
37+
throw new IllegalArgumentException("Invalid fullscreen scaling mode: " + fullscreenScaling);
38+
};
39+
}
40+
41+
private static int scalingFilterToResourceNameId(int fullscreenScaling) {
42+
return switch (fullscreenScaling) {
43+
case NativeSettings.SCALING_FILTER_BILINEAR_FILTER -> R.string.bilinear;
44+
case NativeSettings.SCALING_FILTER_BICUBIC_FILTER -> R.string.bicubic;
45+
case NativeSettings.SCALING_FILTER_BICUBIC_HERMITE_FILTER -> R.string.hermite;
46+
case NativeSettings.SCALING_FILTER_NEAREST_NEIGHBOR_FILTER -> R.string.nearest_neighbor;
47+
default ->
48+
throw new IllegalArgumentException("Invalid fullscreen scaling mode: " + fullscreenScaling);
49+
};
50+
}
51+
3252
@Override
3353
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
3454
var binding = GenericRecyclerViewLayoutBinding.inflate(inflater, container, false);
@@ -54,6 +74,47 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
5474
CheckboxRecyclerViewItem accurateBarriersCheckbox = new CheckboxRecyclerViewItem(getString(R.string.accurate_barriers), getString(R.string.accurate_barriers_description), NativeSettings.getAccurateBarriers(), NativeSettings::setAccurateBarriers);
5575
genericRecyclerViewAdapter.addRecyclerViewItem(accurateBarriersCheckbox);
5676

77+
int fullscreenScalingMode = NativeSettings.getFullscreenScaling();
78+
var fullscreenScalingChoices = Stream.of(NativeSettings.FULLSCREEN_SCALING_KEEP_ASPECT_RATIO, NativeSettings.FULLSCREEN_SCALING_STRETCH)
79+
.map(fullScreenScaling -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(fullscreenScalingModeToResourceNameId(fullScreenScaling)), fullScreenScaling))
80+
.collect(Collectors.toList());
81+
SelectionAdapter<Integer> fullscreenScalingSelectionAdapter = new SelectionAdapter<>(fullscreenScalingChoices, fullscreenScalingMode);
82+
SingleSelectionRecyclerViewItem<Integer> fullscreenScalingSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.fullscreen_scaling),
83+
getString(fullscreenScalingModeToResourceNameId(fullscreenScalingMode)), fullscreenScalingSelectionAdapter,
84+
(fullscreenScaling, selectionRecyclerViewItem) -> {
85+
NativeSettings.setFullscreenScaling(fullscreenScaling);
86+
selectionRecyclerViewItem.setDescription(getString(fullscreenScalingModeToResourceNameId(fullscreenScaling)));
87+
});
88+
genericRecyclerViewAdapter.addRecyclerViewItem(fullscreenScalingSelection);
89+
90+
var scalingFilterChoices = Stream.of(
91+
NativeSettings.SCALING_FILTER_BILINEAR_FILTER,
92+
NativeSettings.SCALING_FILTER_BICUBIC_FILTER,
93+
NativeSettings.SCALING_FILTER_BICUBIC_HERMITE_FILTER,
94+
NativeSettings.SCALING_FILTER_NEAREST_NEIGHBOR_FILTER
95+
).map(scalingFilter -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(scalingFilterToResourceNameId(scalingFilter)), scalingFilter))
96+
.collect(Collectors.toList());
97+
98+
var upscaleFilterMode = NativeSettings.getUpscalingFilter();
99+
SelectionAdapter<Integer> upscaleFilterSelectionAdapter = new SelectionAdapter<>(scalingFilterChoices, upscaleFilterMode);
100+
SingleSelectionRecyclerViewItem<Integer> upscaleFilterSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.upscale_filter),
101+
getString(scalingFilterToResourceNameId(upscaleFilterMode)), upscaleFilterSelectionAdapter,
102+
(upscaleFilter, selectionRecyclerViewItem) -> {
103+
NativeSettings.setUpscalingFilter(upscaleFilter);
104+
selectionRecyclerViewItem.setDescription(getString(scalingFilterToResourceNameId(upscaleFilter)));
105+
});
106+
genericRecyclerViewAdapter.addRecyclerViewItem(upscaleFilterSelection);
107+
108+
var downscaleFilterMode = NativeSettings.getDownscalingFilter() ;
109+
SelectionAdapter<Integer> downscaleFilterSelectionAdapter = new SelectionAdapter<>(scalingFilterChoices, downscaleFilterMode);
110+
SingleSelectionRecyclerViewItem<Integer> downscaleFilterSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.downscale_filter),
111+
getString(scalingFilterToResourceNameId(downscaleFilterMode)), downscaleFilterSelectionAdapter,
112+
(downscaleFilter, selectionRecyclerViewItem) -> {
113+
NativeSettings.setDownscalingFilter(downscaleFilter);
114+
selectionRecyclerViewItem.setDescription(getString(scalingFilterToResourceNameId(downscaleFilter)));
115+
});
116+
genericRecyclerViewAdapter.addRecyclerViewItem(downscaleFilterSelection);
117+
57118
binding.recyclerView.setAdapter(genericRecyclerViewAdapter);
58119
return binding.getRoot();
59120
}

src/android/app/src/main/java/info/cemu/Cemu/settings/overlay/OverlaySettingsFragment.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
import info.cemu.Cemu.guibasecomponents.HeaderRecyclerViewItem;
1919
import info.cemu.Cemu.guibasecomponents.SelectionAdapter;
2020
import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem;
21+
import info.cemu.Cemu.guibasecomponents.SliderRecyclerViewItem;
2122
import info.cemu.Cemu.nativeinterface.NativeSettings;
2223

23-
2424
public class OverlaySettingsFragment extends Fragment {
2525
private static int overlayScreenPositionToResourceNameId(int overlayScreenPosition) {
2626
return switch (overlayScreenPosition) {
@@ -71,6 +71,15 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
7171
});
7272
genericRecyclerViewAdapter.addRecyclerViewItem(overlayPositionSelection);
7373

74+
SliderRecyclerViewItem overlayTextScale = new SliderRecyclerViewItem(getString(R.string.overlay_text_scale),
75+
NativeSettings.OVERLAY_TEXT_SCALE_MIN,
76+
NativeSettings.OVERLAY_TEXT_SCALE_MAX,
77+
NativeSettings.getOverlayTextScalePercentage(),
78+
25.0f,
79+
value -> NativeSettings.setOverlayTextScalePercentage((int) value),
80+
value -> (int) value + "%");
81+
genericRecyclerViewAdapter.addRecyclerViewItem(overlayTextScale);
82+
7483
CheckboxRecyclerViewItem overlayFps = new CheckboxRecyclerViewItem(getString(R.string.fps),
7584
getString(R.string.fps_overlay_description), NativeSettings.isOverlayFPSEnabled(),
7685
NativeSettings::setOverlayFPSEnabled);
@@ -107,6 +116,15 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
107116
});
108117
genericRecyclerViewAdapter.addRecyclerViewItem(notificationsPositionSelection);
109118

119+
SliderRecyclerViewItem notificationTextScale = new SliderRecyclerViewItem(getString(R.string.notifications_text_scale),
120+
NativeSettings.OVERLAY_TEXT_SCALE_MIN,
121+
NativeSettings.OVERLAY_TEXT_SCALE_MAX,
122+
NativeSettings.getNotificationsTextScalePercentage(),
123+
25.0f,
124+
value -> NativeSettings.setNotificationsTextScalePercentage((int) value),
125+
value -> (int) value + "%");
126+
genericRecyclerViewAdapter.addRecyclerViewItem(notificationTextScale);
127+
110128
CheckboxRecyclerViewItem controllerProfiles = new CheckboxRecyclerViewItem(getString(R.string.controller_profiles),
111129
getString(R.string.controller_profiles_notification_description), NativeSettings.isNotificationControllerProfilesEnabled(),
112130
NativeSettings::setNotificationControllerProfilesEnabled);

src/android/app/src/main/res/values/strings.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,4 +178,15 @@
178178
<string name="failed_initialize_renderer_error">Failed to initialize renderer: %1$s</string>
179179
<string name="open_cemu_folder">Open Cemu folder</string>
180180
<string name="failed_to_open_cemu_folder">Could not open Cemu folder</string>
181+
<string name="stretch">Stretch</string>
182+
<string name="keep_aspect_ratio">Keep aspect ratio</string>
183+
<string name="bilinear">Bilinear</string>
184+
<string name="bicubic">Bicubic</string>
185+
<string name="hermite">Hermite</string>
186+
<string name="nearest_neighbor">Nearest neighbor</string>
187+
<string name="fullscreen_scaling">Fullscreen scaling</string>
188+
<string name="upscale_filter">Upscale filter</string>
189+
<string name="downscale_filter">Downscale filter</string>
190+
<string name="overlay_text_scale">Overlay text scale</string>
191+
<string name="notifications_text_scale">Notifications text scale</string>
181192
</resources>

0 commit comments

Comments
 (0)