1 |
|
|
/* |
2 |
|
|
* The ManaPlus Client |
3 |
|
|
* Copyright (C) 2011-2019 The ManaPlus Developers |
4 |
|
|
* Copyright (C) 2019-2021 Andrei Karas |
5 |
|
|
* |
6 |
|
|
* This file is part of The ManaPlus Client. |
7 |
|
|
* |
8 |
|
|
* This program is free software; you can redistribute it and/or modify |
9 |
|
|
* it under the terms of the GNU General Public License as published by |
10 |
|
|
* the Free Software Foundation; either version 2 of the License, or |
11 |
|
|
* any later version. |
12 |
|
|
* |
13 |
|
|
* This program is distributed in the hope that it will be useful, |
14 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 |
|
|
* GNU General Public License for more details. |
17 |
|
|
* |
18 |
|
|
* You should have received a copy of the GNU General Public License |
19 |
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
20 |
|
|
*/ |
21 |
|
|
|
22 |
|
|
#include "test/testlauncher.h" |
23 |
|
|
|
24 |
|
|
#ifdef USE_OPENGL |
25 |
|
|
|
26 |
|
|
#include "graphicsmanager.h" |
27 |
|
|
#include "settings.h" |
28 |
|
|
#include "soundmanager.h" |
29 |
|
|
|
30 |
|
|
#include "fs/virtfs/rwops.h" |
31 |
|
|
|
32 |
|
|
#include "gui/skin.h" |
33 |
|
|
#include "gui/theme.h" |
34 |
|
|
|
35 |
|
|
#include "gui/fonts/font.h" |
36 |
|
|
|
37 |
|
|
#include "utils/pnglib.h" |
38 |
|
|
#include "utils/stringutils.h" |
39 |
|
|
|
40 |
|
|
#include "render/graphics.h" |
41 |
|
|
|
42 |
|
|
#include "render/vertexes/imagecollection.h" |
43 |
|
|
|
44 |
|
|
#include "resources/openglimagehelper.h" |
45 |
|
|
#include "resources/screenshothelper.h" |
46 |
|
|
#include "resources/surfaceimagehelper.h" |
47 |
|
|
#include "resources/wallpaper.h" |
48 |
|
|
|
49 |
|
|
#include "resources/dye/dye.h" |
50 |
|
|
#if defined __linux__ || defined __linux |
51 |
|
|
#ifdef SIMD_SUPPORTED |
52 |
|
|
#include "resources/dye/dyepalette.h" |
53 |
|
|
#endif // SIMD_SUPPORTED |
54 |
|
|
#endif // defined __linux__ || defined __linux |
55 |
|
|
|
56 |
|
|
#include "resources/image/image.h" |
57 |
|
|
|
58 |
|
|
PRAGMA48(GCC diagnostic push) |
59 |
|
|
PRAGMA48(GCC diagnostic ignored "-Wshadow") |
60 |
|
|
#ifndef USE_SDL2 |
61 |
|
|
#include <SDL_gfxBlitFunc.h> |
62 |
|
|
#endif // USE_SDL2 |
63 |
|
|
PRAGMA48(GCC diagnostic pop) |
64 |
|
|
|
65 |
|
|
#include <unistd.h> |
66 |
|
|
|
67 |
|
|
#ifdef WIN32 |
68 |
|
|
#include <windows.h> |
69 |
|
|
#define sleep(seconds) Sleep((seconds) * 1000) |
70 |
|
|
#endif // WIN32 |
71 |
|
|
|
72 |
|
|
#include <sys/time.h> |
73 |
|
|
|
74 |
|
|
#include "localconsts.h" |
75 |
|
|
|
76 |
|
|
#ifndef SDL_BIG_ENDIAN |
77 |
|
|
#error missing SDL_endian.h |
78 |
|
|
#endif // SDL_BYTEORDER |
79 |
|
|
|
80 |
|
|
#if SDL_BYTEORDER == SDL_LIL_ENDIAN |
81 |
|
|
#ifndef USE_SDL2 |
82 |
|
|
#include "resources/sdlgfxblitfunc.h" |
83 |
|
|
#endif // USE_SDL2 |
84 |
|
|
#endif // SDL_BYTEORDER == SDL_LIL_ENDIAN |
85 |
|
|
|
86 |
|
|
#include "debug.h" |
87 |
|
|
|
88 |
|
|
extern Font *boldFont; |
89 |
|
|
|
90 |
|
|
TestLauncher::TestLauncher(std::string test) : |
91 |
|
|
mTest(test), |
92 |
|
|
file() |
93 |
|
|
{ |
94 |
|
|
file.open(pathJoin(settings.localDataDir, "test.log").c_str(), |
95 |
|
|
std::ios::out); |
96 |
|
|
} |
97 |
|
|
|
98 |
|
|
TestLauncher::~TestLauncher() |
99 |
|
|
{ |
100 |
|
|
file.close(); |
101 |
|
|
} |
102 |
|
|
|
103 |
|
|
int TestLauncher::exec() |
104 |
|
|
{ |
105 |
|
|
if (mTest == "1" || mTest == "2" || mTest == "3" || mTest == "19") |
106 |
|
|
return testBackend(); |
107 |
|
|
else if (mTest == "4") |
108 |
|
|
return testSound(); |
109 |
|
|
else if (mTest == "5" || mTest == "6" || mTest == "7" || mTest == "18") |
110 |
|
|
return testRescale(); |
111 |
|
|
else if (mTest == "8" || mTest == "9" || mTest == "10" || mTest == "17") |
112 |
|
|
return testFps(); |
113 |
|
|
else if (mTest == "11") |
114 |
|
|
return testBatches(); |
115 |
|
|
else if (mTest == "14" || mTest == "15" || mTest == "16" || mTest == "20") |
116 |
|
|
return testTextures(); |
117 |
|
|
else if (mTest == "99") |
118 |
|
|
return testVideoDetection(); |
119 |
|
|
else if (mTest == "100") |
120 |
|
|
return testInternal(); |
121 |
|
|
else if (mTest == "101") |
122 |
|
|
return testDye(); |
123 |
|
|
else if (mTest == "102") |
124 |
|
|
return testDraw(); |
125 |
|
|
else if (mTest == "103") |
126 |
|
|
return testFps2(); |
127 |
|
|
else if (mTest == "104") |
128 |
|
|
return testFps3(); |
129 |
|
|
else if (mTest == "105") |
130 |
|
|
return testDyeSSpeed(); |
131 |
|
|
else if (mTest == "106") |
132 |
|
|
return testStackSpeed(); |
133 |
|
|
else if (mTest == "107") |
134 |
|
|
return testDyeASpeed(); |
135 |
|
|
else if (mTest == "108") |
136 |
|
|
return testBlitSpeed(); |
137 |
|
|
|
138 |
|
|
return -1; |
139 |
|
|
} |
140 |
|
|
|
141 |
|
|
int TestLauncher::testBackend() const |
142 |
|
|
{ |
143 |
|
|
const Image *const img = Theme::getImageFromTheme( |
144 |
|
|
"graphics/sprites/arrow_up.png"); |
145 |
|
|
if (img == nullptr) |
146 |
|
|
return 1; |
147 |
|
|
const int cnt = 100; |
148 |
|
|
|
149 |
|
|
for (int f = 0; f < cnt; f ++) |
150 |
|
|
{ |
151 |
|
|
mainGraphics->drawImage(img, cnt * 7, cnt * 5); |
152 |
|
|
mainGraphics->updateScreen(); |
153 |
|
|
} |
154 |
|
|
|
155 |
|
|
sleep(1); |
156 |
|
|
return 0; |
157 |
|
|
} |
158 |
|
|
|
159 |
|
|
int TestLauncher::testSound() const |
160 |
|
|
{ |
161 |
|
|
soundManager.playGuiSfx("system/newmessage.ogg"); |
162 |
|
|
sleep(1); |
163 |
|
|
soundManager.playSfx("system/newmessage.ogg", 0, 0); |
164 |
|
|
soundManager.playMusic("sfx/system/newmessage.ogg", SkipError_false); |
165 |
|
|
sleep(3); |
166 |
|
|
soundManager.stopMusic(); |
167 |
|
|
return 0; |
168 |
|
|
} |
169 |
|
|
|
170 |
|
|
int TestLauncher::testRescale() const |
171 |
|
|
{ |
172 |
|
|
Wallpaper::loadWallpapers(); |
173 |
|
|
const std::string wallpaperName = Wallpaper::getWallpaper(800, 600); |
174 |
|
|
const volatile Image *const img = Theme::getImageFromTheme(wallpaperName); |
175 |
|
|
if (img == nullptr) |
176 |
|
|
return 1; |
177 |
|
|
|
178 |
|
|
sleep(1); |
179 |
|
|
return 0; |
180 |
|
|
} |
181 |
|
|
|
182 |
|
|
PRAGMA45(GCC diagnostic push) |
183 |
|
|
PRAGMA45(GCC diagnostic ignored "-Wunused-result") |
184 |
|
|
|
185 |
|
|
int TestLauncher::testFps() |
186 |
|
|
{ |
187 |
|
|
timeval start; |
188 |
|
|
timeval end; |
189 |
|
|
|
190 |
|
|
Wallpaper::loadWallpapers(); |
191 |
|
|
Wallpaper::getWallpaper(800, 600); |
192 |
|
|
Image *img[5]; |
193 |
|
|
const int sz = 4; |
194 |
|
|
|
195 |
|
|
img[0] = Theme::getImageFromTheme("graphics/sprites/arrow_up.png"); |
196 |
|
|
img[1] = Theme::getImageFromTheme( |
197 |
|
|
"graphics/gui/target-cursor-normal-l.png"); |
198 |
|
|
img[2] = Theme::getImageFromTheme("themes/wood/window.png"); |
199 |
|
|
img[3] = Theme::getImageFromTheme("themes/pink/window.png"); |
200 |
|
|
img[4] = Theme::getImageFromTheme("graphics/images/login_wallpaper.png"); |
201 |
|
|
int idx = 0; |
202 |
|
|
|
203 |
|
|
const int cnt = 50; |
204 |
|
|
|
205 |
|
|
gettimeofday(&start, nullptr); |
206 |
|
|
for (int k = 0; k < cnt; k ++) |
207 |
|
|
{ |
208 |
|
|
for (int x = 0; x < 800; x += 30) |
209 |
|
|
{ |
210 |
|
|
for (int y = 0; y < 600; y += 50) |
211 |
|
|
{ |
212 |
|
|
mainGraphics->drawImage(img[idx], x, y); |
213 |
|
|
idx ++; |
214 |
|
|
if (idx > sz) |
215 |
|
|
idx = 0; |
216 |
|
|
mainGraphics->drawImage(img[idx], x, y); |
217 |
|
|
idx ++; |
218 |
|
|
if (idx > sz) |
219 |
|
|
idx = 0; |
220 |
|
|
} |
221 |
|
|
} |
222 |
|
|
mainGraphics->updateScreen(); |
223 |
|
|
} |
224 |
|
|
|
225 |
|
|
gettimeofday(&end, nullptr); |
226 |
|
|
const int tFps = calcFps(start, end, cnt); |
227 |
|
|
file << mTest << std::endl; |
228 |
|
|
file << tFps << std::endl; |
229 |
|
|
|
230 |
|
|
printf("fps: %d\n", tFps / 10); |
231 |
|
|
sleep(1); |
232 |
|
|
return 0; |
233 |
|
|
} |
234 |
|
|
|
235 |
|
|
int TestLauncher::testFps2() |
236 |
|
|
{ |
237 |
|
|
timeval start; |
238 |
|
|
timeval end; |
239 |
|
|
|
240 |
|
|
Wallpaper::loadWallpapers(); |
241 |
|
|
Wallpaper::getWallpaper(800, 600); |
242 |
|
|
Image *img[1]; |
243 |
|
|
|
244 |
|
|
img[0] = Theme::getImageFromTheme("graphics/images/login_wallpaper.png"); |
245 |
|
|
mainGraphics->drawImage(img[0], 0, 0); |
246 |
|
|
|
247 |
|
|
const int cnt = 500; |
248 |
|
|
|
249 |
|
|
gettimeofday(&start, nullptr); |
250 |
|
|
for (int k = 0; k < cnt; k ++) |
251 |
|
|
{ |
252 |
|
|
for (int f = 0; f < 300; f ++) |
253 |
|
|
mainGraphics->testDraw(); |
254 |
|
|
mainGraphics->updateScreen(); |
255 |
|
|
} |
256 |
|
|
|
257 |
|
|
gettimeofday(&end, nullptr); |
258 |
|
|
const int tFps = calcFps(start, end, cnt); |
259 |
|
|
file << mTest << std::endl; |
260 |
|
|
file << tFps << std::endl; |
261 |
|
|
|
262 |
|
|
printf("fps: %d\n", tFps / 10); |
263 |
|
|
sleep(1); |
264 |
|
|
return 0; |
265 |
|
|
} |
266 |
|
|
|
267 |
|
|
int TestLauncher::testFps3() |
268 |
|
|
{ |
269 |
|
|
timeval start; |
270 |
|
|
timeval end; |
271 |
|
|
|
272 |
|
|
Wallpaper::loadWallpapers(); |
273 |
|
|
Wallpaper::getWallpaper(800, 600); |
274 |
|
|
Image *img[2]; |
275 |
|
|
|
276 |
|
|
img[0] = Theme::getImageFromTheme("graphics/sprites/arrow_up.png"); |
277 |
|
|
img[1] = Theme::getImageFromTheme("graphics/sprites/arrow_left.png"); |
278 |
|
|
ImageVertexes *const vert1 = new ImageVertexes; |
279 |
|
|
vert1->image = img[0]; |
280 |
|
|
ImageVertexes *const vert2 = new ImageVertexes; |
281 |
|
|
vert2->image = img[1]; |
282 |
|
|
|
283 |
|
|
for (int f = 0; f < 50; f ++) |
284 |
|
|
{ |
285 |
|
|
for (int d = 0; d < 50; d ++) |
286 |
|
|
{ |
287 |
|
|
mainGraphics->calcTileVertexes(vert1, img[0], f * 16, d * 12); |
288 |
|
|
mainGraphics->calcTileVertexes(vert1, img[1], f * 16 + 5, d * 12); |
289 |
|
|
} |
290 |
|
|
} |
291 |
|
|
mainGraphics->finalize(vert1); |
292 |
|
|
mainGraphics->finalize(vert2); |
293 |
|
|
|
294 |
|
|
const int cnt = 2000; |
295 |
|
|
|
296 |
|
|
gettimeofday(&start, nullptr); |
297 |
|
|
for (int k = 0; k < cnt; k ++) |
298 |
|
|
{ |
299 |
|
|
mainGraphics->drawTileVertexes(vert1); |
300 |
|
|
mainGraphics->drawTileVertexes(vert2); |
301 |
|
|
mainGraphics->updateScreen(); |
302 |
|
|
} |
303 |
|
|
|
304 |
|
|
gettimeofday(&end, nullptr); |
305 |
|
|
const int tFps = calcFps(start, end, cnt); |
306 |
|
|
file << mTest << std::endl; |
307 |
|
|
file << tFps << std::endl; |
308 |
|
|
|
309 |
|
|
printf("fps: %d\n", tFps / 10); |
310 |
|
|
sleep(1); |
311 |
|
|
return 0; |
312 |
|
|
} |
313 |
|
|
PRAGMA45(GCC diagnostic pop) |
314 |
|
|
|
315 |
|
|
int TestLauncher::testBatches() |
316 |
|
|
{ |
317 |
|
|
int batches = 512; |
318 |
|
|
|
319 |
|
|
file << mTest << std::endl; |
320 |
|
|
file << batches << std::endl; |
321 |
|
|
return 0; |
322 |
|
|
} |
323 |
|
|
|
324 |
|
|
int TestLauncher::testTextures() |
325 |
|
|
{ |
326 |
|
|
int maxSize = 512; |
327 |
|
|
int nextSize = 512; |
328 |
|
|
int sz = OpenGLImageHelper::getTextureSize() + 1; |
329 |
|
|
if (sz > 16500) |
330 |
|
|
sz = 16500; |
331 |
|
|
|
332 |
|
|
const uint32_t bytes1[] = |
333 |
|
|
{ |
334 |
|
|
0xFFFF0000U, 0xFFFFFF00U, 0xFF00FFFFU, 0xFF0000FFU, |
335 |
|
|
0xFF000000U, 0xFFFF00FFU |
336 |
|
|
}; |
337 |
|
|
|
338 |
|
|
const uint32_t bytes2[] = |
339 |
|
|
{ |
340 |
|
|
0xFF0000FFU, 0xFF00FFFFU, 0xFFFFFF00U, 0xFFFF0000U, |
341 |
|
|
0xFF000000U, 0xFFFF00FFU |
342 |
|
|
}; |
343 |
|
|
|
344 |
|
|
for (nextSize = 512; nextSize < sz; nextSize *= 2) |
345 |
|
|
{ |
346 |
|
|
mainGraphics->clearScreen(); |
347 |
|
|
SDL_Surface *const surface = imageHelper->create32BitSurface( |
348 |
|
|
nextSize, nextSize); |
349 |
|
|
if (surface == nullptr) |
350 |
|
|
break; |
351 |
|
|
uint32_t *pixels = static_cast<uint32_t*>(surface->pixels); |
352 |
|
|
for (int f = 0; f < 6; f ++) |
353 |
|
|
pixels[f] = bytes1[f]; |
354 |
|
|
graphicsManager.getLastError(); |
355 |
|
|
graphicsManager.resetCachedError(); |
356 |
|
|
Image *const image = imageHelper->loadSurface(surface); |
357 |
|
|
SDL_FreeSurface(surface); |
358 |
|
|
if (image == nullptr) |
359 |
|
|
break; |
360 |
|
|
|
361 |
|
|
if (graphicsManager.getLastErrorCached() != GL_NO_ERROR) |
362 |
|
|
{ |
363 |
|
|
delete image; |
364 |
|
|
break; |
365 |
|
|
} |
366 |
|
|
Image *const subImage = image->getSubImage(0, 0, 10, 10); |
367 |
|
|
if (subImage == nullptr) |
368 |
|
|
{ |
369 |
|
|
delete image; |
370 |
|
|
break; |
371 |
|
|
} |
372 |
|
|
mainGraphics->drawImage(subImage, 0, 0); |
373 |
|
|
mainGraphics->updateScreen(); |
374 |
|
|
mainGraphics->drawImage(subImage, 0, 0); |
375 |
|
|
delete subImage; |
376 |
|
|
SDL_Surface *const screen1 = screenshortHelper->getScreenshot(); |
377 |
|
|
SDL_Surface *const screen2 = ImageHelper::convertTo32Bit(screen1); |
378 |
|
|
SDL_FreeSurface(screen1); |
379 |
|
|
if (screen2 == nullptr) |
380 |
|
|
break; |
381 |
|
|
pixels = static_cast<uint32_t*>(screen2->pixels); |
382 |
|
|
bool fail(false); |
383 |
|
|
for (int f = 0; f < 6; f ++) |
384 |
|
|
{ |
385 |
|
|
if (pixels[f] != bytes2[f]) |
386 |
|
|
{ |
387 |
|
|
fail = true; |
388 |
|
|
break; |
389 |
|
|
} |
390 |
|
|
} |
391 |
|
|
|
392 |
|
|
SDL_FreeSurface(screen2); |
393 |
|
|
if (fail) |
394 |
|
|
break; |
395 |
|
|
|
396 |
|
|
maxSize = nextSize; |
397 |
|
|
} |
398 |
|
|
|
399 |
|
|
file << mTest << std::endl; |
400 |
|
|
file << maxSize << std::endl; |
401 |
|
|
printf("OpenGL max size: %d\n", sz); |
402 |
|
|
printf("actual max size: %d\n", maxSize); |
403 |
|
|
return 0; |
404 |
|
|
} |
405 |
|
|
|
406 |
|
|
PRAGMA45(GCC diagnostic push) |
407 |
|
|
PRAGMA45(GCC diagnostic ignored "-Wunused-result") |
408 |
|
|
|
409 |
|
|
int TestLauncher::testInternal() |
410 |
|
|
{ |
411 |
|
|
timeval start; |
412 |
|
|
timeval end; |
413 |
|
|
|
414 |
|
|
Wallpaper::loadWallpapers(); |
415 |
|
|
Wallpaper::getWallpaper(800, 600); |
416 |
|
|
Image *img[4]; |
417 |
|
|
|
418 |
|
|
img[0] = Theme::getImageFromTheme( |
419 |
|
|
"graphics/sprites/manaplus_emotions.png"); |
420 |
|
|
img[1] = Theme::getImageFromTheme( |
421 |
|
|
"graphics/sprites/manaplus_emotions.png"); |
422 |
|
|
img[2] = Theme::getImageFromTheme("graphics/sprites/arrow_left.png"); |
423 |
|
|
img[3] = Theme::getImageFromTheme("graphics/sprites/arrow_right.png"); |
424 |
|
|
int idx = 0; |
425 |
|
|
const int mem = mainGraphics->getMemoryUsage(); |
426 |
|
|
|
427 |
|
|
// int cnt = 5; |
428 |
|
|
const int cnt = 5000; |
429 |
|
|
|
430 |
|
|
gettimeofday(&start, nullptr); |
431 |
|
|
for (int k = 0; k < cnt; k ++) |
432 |
|
|
{ |
433 |
|
|
for (int x = 0; x < 800; x += 20) |
434 |
|
|
{ |
435 |
|
|
for (int y = 0; y < 600; y += 25) |
436 |
|
|
{ |
437 |
|
|
mainGraphics->drawImage(img[idx], x, y); |
438 |
|
|
mainGraphics->drawImage(img[idx], x + 1, y); |
439 |
|
|
mainGraphics->drawImage(img[idx], x, y + 5); |
440 |
|
|
|
441 |
|
|
idx ++; |
442 |
|
|
if (idx > 3) |
443 |
|
|
idx = 0; |
444 |
|
|
} |
445 |
|
|
} |
446 |
|
|
mainGraphics->updateScreen(); |
447 |
|
|
} |
448 |
|
|
|
449 |
|
|
gettimeofday(&end, nullptr); |
450 |
|
|
const int tFps = calcFps(start, end, cnt); |
451 |
|
|
file << mTest << std::endl; |
452 |
|
|
file << tFps << std::endl; |
453 |
|
|
file << mem << std::endl; |
454 |
|
|
|
455 |
|
|
sleep(1); |
456 |
|
|
return 0; |
457 |
|
|
} |
458 |
|
|
|
459 |
|
|
PRAGMA45(GCC diagnostic pop) |
460 |
|
|
|
461 |
|
|
int TestLauncher::testDye() |
462 |
|
|
{ |
463 |
|
|
SDL_RWops *rw = VirtFs::rwopsOpenRead( |
464 |
|
|
"graphics/sprites/arrow_up.png"); |
465 |
|
|
Dye *d = nullptr; |
466 |
|
|
|
467 |
|
|
if (rw != nullptr) |
468 |
|
|
{ |
469 |
|
|
Image *image = d != nullptr ? surfaceImageHelper->load(rw, *d) |
470 |
|
|
: surfaceImageHelper->load(rw); |
471 |
|
|
if (image != nullptr) |
472 |
|
|
{ |
473 |
|
|
const SDL_Rect &rect = image->mBounds; |
474 |
|
|
SDL_Surface *surface = surfaceImageHelper->create32BitSurface( |
475 |
|
|
rect.w, rect.h); |
476 |
|
|
if (surface != nullptr) |
477 |
|
|
{ |
478 |
|
|
SurfaceImageHelper::combineSurface(image->mSDLSurface, nullptr, |
479 |
|
|
surface, nullptr); |
480 |
|
|
PngLib::writePNG(image->mSDLSurface, |
481 |
|
|
settings.tempDir + "/testimage1.png"); |
482 |
|
|
PngLib::writePNG(surface, |
483 |
|
|
settings.tempDir + "/testimage2.png"); |
484 |
|
|
} |
485 |
|
|
|
486 |
|
|
rw = VirtFs::rwopsOpenRead( |
487 |
|
|
"graphics/sprites/arrow_up.png"); |
488 |
|
|
d = new Dye("S:#0000ff,00ff00,5c5cff,ff0000"); |
489 |
|
|
image = surfaceImageHelper->load(rw, *d); |
490 |
|
|
if (image != nullptr) |
491 |
|
|
{ |
492 |
|
|
surface = surfaceImageHelper->create32BitSurface( |
493 |
|
|
rect.w, rect.h); |
494 |
|
|
if (surface != nullptr) |
495 |
|
|
{ |
496 |
|
|
SurfaceImageHelper::combineSurface(image->mSDLSurface, |
497 |
|
|
nullptr, surface, nullptr); |
498 |
|
|
PngLib::writePNG(image->mSDLSurface, |
499 |
|
|
settings.tempDir + "/testimage3.png"); |
500 |
|
|
PngLib::writePNG(surface, |
501 |
|
|
settings.tempDir + "/testimage4.png"); |
502 |
|
|
} |
503 |
|
|
} |
504 |
|
|
} |
505 |
|
|
} |
506 |
|
|
return 0; |
507 |
|
|
} |
508 |
|
|
|
509 |
|
|
#if defined __linux__ || defined __linux |
510 |
|
|
#if defined(SIMD_SUPPORTED) || (SDL_BYTEORDER == SDL_LIL_ENDIAN \ |
511 |
|
|
&& !defined(USE_SDL2)) |
512 |
|
|
static void calcTime(const char *const msg1, |
513 |
|
|
const char *const msg2, |
514 |
|
|
const timespec &time1, |
515 |
|
|
timespec &time2, |
516 |
|
|
const uint32_t *const buf) |
517 |
|
|
{ |
518 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time2); |
519 |
|
|
long diff = ((static_cast<long int>(time2.tv_sec) * 1000000000L |
520 |
|
|
+ static_cast<long int>(time2.tv_nsec)) / 1) - |
521 |
|
|
((static_cast<long int>(time1.tv_sec) * 1000000000L |
522 |
|
|
+ static_cast<long int>(time1.tv_nsec)) / 1); |
523 |
|
|
printf("%s: %u\n", msg1, buf[0]); |
524 |
|
|
printf("%s: %011ld\n", msg2, diff); |
525 |
|
|
} |
526 |
|
|
#endif // defined(SIMD_SUPPORTED) || (SDL_BYTEORDER == SDL_LIL_ENDIAN |
527 |
|
|
|
528 |
|
|
#ifdef SIMD_SUPPORTED |
529 |
|
|
static void initBuffer(uint32_t *const buf, |
530 |
|
|
const int sz) |
531 |
|
|
{ |
532 |
|
|
for (int f = 0; f < sz; f ++) |
533 |
|
|
buf[f] = f; |
534 |
|
|
} |
535 |
|
|
|
536 |
|
|
#define runDyeTest(msg1, msg2, func) \ |
537 |
|
|
initBuffer(buf, sz); \ |
538 |
|
|
pal.func(buf, sz); \ |
539 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time1); \ |
540 |
|
|
for (int f = 0; f < 50000; f ++) \ |
541 |
|
|
pal.func(buf, sz); \ |
542 |
|
|
calcTime(msg1, \ |
543 |
|
|
msg2, \ |
544 |
|
|
time1, \ |
545 |
|
|
time2, \ |
546 |
|
|
buf) |
547 |
|
|
#endif // SIMD_SUPPORTED |
548 |
|
|
#endif // defined __linux__ || defined __linux |
549 |
|
|
|
550 |
|
|
int TestLauncher::testDyeSSpeed() |
551 |
|
|
{ |
552 |
|
|
#if defined __linux__ || defined __linux |
553 |
|
|
#ifdef SIMD_SUPPORTED |
554 |
|
|
const int sz = 100000; |
555 |
|
|
uint32_t buf[sz]; |
556 |
|
|
timespec time1; |
557 |
|
|
timespec time2; |
558 |
|
|
|
559 |
|
|
DyePalette pal("#0000ff,000000,000020,706050", 6); |
560 |
|
|
|
561 |
|
|
runDyeTest("dye s salt", "default time", replaceSColorDefault); |
562 |
|
|
runDyeTest("dye s salt", "sse2 time ", replaceSColorSse2); |
563 |
|
|
runDyeTest("dye s salt", "avx2 time ", replaceSColorAvx2); |
564 |
|
|
#endif // SIMD_SUPPORTED |
565 |
|
|
#endif // defined __linux__ || defined __linux |
566 |
|
|
return 0; |
567 |
|
|
} |
568 |
|
|
|
569 |
|
|
int TestLauncher::testDyeASpeed() |
570 |
|
|
{ |
571 |
|
|
#if defined __linux__ || defined __linux |
572 |
|
|
#ifdef SIMD_SUPPORTED |
573 |
|
|
const int sz = 100000; |
574 |
|
|
uint32_t buf[sz]; |
575 |
|
|
timespec time1; |
576 |
|
|
timespec time2; |
577 |
|
|
|
578 |
|
|
DyePalette pal("#0000ffff,00000000,000020ff,70605040", 8); |
579 |
|
|
|
580 |
|
|
runDyeTest("dye a salt", "default time", replaceAColorDefault); |
581 |
|
|
runDyeTest("dye a salt", "sse2 time ", replaceAColorSse2); |
582 |
|
|
runDyeTest("dye a salt", "avx2 time ", replaceAColorAvx2); |
583 |
|
|
#endif // SIMD_SUPPORTED |
584 |
|
|
#endif // defined __linux__ || defined __linux |
585 |
|
|
return 0; |
586 |
|
|
} |
587 |
|
|
|
588 |
|
|
int TestLauncher::testBlitSpeed() |
589 |
|
|
{ |
590 |
|
|
#if defined __linux__ || defined __linux |
591 |
|
|
#if SDL_BYTEORDER == SDL_LIL_ENDIAN |
592 |
|
|
#ifndef USE_SDL2 |
593 |
|
|
|
594 |
|
|
timespec time1; |
595 |
|
|
timespec time2; |
596 |
|
|
const int cnt1 = 10000; |
597 |
|
|
const int cnt2 = 10; |
598 |
|
|
|
599 |
|
|
SDL_Surface *const srcSurface = imageHelper->create32BitSurface( |
600 |
|
|
64, 64); |
601 |
|
|
SDL_Surface *const dstSurface = imageHelper->create32BitSurface( |
602 |
|
|
512, 512); |
603 |
|
|
for (int f = 0; f < 64 * 64; f ++) |
604 |
|
|
static_cast<uint32_t*>(srcSurface->pixels)[f] = 0x11223344; |
605 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time1); |
606 |
|
|
for (int d = 0; d < cnt2; d ++) |
607 |
|
|
{ |
608 |
|
|
for (int f = 0; f < 512 * 512; f ++) |
609 |
|
|
static_cast<uint32_t*>(dstSurface->pixels)[f] = 0x55667788; |
610 |
|
|
for (int f = 0; f < cnt1; f ++) |
611 |
|
|
{ |
612 |
|
|
SDLgfxBlitRGBA(srcSurface, |
613 |
|
|
nullptr, |
614 |
|
|
dstSurface, |
615 |
|
|
nullptr); |
616 |
|
|
} |
617 |
|
|
} |
618 |
|
|
calcTime("blit test", |
619 |
|
|
"custom time", |
620 |
|
|
time1, |
621 |
|
|
time2, |
622 |
|
|
static_cast<uint32_t*>(dstSurface->pixels)); |
623 |
|
|
|
624 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time1); |
625 |
|
|
for (int d = 0; d < cnt2; d ++) |
626 |
|
|
{ |
627 |
|
|
for (int f = 0; f < 512 * 512; f ++) |
628 |
|
|
static_cast<uint32_t*>(dstSurface->pixels)[f] = 0x55667788; |
629 |
|
|
for (int f = 0; f < cnt1; f ++) |
630 |
|
|
{ |
631 |
|
|
SDL_gfxBlitRGBA(srcSurface, |
632 |
|
|
nullptr, |
633 |
|
|
dstSurface, |
634 |
|
|
nullptr); |
635 |
|
|
} |
636 |
|
|
} |
637 |
|
|
calcTime("blit test", |
638 |
|
|
"SDL_gfx time", |
639 |
|
|
time1, |
640 |
|
|
time2, |
641 |
|
|
static_cast<uint32_t*>(dstSurface->pixels)); |
642 |
|
|
|
643 |
|
|
#endif // USE_SDL2 |
644 |
|
|
#endif // SDL_BYTEORDER == SDL_LIL_ENDIAN |
645 |
|
|
#endif // defined __linux__ || defined __linux |
646 |
|
|
return 0; |
647 |
|
|
} |
648 |
|
|
|
649 |
|
|
int TestLauncher::testStackSpeed() |
650 |
|
|
{ |
651 |
|
|
/* |
652 |
|
|
const int sz = 100000; |
653 |
|
|
const int k = 100; |
654 |
|
|
const int sz2 = sz * k; |
655 |
|
|
|
656 |
|
|
std::stack<ClipRect> stack1; |
657 |
|
|
MStack<ClipRect> stack2(sz2); |
658 |
|
|
timespec time1; |
659 |
|
|
timespec time2; |
660 |
|
|
|
661 |
|
|
#if defined __linux__ || defined __linux |
662 |
|
|
for (int d = 0; d < 100; d ++) |
663 |
|
|
{ |
664 |
|
|
for (int f = 0; f < sz; f ++) |
665 |
|
|
{ |
666 |
|
|
ClipRect rect; |
667 |
|
|
rect.xOffset = f; |
668 |
|
|
rect.yOffset = f; |
669 |
|
|
stack1.push(rect); |
670 |
|
|
} |
671 |
|
|
} |
672 |
|
|
while (!stack1.empty()) |
673 |
|
|
stack1.pop(); |
674 |
|
|
|
675 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time1); |
676 |
|
|
|
677 |
|
|
for (int d = 0; d < 100; d ++) |
678 |
|
|
{ |
679 |
|
|
for (int f = 0; f < sz; f ++) |
680 |
|
|
{ |
681 |
|
|
ClipRect rect; |
682 |
|
|
rect.xOffset = f; |
683 |
|
|
rect.yOffset = f; |
684 |
|
|
stack1.push(rect); |
685 |
|
|
} |
686 |
|
|
} |
687 |
|
|
|
688 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time2); |
689 |
|
|
long diff = ((static_cast<long int>(time2.tv_sec) * 1000000000L |
690 |
|
|
+ static_cast<long int>(time2.tv_nsec)) / 1) - |
691 |
|
|
((static_cast<long int>(time1.tv_sec) * 1000000000L |
692 |
|
|
+ static_cast<long int>(time1.tv_nsec)) / 1); |
693 |
|
|
printf("debug: %d\n", stack1.top().xOffset); |
694 |
|
|
printf("stl time: %ld\n", diff); |
695 |
|
|
|
696 |
|
|
for (int d = 0; d < 100; d ++) |
697 |
|
|
{ |
698 |
|
|
for (int f = 0; f < sz; f ++) |
699 |
|
|
{ |
700 |
|
|
ClipRect &rect = stack2.push(); |
701 |
|
|
rect.xOffset = f; |
702 |
|
|
rect.yOffset = f; |
703 |
|
|
} |
704 |
|
|
} |
705 |
|
|
stack2.clear(); |
706 |
|
|
|
707 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time1); |
708 |
|
|
|
709 |
|
|
for (int d = 0; d < 100; d ++) |
710 |
|
|
{ |
711 |
|
|
for (int f = 0; f < sz; f ++) |
712 |
|
|
{ |
713 |
|
|
ClipRect &rect = stack2.push(); |
714 |
|
|
rect.xOffset = f; |
715 |
|
|
rect.yOffset = f; |
716 |
|
|
} |
717 |
|
|
} |
718 |
|
|
|
719 |
|
|
clock_gettime(CLOCK_MONOTONIC, &time2); |
720 |
|
|
diff = ((static_cast<long int>(time2.tv_sec) * 1000000000L |
721 |
|
|
+ static_cast<long int>(time2.tv_nsec)) / 1) - |
722 |
|
|
((static_cast<long int>(time1.tv_sec) * 1000000000L |
723 |
|
|
+ static_cast<long int>(time1.tv_nsec)) / 1); |
724 |
|
|
printf("debug: %d\n", stack2.top().xOffset); |
725 |
|
|
printf("my time: %ld\n", diff); |
726 |
|
|
|
727 |
|
|
#endif |
728 |
|
|
*/ |
729 |
|
|
return 0; |
730 |
|
|
} |
731 |
|
|
|
732 |
|
|
int TestLauncher::testDraw() |
733 |
|
|
{ |
734 |
|
|
Image *img[3]; |
735 |
|
|
img[0] = Theme::getImageFromTheme("graphics/sprites/arrow_left.png"); |
736 |
|
|
img[1] = Theme::getImageFromTheme("graphics/sprites/arrow_right.png"); |
737 |
|
|
img[2] = Theme::getImageFromTheme("graphics/sprites/arrow_up.png"); |
738 |
|
|
Skin *skin = theme->load("button.xml", |
739 |
|
|
"button.xml", |
740 |
|
|
true, |
741 |
|
|
Theme::getThemePath()); |
742 |
|
|
if (skin == nullptr) |
743 |
|
|
return 0; |
744 |
|
|
|
745 |
|
|
ImageCollection *const col = new ImageCollection; |
746 |
|
|
ImageCollection *const col2 = new ImageCollection; |
747 |
|
|
ImageVertexes *const vert = new ImageVertexes; |
748 |
|
|
vert->image = img[2]; |
749 |
|
|
|
750 |
|
|
mainGraphics->pushClipArea(Rect(10, 20, 790, 580)); |
751 |
|
|
mainGraphics->setColor(Color(0xFFU, 0xFFU, 0x00U, 0xFFU)); |
752 |
|
|
mainGraphics->drawRectangle(Rect(0, 0, 400, 200)); |
753 |
|
|
|
754 |
|
|
mainGraphics->setColor(Color(0xFFU, 0x00U, 0x00U, 0xB0U)); |
755 |
|
|
img[0]->setAlpha(0.5F); |
756 |
|
|
mainGraphics->drawImage(img[0], 190, 383); |
757 |
|
|
img[0]->setAlpha(1.0F); |
758 |
|
|
|
759 |
|
|
mainGraphics->calcWindow(col2, |
760 |
|
|
5, 40, |
761 |
|
|
500, 40, |
762 |
|
|
skin->getBorder()); |
763 |
|
|
mainGraphics->finalize(col2); |
764 |
|
|
|
765 |
|
|
mainGraphics->calcTileVertexes(vert, img[2], 10, 10); |
766 |
|
|
mainGraphics->calcTileVertexes(vert, img[2], 40, 10); |
767 |
|
|
mainGraphics->finalize(vert); |
768 |
|
|
|
769 |
|
|
mainGraphics->setColor(Color(0x80U, 0x00U, 0xA0U, 0x90U)); |
770 |
|
|
mainGraphics->fillRectangle(Rect(200, 100, 300, 300)); |
771 |
|
|
mainGraphics->popClipArea(); |
772 |
|
|
|
773 |
|
|
Color color(0xFFU, 0x00U, 0x00U, 0xB0U); |
774 |
|
|
Color color2(0x00U, 0xFFU, 0x00U, 0xB0U); |
775 |
|
|
boldFont->drawString(mainGraphics, |
776 |
|
|
color, color2, |
777 |
|
|
"test test test test test test test test ", 300, 100); |
778 |
|
|
|
779 |
|
|
mainGraphics->drawTileCollection(col2); |
780 |
|
|
|
781 |
|
|
mainGraphics->drawPattern(img[0], 10, 400, 300, 180); |
782 |
|
|
|
783 |
|
|
mainGraphics->calcPattern(col, img[1], 500, 400, 150, 100); |
784 |
|
|
mainGraphics->finalize(col); |
785 |
|
|
|
786 |
|
|
mainGraphics->drawTileVertexes(vert); |
787 |
|
|
|
788 |
|
|
mainGraphics->drawRescaledImage(img[0], 250, 350, 35, 90); |
789 |
|
|
|
790 |
|
|
mainGraphics->setColor(Color(0x00U, 0xFFU, 0x00U, 0x90U)); |
791 |
|
|
mainGraphics->drawNet(450, 10, 600, 300, 32, 20); |
792 |
|
|
|
793 |
|
|
mainGraphics->drawTileCollection(col); |
794 |
|
|
|
795 |
|
|
img[0]->setAlpha(0.3F); |
796 |
|
|
mainGraphics->drawRescaledPattern(img[0], 250, 150, 250, 300, 30, 100); |
797 |
|
|
|
798 |
|
|
for (int f = 0; f < 255; f ++) |
799 |
|
|
{ |
800 |
|
|
mainGraphics->setColor(Color(0x20U, 0x60U, f, 0x90U)); |
801 |
|
|
mainGraphics->drawLine(300 + f, 490, 300 + f, 480); |
802 |
|
|
for (int d = 0; d < 10; d ++) |
803 |
|
|
mainGraphics->drawPoint(300 + f, 500 + d); |
804 |
|
|
} |
805 |
|
|
mainGraphics->updateScreen(); |
806 |
|
|
sleep(10); |
807 |
|
|
|
808 |
|
|
delete col; |
809 |
|
|
delete col2; |
810 |
|
|
delete vert; |
811 |
|
|
return 0; |
812 |
|
|
} |
813 |
|
|
|
814 |
|
|
int TestLauncher::testVideoDetection() |
815 |
|
|
{ |
816 |
|
|
file << mTest << std::endl; |
817 |
|
|
file << graphicsManager.detectGraphics() << std::endl; |
818 |
|
|
return 0; |
819 |
|
|
} |
820 |
|
|
|
821 |
|
|
int TestLauncher::calcFps(const timeval &start, |
822 |
|
|
const timeval &end, |
823 |
|
|
const int calls) const |
824 |
|
|
{ |
825 |
|
|
long mtime; |
826 |
|
|
long seconds; |
827 |
|
|
long useconds; |
828 |
|
|
|
829 |
|
|
seconds = end.tv_sec - start.tv_sec; |
830 |
|
|
useconds = end.tv_usec - start.tv_usec; |
831 |
|
|
|
832 |
|
|
mtime = (seconds * 1000 + useconds / 1000.0) + 0.5; |
833 |
|
|
if (mtime == 0) |
834 |
|
|
return 100000; |
835 |
|
|
|
836 |
|
|
return CAST_S32(static_cast<long>(calls) * 10000 / mtime); |
837 |
|
|
} |
838 |
|
|
|
839 |
|
|
#endif // USE_OPENGL |