summaryrefslogtreecommitdiff
path: root/src/contrib/SDL-3.2.20/test/testshape.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/contrib/SDL-3.2.20/test/testshape.c')
-rw-r--r--src/contrib/SDL-3.2.20/test/testshape.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/contrib/SDL-3.2.20/test/testshape.c b/src/contrib/SDL-3.2.20/test/testshape.c
new file mode 100644
index 0000000..9a884e6
--- /dev/null
+++ b/src/contrib/SDL-3.2.20/test/testshape.c
@@ -0,0 +1,147 @@
1/*
2 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
3
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely.
11*/
12#include <SDL3/SDL.h>
13#include <SDL3/SDL_main.h>
14
15#include "glass.h"
16
17
18static SDL_HitTestResult SDLCALL ShapeHitTest(SDL_Window *window, const SDL_Point *area, void *userdata)
19{
20 SDL_Surface *shape = (SDL_Surface *)userdata;
21 Uint8 r, g, b, a;
22
23 if (SDL_ReadSurfacePixel(shape, area->x, area->y, &r, &g, &b, &a)) {
24 if (a != SDL_ALPHA_TRANSPARENT) {
25 /* We'll just make everything draggable */
26 return SDL_HITTEST_DRAGGABLE;
27 }
28 }
29 return SDL_HITTEST_NORMAL;
30}
31
32int main(int argc, char *argv[])
33{
34 const char *image_file = NULL;
35 SDL_Window *window = NULL;
36 SDL_Renderer *renderer = NULL;
37 SDL_Surface *shape = NULL;
38 bool resizable = false;
39 SDL_WindowFlags flags;
40 bool done = false;
41 SDL_Event event;
42 int i;
43 int return_code = 1;
44
45 for (i = 1; i < argc; ++i) {
46 if (SDL_strcmp(argv[i], "--resizable") == 0) {
47 resizable = true;
48 } else if (!image_file) {
49 image_file = argv[i];
50 } else {
51 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Usage: %s [--resizable] [shape.bmp]", argv[0]);
52 goto quit;
53 }
54 }
55
56 if (image_file) {
57 shape = SDL_LoadBMP(image_file);
58 if (!shape) {
59 SDL_Log("Couldn't load %s: %s", image_file, SDL_GetError());
60 goto quit;
61 }
62 } else {
63 SDL_IOStream *stream = SDL_IOFromConstMem(glass_bmp, sizeof(glass_bmp));
64 if (!stream) {
65 SDL_Log("Couldn't create iostream for glass.bmp: %s", SDL_GetError());
66 goto quit;
67 }
68 shape = SDL_LoadBMP_IO(stream, true);
69 if (!shape) {
70 SDL_Log("Couldn't load glass.bmp: %s", SDL_GetError());
71 goto quit;
72 }
73 }
74
75 /* Create the window hidden so we can set the shape before it's visible */
76 flags = (SDL_WINDOW_HIDDEN | SDL_WINDOW_TRANSPARENT);
77 if (resizable) {
78 flags |= SDL_WINDOW_RESIZABLE;
79 } else {
80 flags |= SDL_WINDOW_BORDERLESS;
81 }
82 window = SDL_CreateWindow("SDL Shape Test", shape->w, shape->h, flags);
83 if (!window) {
84 SDL_Log("Couldn't create transparent window: %s", SDL_GetError());
85 goto quit;
86 }
87
88 renderer = SDL_CreateRenderer(window, NULL);
89 if (!renderer) {
90 SDL_Log("Couldn't create renderer: %s", SDL_GetError());
91 goto quit;
92 }
93
94 if (!SDL_ISPIXELFORMAT_ALPHA(shape->format)) {
95 /* Set the colorkey to the top-left pixel */
96 Uint8 r, g, b, a;
97
98 SDL_ReadSurfacePixel(shape, 0, 0, &r, &g, &b, &a);
99 SDL_SetSurfaceColorKey(shape, 1, SDL_MapSurfaceRGBA(shape, r, g, b, a));
100 }
101
102 if (!resizable) {
103 /* Set the hit test callback so we can drag the window */
104 if (!SDL_SetWindowHitTest(window, ShapeHitTest, shape)) {
105 SDL_Log("Couldn't set hit test callback: %s", SDL_GetError());
106 goto quit;
107 }
108 }
109
110 /* Set the window size to the size of our shape and show it */
111 SDL_SetWindowShape(window, shape);
112 SDL_ShowWindow(window);
113
114 /* We're ready to go! */
115 while (!done) {
116 while (SDL_PollEvent(&event)) {
117 switch (event.type) {
118 case SDL_EVENT_KEY_DOWN:
119 if (event.key.key == SDLK_ESCAPE) {
120 done = true;
121 }
122 break;
123 case SDL_EVENT_QUIT:
124 done = true;
125 break;
126 default:
127 break;
128 }
129 }
130
131 /* We'll clear to white, but you could do other drawing here */
132 SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
133 SDL_RenderClear(renderer);
134
135 /* Show everything on the screen and wait a bit */
136 SDL_RenderPresent(renderer);
137 SDL_Delay(100);
138 }
139
140 /* Success! */
141 return_code = 0;
142
143quit:
144 SDL_DestroySurface(shape);
145 SDL_Quit();
146 return return_code;
147}