sdl3/php-sdl3/helper.h
2025-11-20 13:53:13 +01:00

84 lines
2.9 KiB
C

#ifndef PHP_SDL3_HELPER
#define PHP_SDL3_HELPER
#include <SDL3/SDL.h>
#include "math.h"
// Zeichnet einen gefüllten Viertel-Kreis mit Anti-Aliasing (filled quarter circle).
// quadrant: 0 = top-left, 1 = top-right, 2 = bottom-right, 3 = bottom-left
static void filled_quarter_circle(SDL_Renderer *renderer, int cx, int cy, int r, int quadrant) {
if (r <= 0) return;
// Get current draw color
Uint8 r_col, g_col, b_col, a_col;
SDL_GetRenderDrawColor(renderer, &r_col, &g_col, &b_col, &a_col);
// Use scanline filling with antialiasing on the edge
float radius = (float)r;
// Iterate through each row of the quadrant
for (int y = 0; y < r; y++) {
// Calculate distance from center
float dy = (float)y + 0.5f;
float x_exact = sqrtf(fmaxf(0.0f, radius * radius - dy * dy));
int x_max = (int)floorf(x_exact);
float frac = x_exact - (float)x_max;
// Draw the fully opaque pixels for this scanline
for (int x = 0; x <= x_max; x++) {
int px, py;
switch (quadrant) {
case 0: // top-left: draw from center going left and up
px = cx - x;
py = cy - y;
break;
case 1: // top-right: draw from center going right and up
px = cx + x;
py = cy - y;
break;
case 2: // bottom-right: draw from center going right and down
px = cx + x;
py = cy + y;
break;
case 3: // bottom-left: draw from center going left and down
px = cx - x;
py = cy + y;
break;
}
SDL_SetRenderDrawColor(renderer, r_col, g_col, b_col, a_col);
SDL_RenderPoint(renderer, px, py);
}
// Draw the antialiased edge pixel
if (frac > 0.01f && x_max + 1 < r) {
int px, py;
switch (quadrant) {
case 0: // top-left
px = cx - (x_max + 1);
py = cy - y;
break;
case 1: // top-right
px = cx + (x_max + 1);
py = cy - y;
break;
case 2: // bottom-right
px = cx + (x_max + 1);
py = cy + y;
break;
case 3: // bottom-left
px = cx - (x_max + 1);
py = cy + y;
break;
}
Uint8 edge_alpha = (Uint8)(frac * a_col);
SDL_SetRenderDrawColor(renderer, r_col, g_col, b_col, edge_alpha);
SDL_RenderPoint(renderer, px, py);
}
}
// Restore original draw color
SDL_SetRenderDrawColor(renderer, r_col, g_col, b_col, a_col);
}
#endif