Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

812 lines
21 KiB

  1. /**************************************************************************\
  2. *
  3. * Copyright (c) 2000 Microsoft Corporation
  4. *
  5. * Module Name:
  6. *
  7. * perfimage.cpp
  8. *
  9. * Abstract:
  10. *
  11. * Contains all the tests for any routines that do imaging functionality.
  12. *
  13. \**************************************************************************/
  14. #include "perftest.h"
  15. float Image_Draw_PerPixel_Identity_NoDestinationRectangle(Graphics *g, HDC hdc)
  16. {
  17. UINT iterations;
  18. float seconds;
  19. if (!g) return(0); // There is no GDI equivalent
  20. Bitmap source(L"winnt256.bmp");
  21. Bitmap bitmap(512, 512, g);
  22. Graphics gBitmap(&bitmap);
  23. gBitmap.DrawImage(&source, 0, 0, 512, 512);
  24. StartTimer();
  25. do {
  26. g->DrawImage(&bitmap, 0, 0);
  27. } while (!EndTimer());
  28. g->Flush(FlushIntentionSync);
  29. GetTimer(&seconds, &iterations);
  30. UINT pixels = 512 * 512 * iterations;
  31. return(pixels / seconds / MEGA); // Mega-pixels per second
  32. }
  33. float Image_Draw_PerPixel_Identity(Graphics *g, HDC hdc)
  34. {
  35. UINT iterations;
  36. float seconds;
  37. if (!g) return(0); // There is no GDI equivalent
  38. Bitmap source(L"winnt256.bmp");
  39. Bitmap bitmap(512, 512, g);
  40. Graphics gBitmap(&bitmap);
  41. gBitmap.DrawImage(&source, 0, 0, 512, 512);
  42. StartTimer();
  43. do {
  44. g->DrawImage(&bitmap, 0, 0, 512, 512);
  45. } while (!EndTimer());
  46. g->Flush(FlushIntentionSync);
  47. GetTimer(&seconds, &iterations);
  48. UINT pixels = 512 * 512 * iterations;
  49. return(pixels / seconds / MEGA); // Mega-pixels per second
  50. }
  51. float Image_Draw_PerCall_Identity(Graphics *g, HDC hdc)
  52. {
  53. UINT iterations;
  54. float seconds;
  55. if (!g) return(0); // There is no GDI equivalent
  56. Bitmap source(L"winnt256.bmp");
  57. Bitmap bitmap(1, 1, g);
  58. Graphics gBitmap(&bitmap);
  59. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  60. StartTimer();
  61. do {
  62. g->DrawImage(&bitmap, 0, 0, 1, 1);
  63. } while (!EndTimer());
  64. g->Flush(FlushIntentionSync);
  65. GetTimer(&seconds, &iterations);
  66. return(iterations / seconds / KILO); // Kilo-calls per second
  67. }
  68. float Image_Draw_PerPixel_CachedBitmap(Graphics *g, HDC hdc)
  69. {
  70. UINT iterations;
  71. float seconds;
  72. if (!g) return(0); // There is no GDI equivalent
  73. Bitmap source(L"winnt256.bmp");
  74. Bitmap bitmap(512, 512, g);
  75. Graphics gBitmap(&bitmap);
  76. gBitmap.DrawImage(&source, 0, 0, 512, 512);
  77. CachedBitmap *cb = new CachedBitmap(&bitmap, g);
  78. StartTimer();
  79. do {
  80. g->DrawCachedBitmap(cb, 0, 0);
  81. } while (!EndTimer());
  82. g->Flush(FlushIntentionSync);
  83. GetTimer(&seconds, &iterations);
  84. UINT pixels = 512 * 512 * iterations;
  85. delete cb;
  86. return(pixels / seconds / MEGA); // Mega-pixels per second
  87. }
  88. float Image_Draw_PerCall_CachedBitmap(Graphics *g, HDC hdc)
  89. {
  90. UINT iterations;
  91. float seconds;
  92. if (!g) return(0); // There is no GDI equivalent
  93. Bitmap source(L"winnt256.bmp");
  94. Bitmap bitmap(1, 1, g);
  95. Graphics gBitmap(&bitmap);
  96. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  97. CachedBitmap *cb = new CachedBitmap(&bitmap, g);
  98. StartTimer();
  99. do {
  100. g->DrawCachedBitmap(cb, 0, 0);
  101. } while (!EndTimer());
  102. g->Flush(FlushIntentionSync);
  103. GetTimer(&seconds, &iterations);
  104. delete cb;
  105. return(iterations / seconds / KILO); // Kilo-calls per second
  106. }
  107. float Image_Draw_PerPixel_HighQualityBilinear_Scaled(Graphics *g, HDC hdc)
  108. {
  109. UINT iterations;
  110. float seconds;
  111. if (!g) return(0); // There is no GDI equivalent
  112. g->SetInterpolationMode(InterpolationModeHighQualityBilinear);
  113. Bitmap source(L"winnt256.bmp");
  114. Bitmap bitmap(256, 256, g);
  115. Graphics gBitmap(&bitmap);
  116. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  117. StartTimer();
  118. do {
  119. g->DrawImage(&bitmap, 0, 0, 512, 512);
  120. } while (!EndTimer());
  121. g->Flush(FlushIntentionSync);
  122. GetTimer(&seconds, &iterations);
  123. UINT pixels = 512 * 512 * iterations;
  124. return(pixels / seconds / MEGA); // Mega-pixels per second
  125. }
  126. float Image_Draw_PerCall_HighQualityBilinear_Scaled(Graphics *g, HDC hdc)
  127. {
  128. UINT iterations;
  129. float seconds;
  130. if (!g) return(0); // There is no GDI equivalent
  131. g->SetInterpolationMode(InterpolationModeHighQualityBilinear);
  132. Bitmap source(L"winnt256.bmp");
  133. Bitmap bitmap(256, 256, g);
  134. Graphics gBitmap(&bitmap);
  135. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  136. StartTimer();
  137. do {
  138. g->DrawImage(&bitmap, 0, 0, 1, 1);
  139. } while (!EndTimer());
  140. g->Flush(FlushIntentionSync);
  141. GetTimer(&seconds, &iterations);
  142. return(iterations / seconds / KILO); // Kilo-calls per second
  143. }
  144. float Image_Draw_PerPixel_HighQualityBicubic_Scaled(Graphics *g, HDC hdc)
  145. {
  146. UINT iterations;
  147. float seconds;
  148. if (!g) return(0); // There is no GDI equivalent
  149. g->SetInterpolationMode(InterpolationModeHighQualityBicubic);
  150. Bitmap source(L"winnt256.bmp");
  151. Bitmap bitmap(256, 256, g);
  152. Graphics gBitmap(&bitmap);
  153. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  154. StartTimer();
  155. do {
  156. g->DrawImage(&bitmap, 0, 0, 512, 512);
  157. } while (!EndTimer());
  158. g->Flush(FlushIntentionSync);
  159. GetTimer(&seconds, &iterations);
  160. UINT pixels = 512 * 512 * iterations;
  161. return(pixels / seconds / MEGA); // Mega-pixels per second
  162. }
  163. float Image_Draw_PerCall_HighQualityBicubic_Scaled(Graphics *g, HDC hdc)
  164. {
  165. UINT iterations;
  166. float seconds;
  167. if (!g) return(0); // There is no GDI equivalent
  168. g->SetInterpolationMode(InterpolationModeHighQualityBicubic);
  169. Bitmap source(L"winnt256.bmp");
  170. Bitmap bitmap(256, 256, g);
  171. Graphics gBitmap(&bitmap);
  172. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  173. StartTimer();
  174. do {
  175. g->DrawImage(&bitmap, 0, 0, 1, 1);
  176. } while (!EndTimer());
  177. g->Flush(FlushIntentionSync);
  178. GetTimer(&seconds, &iterations);
  179. return(iterations / seconds / KILO); // Kilo-calls per second
  180. }
  181. float Image_Draw_PerPixel_Bilinear_Scaled(Graphics *g, HDC hdc)
  182. {
  183. UINT iterations;
  184. float seconds;
  185. if (!g) return(0); // There is no GDI equivalent
  186. g->SetInterpolationMode(InterpolationModeBilinear);
  187. Bitmap source(L"winnt256.bmp");
  188. Bitmap bitmap(256, 256, g);
  189. Graphics gBitmap(&bitmap);
  190. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  191. StartTimer();
  192. do {
  193. g->DrawImage(&bitmap, 0, 0, 512, 512);
  194. } while (!EndTimer());
  195. g->Flush(FlushIntentionSync);
  196. GetTimer(&seconds, &iterations);
  197. UINT pixels = 512 * 512 * iterations;
  198. return(pixels / seconds / MEGA); // Mega-pixels per second
  199. }
  200. float Image_Draw_PerCall_Bilinear_Scaled(Graphics *g, HDC hdc)
  201. {
  202. UINT iterations;
  203. float seconds;
  204. if (!g) return(0); // There is no GDI equivalent
  205. g->SetInterpolationMode(InterpolationModeBilinear);
  206. Bitmap source(L"winnt256.bmp");
  207. Bitmap bitmap(256, 256, g);
  208. Graphics gBitmap(&bitmap);
  209. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  210. StartTimer();
  211. do {
  212. g->DrawImage(&bitmap, 0, 0, 1, 1);
  213. } while (!EndTimer());
  214. g->Flush(FlushIntentionSync);
  215. GetTimer(&seconds, &iterations);
  216. return(iterations / seconds / KILO); // Kilo-calls per second
  217. }
  218. float Image_Draw_PerPixel_Bilinear_Rotated(Graphics *g, HDC hdc)
  219. {
  220. UINT iterations;
  221. float seconds;
  222. if (!g) return(0); // There is no GDI equivalent
  223. g->SetInterpolationMode(InterpolationModeBilinear);
  224. g->RotateTransform(0.2f);
  225. Bitmap source(L"winnt256.bmp");
  226. Bitmap bitmap(512, 512, g);
  227. Graphics gBitmap(&bitmap);
  228. gBitmap.DrawImage(&source, 0, 0, 512, 512);
  229. StartTimer();
  230. do {
  231. g->DrawImage(&bitmap, 10, 10);
  232. } while (!EndTimer());
  233. g->Flush(FlushIntentionSync);
  234. GetTimer(&seconds, &iterations);
  235. UINT pixels = 512 * 512 * iterations;
  236. return(pixels / seconds / MEGA); // Mega-pixels per second
  237. }
  238. float Image_Draw_PerCall_Bilinear_Rotated(Graphics *g, HDC hdc)
  239. {
  240. UINT iterations;
  241. float seconds;
  242. if (!g) return(0); // There is no GDI equivalent
  243. g->SetInterpolationMode(InterpolationModeBilinear);
  244. g->RotateTransform(0.2f);
  245. Bitmap source(L"winnt256.bmp");
  246. Bitmap bitmap(1, 1, g);
  247. Graphics gBitmap(&bitmap);
  248. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  249. StartTimer();
  250. do {
  251. g->DrawImage(&bitmap, 10, 10, 1, 1);
  252. } while (!EndTimer());
  253. g->Flush(FlushIntentionSync);
  254. GetTimer(&seconds, &iterations);
  255. return(iterations / seconds / KILO); // Kilo-calls per second
  256. }
  257. float Image_Draw_PerPixel_Bicubic_Scaled(Graphics *g, HDC hdc)
  258. {
  259. UINT iterations;
  260. float seconds;
  261. if (!g) return(0); // There is no GDI equivalent
  262. g->SetInterpolationMode(InterpolationModeBicubic);
  263. Bitmap source(L"winnt256.bmp");
  264. Bitmap bitmap(256, 256, g);
  265. Graphics gBitmap(&bitmap);
  266. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  267. StartTimer();
  268. do {
  269. g->DrawImage(&bitmap, 0, 0, 512, 512);
  270. } while (!EndTimer());
  271. g->Flush(FlushIntentionSync);
  272. GetTimer(&seconds, &iterations);
  273. UINT pixels = 512 * 512 * iterations;
  274. return(pixels / seconds / MEGA); // Mega-pixels per second
  275. }
  276. float Image_Draw_PerCall_Bicubic_Scaled(Graphics *g, HDC hdc)
  277. {
  278. UINT iterations;
  279. float seconds;
  280. if (!g) return(0); // There is no GDI equivalent
  281. g->SetInterpolationMode(InterpolationModeBicubic);
  282. Bitmap source(L"winnt256.bmp");
  283. Bitmap bitmap(1, 1, g);
  284. Graphics gBitmap(&bitmap);
  285. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  286. StartTimer();
  287. do {
  288. g->DrawImage(&bitmap, 0, 0, 1, 1);
  289. } while (!EndTimer());
  290. g->Flush(FlushIntentionSync);
  291. GetTimer(&seconds, &iterations);
  292. return(iterations / seconds / KILO); // Kilo-calls per second
  293. }
  294. float Image_Draw_PerPixel_Bicubic_Rotated(Graphics *g, HDC hdc)
  295. {
  296. UINT iterations;
  297. float seconds;
  298. if (!g) return(0); // There is no GDI equivalent
  299. g->SetInterpolationMode(InterpolationModeBicubic);
  300. g->RotateTransform(0.2f);
  301. Bitmap source(L"winnt256.bmp");
  302. Bitmap bitmap(512, 512, g);
  303. Graphics gBitmap(&bitmap);
  304. gBitmap.DrawImage(&source, 0, 0, 512, 512);
  305. StartTimer();
  306. do {
  307. g->DrawImage(&bitmap, 10, 10);
  308. } while (!EndTimer());
  309. g->Flush(FlushIntentionSync);
  310. GetTimer(&seconds, &iterations);
  311. UINT pixels = 512 * 512 * iterations;
  312. return(pixels / seconds / MEGA); // Mega-pixels per second
  313. }
  314. float Image_Draw_PerCall_Bicubic_Rotated(Graphics *g, HDC hdc)
  315. {
  316. UINT iterations;
  317. float seconds;
  318. if (!g) return(0); // There is no GDI equivalent
  319. g->SetInterpolationMode(InterpolationModeBicubic);
  320. g->RotateTransform(0.2f);
  321. Bitmap source(L"winnt256.bmp");
  322. Bitmap bitmap(1, 1, g);
  323. Graphics gBitmap(&bitmap);
  324. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  325. StartTimer();
  326. do {
  327. g->DrawImage(&bitmap, 10, 10, 1, 1);
  328. } while (!EndTimer());
  329. g->Flush(FlushIntentionSync);
  330. GetTimer(&seconds, &iterations);
  331. return(iterations / seconds / KILO); // Kilo-calls per second
  332. }
  333. // Nearest Neighbor routines
  334. float Image_Draw_PerPixel_NearestNeighbor_Scaled(Graphics *g, HDC hdc)
  335. {
  336. UINT iterations;
  337. float seconds;
  338. if (!g) return(0); // There is no GDI equivalent
  339. g->SetInterpolationMode(InterpolationModeNearestNeighbor);
  340. Bitmap source(L"winnt256.bmp");
  341. Bitmap bitmap(256, 256, g);
  342. Graphics gBitmap(&bitmap);
  343. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  344. StartTimer();
  345. do {
  346. g->DrawImage(&bitmap, 0, 0, 512, 512);
  347. } while (!EndTimer());
  348. g->Flush(FlushIntentionSync);
  349. GetTimer(&seconds, &iterations);
  350. UINT pixels = 512 * 512 * iterations;
  351. return(pixels / seconds / MEGA); // Mega-pixels per second
  352. }
  353. float Image_Draw_PerCall_NearestNeighbor_Scaled(Graphics *g, HDC hdc)
  354. {
  355. UINT iterations;
  356. float seconds;
  357. if (!g) return(0); // There is no GDI equivalent
  358. g->SetInterpolationMode(InterpolationModeNearestNeighbor);
  359. Bitmap source(L"winnt256.bmp");
  360. Bitmap bitmap(1, 1, g);
  361. Graphics gBitmap(&bitmap);
  362. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  363. StartTimer();
  364. do {
  365. g->DrawImage(&bitmap, 0, 0, 1, 1);
  366. } while (!EndTimer());
  367. g->Flush(FlushIntentionSync);
  368. GetTimer(&seconds, &iterations);
  369. return(iterations / seconds / KILO); // Kilo-calls per second
  370. }
  371. float Image_Draw_PerPixel_NearestNeighbor_Rotated(Graphics *g, HDC hdc)
  372. {
  373. UINT iterations;
  374. float seconds;
  375. if (!g) return(0); // There is no GDI equivalent
  376. g->SetInterpolationMode(InterpolationModeNearestNeighbor);
  377. g->RotateTransform(0.2f);
  378. Bitmap source(L"winnt256.bmp");
  379. Bitmap bitmap(512, 512, g);
  380. Graphics gBitmap(&bitmap);
  381. gBitmap.DrawImage(&source, 0, 0, 512, 512);
  382. StartTimer();
  383. do {
  384. g->DrawImage(&bitmap, 10, 10);
  385. } while (!EndTimer());
  386. g->Flush(FlushIntentionSync);
  387. GetTimer(&seconds, &iterations);
  388. UINT pixels = 512 * 512 * iterations;
  389. return(pixels / seconds / MEGA); // Mega-pixels per second
  390. }
  391. float Image_Draw_PerCall_NearestNeighbor_Rotated(Graphics *g, HDC hdc)
  392. {
  393. UINT iterations;
  394. float seconds;
  395. if (!g) return(0); // There is no GDI equivalent
  396. g->SetInterpolationMode(InterpolationModeNearestNeighbor);
  397. g->RotateTransform(0.2f);
  398. Bitmap source(L"winnt256.bmp");
  399. Bitmap bitmap(1, 1, g);
  400. Graphics gBitmap(&bitmap);
  401. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  402. StartTimer();
  403. do {
  404. g->DrawImage(&bitmap, 10, 10, 1, 1);
  405. } while (!EndTimer());
  406. g->Flush(FlushIntentionSync);
  407. GetTimer(&seconds, &iterations);
  408. return(iterations / seconds / KILO); // Kilo-calls per second
  409. }
  410. float Image_Draw_PerPixel_Identity_Recolored_Matrix(Graphics *g, HDC hdc)
  411. {
  412. UINT iterations;
  413. float seconds;
  414. if (!g) return(0); // There is no GDI equivalent
  415. Bitmap source(L"winnt256.bmp");
  416. Bitmap bitmap(512, 512, g);
  417. Graphics gBitmap(&bitmap);
  418. gBitmap.DrawImage(&source, 0, 0, 512, 512);
  419. StartTimer();
  420. do {
  421. ImageAttributes imageAttributes;
  422. ColorMatrix colorMatrix = { .25f, .25f, .25f, 0, 0,
  423. .25f, .25f, .25f, 0, 0,
  424. .25f, .25f, .25f, 0, 0,
  425. 0, 0, 0, 1, 0,
  426. .1f, .1f, .1f, 0, 1 }; // Gray it
  427. imageAttributes.SetColorMatrix(&colorMatrix);
  428. g->DrawImage(&bitmap, RectF(0, 0, 512, 512), 0, 0, 512, 512,
  429. UNITPIXEL, &imageAttributes);
  430. } while (!EndTimer());
  431. g->Flush(FlushIntentionSync);
  432. GetTimer(&seconds, &iterations);
  433. UINT pixels = 512 * 512 * iterations;
  434. return(pixels / seconds / MEGA); // Mega-pixels per second
  435. }
  436. float Image_Draw_PerCall_Identity_Recolored_Matrix(Graphics *g, HDC hdc)
  437. {
  438. UINT iterations;
  439. float seconds;
  440. if (!g) return(0); // There is no GDI equivalent
  441. Bitmap source(L"winnt256.bmp");
  442. Bitmap bitmap(1, 1, g);
  443. Graphics gBitmap(&bitmap);
  444. gBitmap.DrawImage(&source, 0, 0, 1, 1);
  445. StartTimer();
  446. do {
  447. ImageAttributes imageAttributes;
  448. ColorMatrix colorMatrix = { .25f, .25f, .25f, 0, 0,
  449. .25f, .25f, .25f, 0, 0,
  450. .25f, .25f, .25f, 0, 0,
  451. 0, 0, 0, 1, 0,
  452. .1f, .1f, .1f, 0, 1 }; // Gray it
  453. imageAttributes.SetColorMatrix(&colorMatrix);
  454. g->DrawImage(&bitmap, RectF(0, 0, 1, 1), 0, 0, 1, 1,
  455. UNITPIXEL, &imageAttributes);
  456. } while (!EndTimer());
  457. g->Flush(FlushIntentionSync);
  458. GetTimer(&seconds, &iterations);
  459. return(iterations / seconds / KILO);
  460. }
  461. float Image_Draw_PerPixel_Scaled_2x_Recolored_Matrix(Graphics *g, HDC hdc)
  462. {
  463. UINT iterations;
  464. float seconds;
  465. if (!g) return(0); // There is no GDI equivalent
  466. Bitmap source(L"winnt256.bmp");
  467. Bitmap bitmap(256, 256, g);
  468. Graphics gBitmap(&bitmap);
  469. gBitmap.DrawImage(&source, 0, 0, 256, 256);
  470. StartTimer();
  471. do {
  472. ImageAttributes imageAttributes;
  473. ColorMatrix colorMatrix = { .25f, .25f, .25f, 0, 0,
  474. .25f, .25f, .25f, 0, 0,
  475. .25f, .25f, .25f, 0, 0,
  476. 0, 0, 0, 1, 0,
  477. .1f, .1f, .1f, 0, 1 }; // Gray it
  478. imageAttributes.SetColorMatrix(&colorMatrix);
  479. g->DrawImage(&bitmap, RectF(0, 0, 512, 512), 0, 0, 256, 256,
  480. UNITPIXEL, &imageAttributes);
  481. } while (!EndTimer());
  482. g->Flush(FlushIntentionSync);
  483. GetTimer(&seconds, &iterations);
  484. UINT pixels = 512 * 512 * iterations;
  485. return(pixels / seconds / MEGA); // Mega-pixels per second
  486. }
  487. ////////////////////////////////////////////////////////////////////////////////
  488. // Add tests for this file here. Always use the 'T' macro for adding entries.
  489. // The parameter meanings are as follows:
  490. //
  491. // Parameter
  492. // ---------
  493. // 1 UniqueIdentifier - Must be a unique number assigned to no other test
  494. // 2 Priority - On a scale of 1 to 5, how important is the test?
  495. // 3 Function - Function name
  496. // 4 Comment - Anything to describe the test
  497. Test ImageTests[] =
  498. {
  499. T(2000, 1, Image_Draw_PerPixel_Identity , "Mpixels/s"),
  500. T(2001, 1, Image_Draw_PerCall_Identity , "Kcalls/s"),
  501. T(2002, 1, Image_Draw_PerPixel_Bilinear_Scaled , "Mpixels/s"),
  502. T(2003, 1, Image_Draw_PerCall_Bilinear_Scaled , "Kcalls/s"),
  503. T(2004, 1, Image_Draw_PerPixel_Bilinear_Rotated , "Mpixels/s"),
  504. T(2005, 1, Image_Draw_PerCall_Bilinear_Rotated , "Kcalls/s"),
  505. T(2006, 1, Image_Draw_PerPixel_Bicubic_Scaled , "Mpixels/s"),
  506. T(2007, 1, Image_Draw_PerCall_Bicubic_Scaled , "Kcalls/s"),
  507. T(2008, 1, Image_Draw_PerPixel_Bicubic_Rotated , "Mpixels/s"),
  508. T(2009, 1, Image_Draw_PerCall_Bicubic_Rotated , "Kcalls/s"),
  509. T(2010, 1, Image_Draw_PerPixel_Identity_NoDestinationRectangle , "Mpixels/s"),
  510. T(2011, 1, Image_Draw_PerPixel_Identity_Recolored_Matrix , "Mpixels/s"),
  511. T(2012, 1, Image_Draw_PerPixel_Scaled_2x_Recolored_Matrix , "Mpixels/s"),
  512. T(2013, 1, Image_Draw_PerCall_Identity_Recolored_Matrix , "Kcalls/s"),
  513. T(2014, 1, Image_Draw_PerPixel_NearestNeighbor_Scaled , "Mpixels/s"),
  514. T(2015, 1, Image_Draw_PerCall_NearestNeighbor_Scaled , "Kcalls/s"),
  515. T(2016, 1, Image_Draw_PerPixel_NearestNeighbor_Rotated , "Mpixels/s"),
  516. T(2017, 1, Image_Draw_PerCall_NearestNeighbor_Rotated , "Kcalls/s"),
  517. T(2018, 1, Image_Draw_PerPixel_HighQualityBilinear_Scaled , "Mpixels/s"),
  518. T(2019, 1, Image_Draw_PerCall_HighQualityBilinear_Scaled , "Kcalls/s"),
  519. T(2020, 1, Image_Draw_PerPixel_HighQualityBicubic_Scaled , "Mpixels/s"),
  520. T(2021, 1, Image_Draw_PerCall_HighQualityBicubic_Scaled , "Kcalls/s"),
  521. T(2022, 1, Image_Draw_PerPixel_CachedBitmap , "Mpixels/s"),
  522. T(2023, 1, Image_Draw_PerCall_CachedBitmap , "Kcalls/s"),
  523. };
  524. INT ImageTests_Count = sizeof(ImageTests) / sizeof(ImageTests[0]);