| | 79 | static bool CompareModes(const wxVideoMode& Mode1, const wxVideoMode& Mode2) |
| | 80 | { |
| | 81 | // Compare the widths. |
| | 82 | if (Mode1.w < Mode2.w) return true; |
| | 83 | if (Mode1.w > Mode2.w) return false; |
| | 84 | |
| | 85 | // The widths are equal, now compare the heights. |
| | 86 | if (Mode1.h < Mode2.h) return true; |
| | 87 | if (Mode1.h > Mode2.h) return false; |
| | 88 | |
| | 89 | // The widths and heights are equal, now compare the BPP. |
| | 90 | if (Mode1.bpp < Mode2.bpp) return true; |
| | 91 | if (Mode1.bpp > Mode2.bpp) return false; |
| | 92 | |
| | 93 | // The widths, heights and BPPs are equal, now compare the refresh rate. |
| | 94 | if (Mode1.refresh < Mode2.refresh) return true; |
| | 95 | if (Mode1.refresh > Mode2.refresh) return false; |
| | 96 | |
| | 97 | // The modes are equal. |
| | 98 | return false; |
| | 99 | } |
| | 100 | |
| | 101 | static std::string GetVideoModes() |
| | 102 | { |
| | 103 | ArrayT<wxVideoMode> Modes; |
| | 104 | |
| | 105 | { |
| | 106 | wxDisplay Display; |
| | 107 | wxArrayVideoModes wxModes=Display.GetModes(); |
| | 108 | |
| | 109 | for (size_t ModeNr=0; ModeNr<wxModes.GetCount(); ModeNr++) |
| | 110 | Modes.PushBack(wxModes[ModeNr]); |
| | 111 | } |
| | 112 | |
| | 113 | // Remove modes according to certain filter criteria, cutting excessively long mode lists. |
| | 114 | for (unsigned long ModeNr=0; ModeNr<Modes.Size(); ModeNr++) |
| | 115 | { |
| | 116 | const wxVideoMode& Mode=Modes[ModeNr]; |
| | 117 | |
| | 118 | if (Mode.w==0 || Mode.h==0 || Mode.bpp<15) |
| | 119 | { |
| | 120 | Modes.RemoveAt(ModeNr); |
| | 121 | ModeNr--; |
| | 122 | continue; |
| | 123 | } |
| | 124 | |
| | 125 | for (unsigned long OtherNr=0; OtherNr<Modes.Size(); OtherNr++) |
| | 126 | { |
| | 127 | if (OtherNr==ModeNr) continue; |
| | 128 | |
| | 129 | const wxVideoMode& Other=Modes[OtherNr]; |
| | 130 | |
| | 131 | if (Mode==Other || (Mode.w==Other.w && Mode.h==Other.h && Mode.bpp<32 && Mode.bpp<Other.bpp)) |
| | 132 | { |
| | 133 | Modes.RemoveAt(ModeNr); |
| | 134 | ModeNr--; |
| | 135 | break; |
| | 136 | } |
| | 137 | } |
| | 138 | |
| | 139 | // Note that the above loop is written in a way that allows no additional statements here. |
| | 140 | } |
| | 141 | |
| | 142 | // Sort the modes by increasing width, height, BPP and refresh rate. |
| | 143 | Modes.QuickSort(CompareModes); |
| | 144 | |
| | 145 | // Build the result string. |
| | 146 | wxString List; |
| | 147 | |
| | 148 | for (unsigned long ModeNr=0; ModeNr<Modes.Size(); ModeNr++) |
| | 149 | { |
| | 150 | const wxVideoMode& Mode=Modes[ModeNr]; |
| | 151 | |
| | 152 | List+=wxString::Format("%i x %i, %i bpp, %i Hz\n", Mode.w, Mode.h, Mode.bpp, Mode.refresh); |
| | 153 | } |
| | 154 | |
| | 155 | return List.ToStdString(); |
| | 156 | } |
| | 157 | |
| | 158 | // Note that the format of the VideoModes string is fixed - it is parsed by the Main Menu GUI in order to populate the choice box. |
| | 159 | static ConVarT VideoModes("VideoModes", GetVideoModes(), ConVarT::FLAG_MAIN_EXE | ConVarT::FLAG_READ_ONLY, "The list of video modes that are available on your system."); |
| | 160 | |
| | 161 | |