Clamp HDR colors to the SDR range for SDR renderers

main
Sam Lantinga 2024-02-02 12:18:32 -08:00
parent 9591b2cfb4
commit aa8f609ff3
3 changed files with 44 additions and 44 deletions

View File

@ -105,20 +105,20 @@ static int PixelFormatToPS2PSM(Uint32 format)
static gs_rgbaq float_color_to_RGBAQ(const SDL_FColor *color) static gs_rgbaq float_color_to_RGBAQ(const SDL_FColor *color)
{ {
uint8_t colorR = (uint8_t)SDL_roundf(color->r * 255.0f); uint8_t colorR = (uint8_t)SDL_roundf(SDL_clamp(color->r, 0.0f, 1.0f) * 255.0f);
uint8_t colorG = (uint8_t)SDL_roundf(color->g * 255.0f); uint8_t colorG = (uint8_t)SDL_roundf(SDL_clamp(color->g, 0.0f, 1.0f) * 255.0f);
uint8_t colorB = (uint8_t)SDL_roundf(color->b * 255.0f); uint8_t colorB = (uint8_t)SDL_roundf(SDL_clamp(color->b, 0.0f, 1.0f) * 255.0f);
uint8_t colorA = (uint8_t)SDL_roundf(color->a * 255.0f); uint8_t colorA = (uint8_t)SDL_roundf(SDL_clamp(color->a, 0.0f, 1.0f) * 255.0f);
return color_to_RGBAQ(colorR, colorG, colorB, colorA, 0x00); return color_to_RGBAQ(colorR, colorG, colorB, colorA, 0x00);
} }
static uint64_t float_GS_SETREG_RGBAQ(const SDL_FColor *color) static uint64_t float_GS_SETREG_RGBAQ(const SDL_FColor *color)
{ {
uint8_t colorR = (uint8_t)SDL_roundf(color->r * 255.0f); uint8_t colorR = (uint8_t)SDL_roundf(SDL_clamp(color->r, 0.0f, 1.0f) * 255.0f);
uint8_t colorG = (uint8_t)SDL_roundf(color->g * 255.0f); uint8_t colorG = (uint8_t)SDL_roundf(SDL_clamp(color->g, 0.0f, 1.0f) * 255.0f);
uint8_t colorB = (uint8_t)SDL_roundf(color->b * 255.0f); uint8_t colorB = (uint8_t)SDL_roundf(SDL_clamp(color->b, 0.0f, 1.0f) * 255.0f);
uint8_t colorA = (uint8_t)SDL_roundf(color->a * 255.0f); uint8_t colorA = (uint8_t)SDL_roundf(SDL_clamp(color->a, 0.0f, 1.0f) * 255.0f);
return GS_SETREG_RGBAQ(colorR, colorG, colorB, colorA, 0x00); return GS_SETREG_RGBAQ(colorR, colorG, colorB, colorA, 0x00);
} }

View File

@ -688,10 +688,10 @@ static int PSP_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL
verts->y = xy_[1] * scale_y; verts->y = xy_[1] * scale_y;
verts->z = 0; verts->z = 0;
verts->col.r = (Uint8)SDL_roundf(col_->r * 255.0f); verts->col.r = (Uint8)SDL_roundf(SDL_clamp(col_->r, 0.0f, 1.0f) * 255.0f);
verts->col.g = (Uint8)SDL_roundf(col_->g * 255.0f); verts->col.g = (Uint8)SDL_roundf(SDL_clamp(col_->g, 0.0f, 1.0f) * 255.0f);
verts->col.b = (Uint8)SDL_roundf(col_->b * 255.0f); verts->col.b = (Uint8)SDL_roundf(SDL_clamp(col_->b, 0.0f, 1.0f) * 255.0f);
verts->col.a = (Uint8)SDL_roundf(col_->a * 255.0f); verts->col.a = (Uint8)SDL_roundf(SDL_clamp(col_->a, 0.0f, 1.0f) * 255.0f);
verts++; verts++;
} }
@ -727,10 +727,10 @@ static int PSP_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL
verts->y = xy_[1] * scale_y; verts->y = xy_[1] * scale_y;
verts->z = 0; verts->z = 0;
verts->col.r = (Uint8)SDL_roundf(col_->r * 255.0f); verts->col.r = (Uint8)SDL_roundf(SDL_clamp(col_->r, 0.0f, 1.0f) * 255.0f);
verts->col.g = (Uint8)SDL_roundf(col_->g * 255.0f); verts->col.g = (Uint8)SDL_roundf(SDL_clamp(col_->g, 0.0f, 1.0f) * 255.0f);
verts->col.b = (Uint8)SDL_roundf(col_->b * 255.0f); verts->col.b = (Uint8)SDL_roundf(SDL_clamp(col_->b, 0.0f, 1.0f) * 255.0f);
verts->col.a = (Uint8)SDL_roundf(col_->a * 255.0f); verts->col.a = (Uint8)SDL_roundf(SDL_clamp(col_->a, 0.0f, 1.0f) * 255.0f);
verts->u = uv_[0] * psp_texture->textureWidth; verts->u = uv_[0] * psp_texture->textureWidth;
verts->v = uv_[1] * psp_texture->textureHeight; verts->v = uv_[1] * psp_texture->textureHeight;
@ -1063,10 +1063,10 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
switch (cmd->command) { switch (cmd->command) {
case SDL_RENDERCMD_SETDRAWCOLOR: case SDL_RENDERCMD_SETDRAWCOLOR:
{ {
const Uint8 r = (Uint8)SDL_roundf(cmd->data.color.color.r * 255.0f); const Uint8 r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r, 0.0f, 1.0f) * 255.0f);
const Uint8 g = (Uint8)SDL_roundf(cmd->data.color.color.g * 255.0f); const Uint8 g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g, 0.0f, 1.0f) * 255.0f);
const Uint8 b = (Uint8)SDL_roundf(cmd->data.color.color.b * 255.0f); const Uint8 b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b, 0.0f, 1.0f) * 255.0f);
const Uint8 a = (Uint8)SDL_roundf(cmd->data.color.color.a * 255.0f); const Uint8 a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
drawstate.color = GU_RGBA(r, g, b, a); drawstate.color = GU_RGBA(r, g, b, a);
break; break;
} }
@ -1094,10 +1094,10 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
case SDL_RENDERCMD_CLEAR: case SDL_RENDERCMD_CLEAR:
{ {
const Uint8 r = (Uint8)SDL_roundf(cmd->data.color.color.r * 255.0f); const Uint8 r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r, 0.0f, 1.0f) * 255.0f);
const Uint8 g = (Uint8)SDL_roundf(cmd->data.color.color.g * 255.0f); const Uint8 g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g, 0.0f, 1.0f) * 255.0f);
const Uint8 b = (Uint8)SDL_roundf(cmd->data.color.color.b * 255.0f); const Uint8 b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b, 0.0f, 1.0f) * 255.0f);
const Uint8 a = (Uint8)SDL_roundf(cmd->data.color.color.a * 255.0f); const Uint8 a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
sceGuClearColor(GU_RGBA(r, g, b, a)); sceGuClearColor(GU_RGBA(r, g, b, a));
sceGuClearStencil(a); sceGuClearStencil(a);
sceGuClear(GU_COLOR_BUFFER_BIT | GU_STENCIL_BUFFER_BIT); sceGuClear(GU_COLOR_BUFFER_BIT | GU_STENCIL_BUFFER_BIT);

View File

@ -107,10 +107,10 @@ static int SW_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SDL_Pr
return SDL_SetError("Cannot create surface"); return SDL_SetError("Cannot create surface");
} }
texture->driverdata = surface; texture->driverdata = surface;
r = (Uint8)SDL_roundf(texture->color.r * 255.0f); r = (Uint8)SDL_roundf(SDL_clamp(texture->color.r, 0.0f, 1.0f) * 255.0f);
g = (Uint8)SDL_roundf(texture->color.g * 255.0f); g = (Uint8)SDL_roundf(SDL_clamp(texture->color.g, 0.0f, 1.0f) * 255.0f);
b = (Uint8)SDL_roundf(texture->color.b * 255.0f); b = (Uint8)SDL_roundf(SDL_clamp(texture->color.b, 0.0f, 1.0f) * 255.0f);
a = (Uint8)SDL_roundf(texture->color.a * 255.0f); a = (Uint8)SDL_roundf(SDL_clamp(texture->color.a, 0.0f, 1.0f) * 255.0f);
SDL_SetSurfaceColorMod(texture->driverdata, r, g, b); SDL_SetSurfaceColorMod(texture->driverdata, r, g, b);
SDL_SetSurfaceAlphaMod(texture->driverdata, a); SDL_SetSurfaceAlphaMod(texture->driverdata, a);
SDL_SetSurfaceBlendMode(texture->driverdata, texture->blendMode); SDL_SetSurfaceBlendMode(texture->driverdata, texture->blendMode);
@ -583,10 +583,10 @@ static int SW_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_
ptr->dst.y = (int)(xy_[1] * scale_y); ptr->dst.y = (int)(xy_[1] * scale_y);
trianglepoint_2_fixedpoint(&ptr->dst); trianglepoint_2_fixedpoint(&ptr->dst);
ptr->color.r = (Uint8)SDL_roundf(col_.r * 255.0f); ptr->color.r = (Uint8)SDL_roundf(SDL_clamp(col_.r, 0.0f, 1.0f) * 255.0f);
ptr->color.g = (Uint8)SDL_roundf(col_.g * 255.0f); ptr->color.g = (Uint8)SDL_roundf(SDL_clamp(col_.g, 0.0f, 1.0f) * 255.0f);
ptr->color.b = (Uint8)SDL_roundf(col_.b * 255.0f); ptr->color.b = (Uint8)SDL_roundf(SDL_clamp(col_.b, 0.0f, 1.0f) * 255.0f);
ptr->color.a = (Uint8)SDL_roundf(col_.a * 255.0f); ptr->color.a = (Uint8)SDL_roundf(SDL_clamp(col_.a, 0.0f, 1.0f) * 255.0f);
ptr++; ptr++;
} }
@ -614,10 +614,10 @@ static int SW_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_
ptr->dst.y = (int)(xy_[1] * scale_y); ptr->dst.y = (int)(xy_[1] * scale_y);
trianglepoint_2_fixedpoint(&ptr->dst); trianglepoint_2_fixedpoint(&ptr->dst);
ptr->color.r = (Uint8)SDL_roundf(col_.r * 255.0f); ptr->color.r = (Uint8)SDL_roundf(SDL_clamp(col_.r, 0.0f, 1.0f) * 255.0f);
ptr->color.g = (Uint8)SDL_roundf(col_.g * 255.0f); ptr->color.g = (Uint8)SDL_roundf(SDL_clamp(col_.g, 0.0f, 1.0f) * 255.0f);
ptr->color.b = (Uint8)SDL_roundf(col_.b * 255.0f); ptr->color.b = (Uint8)SDL_roundf(SDL_clamp(col_.b, 0.0f, 1.0f) * 255.0f);
ptr->color.a = (Uint8)SDL_roundf(col_.a * 255.0f); ptr->color.a = (Uint8)SDL_roundf(SDL_clamp(col_.a, 0.0f, 1.0f) * 255.0f);
ptr++; ptr++;
} }
@ -697,10 +697,10 @@ static int SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, vo
switch (cmd->command) { switch (cmd->command) {
case SDL_RENDERCMD_SETDRAWCOLOR: case SDL_RENDERCMD_SETDRAWCOLOR:
{ {
drawstate.color.r = (Uint8)SDL_roundf(cmd->data.color.color.r * 255.0f); drawstate.color.r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r, 0.0f, 1.0f) * 255.0f);
drawstate.color.g = (Uint8)SDL_roundf(cmd->data.color.color.g * 255.0f); drawstate.color.g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g, 0.0f, 1.0f) * 255.0f);
drawstate.color.b = (Uint8)SDL_roundf(cmd->data.color.color.b * 255.0f); drawstate.color.b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b, 0.0f, 1.0f) * 255.0f);
drawstate.color.a = (Uint8)SDL_roundf(cmd->data.color.color.a * 255.0f); drawstate.color.a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
break; break;
} }
@ -720,10 +720,10 @@ static int SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, vo
case SDL_RENDERCMD_CLEAR: case SDL_RENDERCMD_CLEAR:
{ {
const Uint8 r = (Uint8)SDL_roundf(cmd->data.color.color.r * 255.0f); const Uint8 r = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.r, 0.0f, 1.0f) * 255.0f);
const Uint8 g = (Uint8)SDL_roundf(cmd->data.color.color.g * 255.0f); const Uint8 g = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.g, 0.0f, 1.0f) * 255.0f);
const Uint8 b = (Uint8)SDL_roundf(cmd->data.color.color.b * 255.0f); const Uint8 b = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.b, 0.0f, 1.0f) * 255.0f);
const Uint8 a = (Uint8)SDL_roundf(cmd->data.color.color.a * 255.0f); const Uint8 a = (Uint8)SDL_roundf(SDL_clamp(cmd->data.color.color.a, 0.0f, 1.0f) * 255.0f);
/* By definition the clear ignores the clip rect */ /* By definition the clear ignores the clip rect */
SDL_SetSurfaceClipRect(surface, NULL); SDL_SetSurfaceClipRect(surface, NULL);
SDL_FillSurfaceRect(surface, NULL, SDL_MapRGBA(surface->format, r, g, b, a)); SDL_FillSurfaceRect(surface, NULL, SDL_MapRGBA(surface->format, r, g, b, a));