cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

testhittesting.c (4074B)


      1#include <stdio.h>
      2#include "SDL.h"
      3
      4/* !!! FIXME: rewrite this to be wired in to test framework. */
      5
      6#define RESIZE_BORDER 20
      7
      8const SDL_Rect drag_areas[] = {
      9    { 20, 20, 100, 100 },
     10    { 200, 70, 100, 100 },
     11    { 400, 90, 100, 100 }
     12};
     13
     14static const SDL_Rect *areas = drag_areas;
     15static int numareas = SDL_arraysize(drag_areas);
     16
     17static SDL_HitTestResult
     18hitTest(SDL_Window *window, const SDL_Point *pt, void *data)
     19{
     20    int i;
     21    int w, h;
     22
     23    for (i = 0; i < numareas; i++) {
     24        if (SDL_PointInRect(pt, &areas[i])) {
     25            SDL_Log("HIT-TEST: DRAGGABLE\n");
     26            return SDL_HITTEST_DRAGGABLE;
     27        }
     28    }
     29
     30    SDL_GetWindowSize(window, &w, &h);
     31
     32    #define REPORT_RESIZE_HIT(name) { \
     33        SDL_Log("HIT-TEST: RESIZE_" #name "\n"); \
     34        return SDL_HITTEST_RESIZE_##name; \
     35    }
     36
     37    if (pt->x < RESIZE_BORDER && pt->y < RESIZE_BORDER) {
     38        REPORT_RESIZE_HIT(TOPLEFT);
     39    } else if (pt->x > RESIZE_BORDER && pt->x < w - RESIZE_BORDER && pt->y < RESIZE_BORDER) {
     40        REPORT_RESIZE_HIT(TOP);
     41    } else if (pt->x > w - RESIZE_BORDER && pt->y < RESIZE_BORDER) {
     42        REPORT_RESIZE_HIT(TOPRIGHT);
     43    } else if (pt->x > w - RESIZE_BORDER && pt->y > RESIZE_BORDER && pt->y < h - RESIZE_BORDER) {
     44        REPORT_RESIZE_HIT(RIGHT);
     45    } else if (pt->x > w - RESIZE_BORDER && pt->y > h - RESIZE_BORDER) {
     46        REPORT_RESIZE_HIT(BOTTOMRIGHT);
     47    } else if (pt->x < w - RESIZE_BORDER && pt->x > RESIZE_BORDER && pt->y > h - RESIZE_BORDER) {
     48        REPORT_RESIZE_HIT(BOTTOM);
     49    } else if (pt->x < RESIZE_BORDER && pt->y > h - RESIZE_BORDER) {
     50        REPORT_RESIZE_HIT(BOTTOMLEFT);
     51    } else if (pt->x < RESIZE_BORDER && pt->y < h - RESIZE_BORDER && pt->y > RESIZE_BORDER) {
     52        REPORT_RESIZE_HIT(LEFT);
     53    }
     54
     55    SDL_Log("HIT-TEST: NORMAL\n");
     56    return SDL_HITTEST_NORMAL;
     57}
     58
     59
     60int main(int argc, char **argv)
     61{
     62    int done = 0;
     63    SDL_Window *window;
     64    SDL_Renderer *renderer;
     65
     66    /* !!! FIXME: check for errors. */
     67    SDL_Init(SDL_INIT_VIDEO);
     68    window = SDL_CreateWindow("Drag the red boxes", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE);
     69    renderer = SDL_CreateRenderer(window, -1, 0);
     70
     71    if (SDL_SetWindowHitTest(window, hitTest, NULL) == -1) {
     72        SDL_Log("Enabling hit-testing failed!\n");
     73        SDL_Quit();
     74        return 1;
     75    }
     76
     77    while (!done)
     78    {
     79        SDL_Event e;
     80        int nothing_to_do = 1;
     81
     82        SDL_SetRenderDrawColor(renderer, 0, 0, 127, 255);
     83        SDL_RenderClear(renderer);
     84        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
     85        SDL_RenderFillRects(renderer, areas, SDL_arraysize(drag_areas));
     86        SDL_RenderPresent(renderer);
     87
     88        while (SDL_PollEvent(&e)) {
     89            nothing_to_do = 0;
     90
     91            switch (e.type)
     92            {
     93                case SDL_MOUSEBUTTONDOWN:
     94                    SDL_Log("button down!\n");
     95                    break;
     96
     97                case SDL_MOUSEBUTTONUP:
     98                    SDL_Log("button up!\n");
     99                    break;
    100
    101                case SDL_WINDOWEVENT:
    102                    if (e.window.event == SDL_WINDOWEVENT_MOVED) {
    103                        SDL_Log("Window event moved to (%d, %d)!\n", (int) e.window.data1, (int) e.window.data2);
    104                    }
    105                    break;
    106
    107                case SDL_KEYDOWN:
    108                    if (e.key.keysym.sym == SDLK_ESCAPE) {
    109                        done = 1;
    110                    } else if (e.key.keysym.sym == SDLK_x) {
    111                        if (!areas) {
    112                            areas = drag_areas;
    113                            numareas = SDL_arraysize(drag_areas);
    114                        } else {
    115                            areas = NULL;
    116                            numareas = 0;
    117                        }
    118                    }
    119                    break;
    120
    121                case SDL_QUIT:
    122                    done = 1;
    123                    break;
    124            }
    125        }
    126
    127        if (nothing_to_do) {
    128            SDL_Delay(50);
    129        }
    130    }
    131
    132    SDL_Quit();
    133    return 0;
    134}