Use geometry to implement FillRects
parent
b0eef52fe1
commit
37c39d5cb4
|
@ -508,12 +508,74 @@ QueueCmdDrawLines(SDL_Renderer *renderer, const SDL_FPoint * points, const int c
|
||||||
static int
|
static int
|
||||||
QueueCmdFillRects(SDL_Renderer *renderer, const SDL_FRect * rects, const int count)
|
QueueCmdFillRects(SDL_Renderer *renderer, const SDL_FRect * rects, const int count)
|
||||||
{
|
{
|
||||||
SDL_RenderCommand *cmd = PrepQueueCmdDrawSolid(renderer, SDL_RENDERCMD_FILL_RECTS);
|
SDL_RenderCommand *cmd;
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
int use_geometry = renderer->QueueGeometry && ! (renderer->info.flags & SDL_RENDERER_SOFTWARE);
|
||||||
|
|
||||||
|
cmd = PrepQueueCmdDrawSolid(renderer, (use_geometry ? SDL_RENDERCMD_GEOMETRY : SDL_RENDERCMD_FILL_RECTS));
|
||||||
|
|
||||||
if (cmd != NULL) {
|
if (cmd != NULL) {
|
||||||
retval = renderer->QueueFillRects(renderer, cmd, rects, count);
|
if (use_geometry) {
|
||||||
if (retval < 0) {
|
SDL_bool isstack1;
|
||||||
cmd->command = SDL_RENDERCMD_NO_OP;
|
SDL_bool isstack2;
|
||||||
|
float *xy = SDL_small_alloc(float, 4 * 2 * count, &isstack1);
|
||||||
|
int *indices = SDL_small_alloc(int, 6 * count, &isstack2);
|
||||||
|
|
||||||
|
if (xy && indices) {
|
||||||
|
int i;
|
||||||
|
float *ptr_xy = xy;
|
||||||
|
int *ptr_indices = indices;
|
||||||
|
SDL_Color col;
|
||||||
|
const int xy_stride = 2 * sizeof (float);
|
||||||
|
const int color_stride = 0;
|
||||||
|
const int num_vertices = 4 * count;
|
||||||
|
const int num_indices = 6 * count;
|
||||||
|
const int size_indices = 4;
|
||||||
|
|
||||||
|
SDL_GetRenderDrawColor(renderer, &col.r, &col.g, &col.b, &col.a);
|
||||||
|
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
float minx, miny, maxx, maxy;
|
||||||
|
|
||||||
|
minx = rects[i].x;
|
||||||
|
miny = rects[i].y;
|
||||||
|
maxx = rects[i].x + rects[i].w;
|
||||||
|
maxy = rects[i].y + rects[i].h;
|
||||||
|
|
||||||
|
*ptr_xy++ = minx;
|
||||||
|
*ptr_xy++ = miny;
|
||||||
|
*ptr_xy++ = maxx;
|
||||||
|
*ptr_xy++ = miny;
|
||||||
|
*ptr_xy++ = maxx;
|
||||||
|
*ptr_xy++ = maxy;
|
||||||
|
*ptr_xy++ = minx;
|
||||||
|
*ptr_xy++ = maxy;
|
||||||
|
|
||||||
|
*ptr_indices++ = 0;
|
||||||
|
*ptr_indices++ = 1;
|
||||||
|
*ptr_indices++ = 2;
|
||||||
|
*ptr_indices++ = 0;
|
||||||
|
*ptr_indices++ = 2;
|
||||||
|
*ptr_indices++ = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = renderer->QueueGeometry(renderer, cmd, NULL,
|
||||||
|
xy, xy_stride, &col, color_stride, NULL, 0,
|
||||||
|
num_vertices, indices, num_indices, size_indices,
|
||||||
|
1.0f, 1.0f);
|
||||||
|
|
||||||
|
if (retval < 0) {
|
||||||
|
cmd->command = SDL_RENDERCMD_NO_OP;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_small_free(xy, isstack1);
|
||||||
|
SDL_small_free(indices, isstack2);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
retval = renderer->QueueFillRects(renderer, cmd, rects, count);
|
||||||
|
if (retval < 0) {
|
||||||
|
cmd->command = SDL_RENDERCMD_NO_OP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
|
|
Loading…
Reference in New Issue