flags.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "tigr.h"
  2. Tigr* makeDemoWindow(int w, int h, int flags) {
  3. return tigrWindow(w, h, "Flag tester", flags);
  4. }
  5. void drawDemoWindow(Tigr* win) {
  6. TPixel lineColor = tigrRGB(100, 100, 100);
  7. tigrLine(win, 0, 0, win->w - 1, win->h - 1, lineColor);
  8. tigrLine(win, 0, win->h - 1, win->w - 1, 0, lineColor);
  9. tigrRect(win, 0, 0, win->w, win->h, tigrRGB(200, 10, 10));
  10. tigrPrint(win, tfont, 5, 5, tigrRGB(20, 200, 0), "%dx%d", win->w, win->h);
  11. }
  12. typedef struct Toggle {
  13. const char* text;
  14. int checked;
  15. int value;
  16. int key;
  17. TPixel color;
  18. } Toggle;
  19. void drawToggle(Tigr* bmp, Toggle* toggle, int x, int y, int stride) {
  20. int height = tigrTextHeight(tfont, toggle->text);
  21. int width = tigrTextWidth(tfont, toggle->text);
  22. int yOffset = stride / 2;
  23. int xOffset = width / -2;
  24. tigrPrint(bmp, tfont, x + xOffset, y + yOffset, toggle->color, toggle->text);
  25. yOffset += toggle->checked ? height : height / 3;
  26. TPixel lineColor = toggle->color;
  27. lineColor.a = 240;
  28. tigrLine(bmp, x + xOffset, y + yOffset, x + xOffset + width, y + yOffset, lineColor);
  29. }
  30. int main(int argc, char* argv[]) {
  31. int flags = 0;
  32. int initialW = 400;
  33. int initialH = 400;
  34. Tigr* win = makeDemoWindow(initialW, initialH, flags);
  35. TPixel white = tigrRGB(255, 255, 255);
  36. TPixel yellow = tigrRGB(255, 255, 0);
  37. TPixel black = tigrRGB(0, 0, 0);
  38. Toggle toggles[] = {
  39. //
  40. { "(A)UTO", 0, TIGR_AUTO, 'A', white },
  41. { "(R)ETINA", 0, TIGR_RETINA, 'R', white },
  42. { "(F)ULLSCREEN", 0, TIGR_FULLSCREEN, 'F', white },
  43. { "(2)X", 0, TIGR_2X, '2', yellow },
  44. { "(3)X", 0, TIGR_3X, '3', yellow },
  45. { "(4)X", 0, TIGR_4X, '4', yellow },
  46. { "(N)OCURSOR", 0, TIGR_NOCURSOR, 'N', white },
  47. };
  48. while (!tigrClosed(win) && !tigrKeyDown(win, TK_ESCAPE)) {
  49. tigrClear(win, black);
  50. drawDemoWindow(win);
  51. int numToggles = sizeof(toggles) / sizeof(*toggles);
  52. int stepY = win->h / numToggles;
  53. int toggleY = 0;
  54. int toggleX = win->w / 2;
  55. {
  56. int newFlags = 0;
  57. for (int i = 0; i < numToggles; i++, toggleY += stepY) {
  58. Toggle* toggle = toggles + i;
  59. if (tigrKeyDown(win, toggle->key)) {
  60. toggle->checked ^= 1;
  61. }
  62. newFlags += toggle->checked * toggle->value;
  63. drawToggle(win, toggle, toggleX, toggleY, stepY);
  64. }
  65. if (flags != newFlags) {
  66. int modeFlags = TIGR_AUTO | TIGR_RETINA;
  67. int modeChange = (flags & modeFlags) != (newFlags & modeFlags);
  68. flags = newFlags;
  69. int w = modeChange ? initialW : win->w;
  70. int h = modeChange ? initialH : win->h;
  71. tigrFree(win);
  72. win = makeDemoWindow(w, h, flags);
  73. }
  74. }
  75. tigrUpdate(win);
  76. }
  77. tigrFree(win);
  78. return 0;
  79. }