*** empty log message ***
This commit is contained in:
parent
b2713156b8
commit
4e3a47e343
|
@ -31,7 +31,6 @@
|
||||||
*/
|
*/
|
||||||
package org.lwjgl.util;
|
package org.lwjgl.util;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -132,34 +131,49 @@ public final class Display {
|
||||||
*/
|
*/
|
||||||
public static DisplayMode setDisplayMode(DisplayMode[] dm, final String[] param) throws Exception {
|
public static DisplayMode setDisplayMode(DisplayMode[] dm, final String[] param) throws Exception {
|
||||||
|
|
||||||
|
class FieldAccessor {
|
||||||
|
final String fieldName;
|
||||||
|
final int order;
|
||||||
|
final int preferred;
|
||||||
|
final boolean usePreferred;
|
||||||
|
FieldAccessor(String fieldName, int order, int preferred, boolean usePreferred) {
|
||||||
|
this.fieldName = fieldName;
|
||||||
|
this.order = order;
|
||||||
|
this.preferred = preferred;
|
||||||
|
this.usePreferred = usePreferred;
|
||||||
|
}
|
||||||
|
int getInt(DisplayMode mode) {
|
||||||
|
if ("width".equals(fieldName)) {
|
||||||
|
return mode.getWidth();
|
||||||
|
}
|
||||||
|
if ("height".equals(fieldName)) {
|
||||||
|
return mode.getHeight();
|
||||||
|
}
|
||||||
|
if ("freq".equals(fieldName)) {
|
||||||
|
return mode.getFrequency();
|
||||||
|
}
|
||||||
|
if ("bpp".equals(fieldName)) {
|
||||||
|
return mode.getBitsPerPixel();
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Unknown field "+fieldName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class Sorter implements Comparator {
|
class Sorter implements Comparator {
|
||||||
|
|
||||||
final Field[] field;
|
final FieldAccessor[] field;
|
||||||
final int[] order;
|
|
||||||
final boolean[] usePreferred;
|
|
||||||
final int[] preferred;
|
|
||||||
|
|
||||||
Sorter() throws NoSuchFieldException {
|
Sorter() throws NoSuchFieldException {
|
||||||
field = new Field[param.length];
|
field = new FieldAccessor[param.length];
|
||||||
order = new int[param.length];
|
|
||||||
preferred = new int[param.length];
|
|
||||||
usePreferred = new boolean[param.length];
|
|
||||||
for (int i = 0; i < field.length; i ++) {
|
for (int i = 0; i < field.length; i ++) {
|
||||||
int idx = param[i].indexOf('=');
|
int idx = param[i].indexOf('=');
|
||||||
if (idx > 0) {
|
if (idx > 0) {
|
||||||
preferred[i] = Integer.parseInt(param[i].substring(idx + 1, param[i].length()));
|
field[i] = new FieldAccessor(param[i].substring(0, idx), 0, Integer.parseInt(param[i].substring(idx + 1, param[i].length())), true);
|
||||||
usePreferred[i] = true;
|
|
||||||
param[i] = param[i].substring(0, idx);
|
|
||||||
field[i] = DisplayMode.class.getDeclaredField(param[i]);
|
|
||||||
} else if (param[i].charAt(0) == '-') {
|
} else if (param[i].charAt(0) == '-') {
|
||||||
field[i] = DisplayMode.class.getDeclaredField(param[i].substring(1));
|
field[i] = new FieldAccessor(param[i].substring(1), -1, 0, false);
|
||||||
order[i] = -1;
|
|
||||||
} else {
|
} else {
|
||||||
field[i] = DisplayMode.class.getDeclaredField(param[i]);
|
field[i] = new FieldAccessor(param[i], 1, 0, false);
|
||||||
order[i] = 1;
|
|
||||||
}
|
}
|
||||||
field[i].setAccessible(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,19 +185,18 @@ public final class Display {
|
||||||
DisplayMode dm2 = (DisplayMode) o2;
|
DisplayMode dm2 = (DisplayMode) o2;
|
||||||
|
|
||||||
for (int i = 0; i < field.length; i ++) {
|
for (int i = 0; i < field.length; i ++) {
|
||||||
try {
|
|
||||||
int f1 = field[i].getInt(dm1);
|
int f1 = field[i].getInt(dm1);
|
||||||
int f2 = field[i].getInt(dm2);
|
int f2 = field[i].getInt(dm2);
|
||||||
|
|
||||||
if (usePreferred[i] && f1 != f2) {
|
if (field[i].usePreferred && f1 != f2) {
|
||||||
if (f1 == preferred[i])
|
if (f1 == field[i].preferred)
|
||||||
return -1;
|
return -1;
|
||||||
else if (f2 == preferred[i])
|
else if (f2 == field[i].preferred)
|
||||||
return 1;
|
return 1;
|
||||||
else {
|
else {
|
||||||
// Score according to the difference between the values
|
// Score according to the difference between the values
|
||||||
int absf1 = Math.abs(f1 - preferred[i]);
|
int absf1 = Math.abs(f1 - field[i].preferred);
|
||||||
int absf2 = Math.abs(f2 - preferred[i]);
|
int absf2 = Math.abs(f2 - field[i].preferred);
|
||||||
if (absf1 < absf2)
|
if (absf1 < absf2)
|
||||||
return -1;
|
return -1;
|
||||||
else if (absf1 > absf2)
|
else if (absf1 > absf2)
|
||||||
|
@ -192,14 +205,11 @@ public final class Display {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (f1 < f2)
|
} else if (f1 < f2)
|
||||||
return order[i];
|
return field[i].order;
|
||||||
else if (f1 == f2)
|
else if (f1 == f2)
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
return -order[i];
|
return -field[i].order;
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue