mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-09-19 13:30:02 +00:00
gdk: Add gdk_color_state_clamp()
Allows clamping values into the correct range to construct valid colors.
This commit is contained in:
parent
585f31fa2e
commit
4e9ebb5299
@ -331,6 +331,68 @@ gdk_default_color_state_get_cicp (GdkColorState *color_state)
|
|||||||
return &self->cicp;
|
return &self->cicp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gdk_color_state_check_inf_nan (const float src[4],
|
||||||
|
float dest[4])
|
||||||
|
{
|
||||||
|
if (isnan (src[0]) ||
|
||||||
|
isnan (src[1]) ||
|
||||||
|
isnan (src[2]) ||
|
||||||
|
isnan (src[3]))
|
||||||
|
{
|
||||||
|
dest = (float[4]) { 1.0, 0.0, 0.8, 1.0 };
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (isinf (src[0]) ||
|
||||||
|
isinf (src[1]) ||
|
||||||
|
isinf (src[2]) ||
|
||||||
|
isinf (src[3]))
|
||||||
|
{
|
||||||
|
dest = (float[4]) { 0.0, 0.8, 1.0, 1.0 };
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_color_state_clamp_0_1 (GdkColorState *self,
|
||||||
|
const float src[4],
|
||||||
|
float dest[4])
|
||||||
|
{
|
||||||
|
if (gdk_color_state_check_inf_nan (src, dest))
|
||||||
|
return;
|
||||||
|
|
||||||
|
dest[0] = CLAMP (src[0], 0.0f, 1.0f);
|
||||||
|
dest[1] = CLAMP (src[1], 0.0f, 1.0f);
|
||||||
|
dest[2] = CLAMP (src[2], 0.0f, 1.0f);
|
||||||
|
dest[3] = CLAMP (src[3], 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_color_state_clamp_unbounded (GdkColorState *self,
|
||||||
|
const float src[4],
|
||||||
|
float dest[4])
|
||||||
|
{
|
||||||
|
if (gdk_color_state_check_inf_nan (src, dest))
|
||||||
|
return;
|
||||||
|
|
||||||
|
dest[0] = src[0];
|
||||||
|
dest[1] = src[1];
|
||||||
|
dest[2] = src[2];
|
||||||
|
dest[3] = CLAMP (src[3], 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gdk_default_color_state_clamp (GdkColorState *color_state,
|
||||||
|
const float in[4],
|
||||||
|
float out[4])
|
||||||
|
{
|
||||||
|
GdkDefaultColorState *self = (GdkDefaultColorState *) color_state;
|
||||||
|
|
||||||
|
self->clamp (color_state, in, out);
|
||||||
|
}
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
static const
|
static const
|
||||||
@ -342,6 +404,7 @@ GdkColorStateClass GDK_DEFAULT_COLOR_STATE_CLASS = {
|
|||||||
.get_convert_to = gdk_default_color_state_get_convert_to,
|
.get_convert_to = gdk_default_color_state_get_convert_to,
|
||||||
.get_convert_from = gdk_default_color_state_get_convert_from,
|
.get_convert_from = gdk_default_color_state_get_convert_from,
|
||||||
.get_cicp = gdk_default_color_state_get_cicp,
|
.get_cicp = gdk_default_color_state_get_cicp,
|
||||||
|
.clamp = gdk_default_color_state_clamp,
|
||||||
};
|
};
|
||||||
|
|
||||||
GdkDefaultColorState gdk_default_color_states[] = {
|
GdkDefaultColorState gdk_default_color_states[] = {
|
||||||
@ -360,6 +423,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
|
|||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_to_rec2100_pq,
|
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_to_rec2100_pq,
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_to_rec2100_linear,
|
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_to_rec2100_linear,
|
||||||
},
|
},
|
||||||
|
.clamp = gdk_color_state_clamp_0_1,
|
||||||
.cicp = { 1, 13, 0, 1 },
|
.cicp = { 1, 13, 0, 1 },
|
||||||
},
|
},
|
||||||
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = {
|
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = {
|
||||||
@ -377,6 +441,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
|
|||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_linear_to_rec2100_pq,
|
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_srgb_linear_to_rec2100_pq,
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_linear_to_rec2100_linear,
|
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_srgb_linear_to_rec2100_linear,
|
||||||
},
|
},
|
||||||
|
.clamp = gdk_color_state_clamp_0_1,
|
||||||
.cicp = { 1, 8, 0, 1 },
|
.cicp = { 1, 8, 0, 1 },
|
||||||
},
|
},
|
||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = {
|
[GDK_COLOR_STATE_ID_REC2100_PQ] = {
|
||||||
@ -394,6 +459,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
|
|||||||
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_pq_to_srgb_linear,
|
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_pq_to_srgb_linear,
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_rec2100_pq_to_rec2100_linear,
|
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = gdk_default_rec2100_pq_to_rec2100_linear,
|
||||||
},
|
},
|
||||||
|
.clamp = gdk_color_state_clamp_0_1,
|
||||||
.cicp = { 9, 16, 0, 1 },
|
.cicp = { 9, 16, 0, 1 },
|
||||||
},
|
},
|
||||||
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = {
|
[GDK_COLOR_STATE_ID_REC2100_LINEAR] = {
|
||||||
@ -411,6 +477,7 @@ GdkDefaultColorState gdk_default_color_states[] = {
|
|||||||
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_linear_to_srgb_linear,
|
[GDK_COLOR_STATE_ID_SRGB_LINEAR] = gdk_default_rec2100_linear_to_srgb_linear,
|
||||||
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_rec2100_linear_to_rec2100_pq,
|
[GDK_COLOR_STATE_ID_REC2100_PQ] = gdk_default_rec2100_linear_to_rec2100_pq,
|
||||||
},
|
},
|
||||||
|
.clamp = gdk_color_state_clamp_unbounded,
|
||||||
.cicp = { 9, 8, 0, 1 },
|
.cicp = { 9, 8, 0, 1 },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -566,6 +633,7 @@ GdkColorStateClass GDK_CICP_COLOR_STATE_CLASS = {
|
|||||||
.get_convert_to = gdk_cicp_color_state_get_convert_to,
|
.get_convert_to = gdk_cicp_color_state_get_convert_to,
|
||||||
.get_convert_from = gdk_cicp_color_state_get_convert_from,
|
.get_convert_from = gdk_cicp_color_state_get_convert_from,
|
||||||
.get_cicp = gdk_cicp_color_state_get_cicp,
|
.get_cicp = gdk_cicp_color_state_get_cicp,
|
||||||
|
.clamp = gdk_color_state_clamp_0_1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline float *
|
static inline float *
|
||||||
@ -770,6 +838,24 @@ gdk_color_state_get_no_srgb_tf (GdkColorState *self)
|
|||||||
return self->klass->get_no_srgb_tf (self);
|
return self->klass->get_no_srgb_tf (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*< private >
|
||||||
|
* gdk_color_state_clamp:
|
||||||
|
* @self: a `GdkColorState`
|
||||||
|
* @src: the values to clamp
|
||||||
|
* @dest: (out): location to store the result, may be identical to
|
||||||
|
* the src argument
|
||||||
|
*
|
||||||
|
* Clamps the values to be within the allowed ranges for the given
|
||||||
|
* color state.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gdk_color_state_clamp (GdkColorState *self,
|
||||||
|
const float src[4],
|
||||||
|
float dest[4])
|
||||||
|
{
|
||||||
|
self->klass->clamp (self, src, dest);
|
||||||
|
}
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
/* vim:set foldmethod=marker expandtab: */
|
/* vim:set foldmethod=marker expandtab: */
|
||||||
|
@ -46,6 +46,9 @@ struct _GdkColorStateClass
|
|||||||
GdkFloatColorConvert (* get_convert_from) (GdkColorState *self,
|
GdkFloatColorConvert (* get_convert_from) (GdkColorState *self,
|
||||||
GdkColorState *source);
|
GdkColorState *source);
|
||||||
const GdkCicp * (* get_cicp) (GdkColorState *self);
|
const GdkCicp * (* get_cicp) (GdkColorState *self);
|
||||||
|
void (* clamp) (GdkColorState *self,
|
||||||
|
const float src[4],
|
||||||
|
float dest[4]);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _GdkDefaultColorState GdkDefaultColorState;
|
typedef struct _GdkDefaultColorState GdkDefaultColorState;
|
||||||
@ -57,6 +60,9 @@ struct _GdkDefaultColorState
|
|||||||
const char *name;
|
const char *name;
|
||||||
GdkColorState *no_srgb;
|
GdkColorState *no_srgb;
|
||||||
GdkFloatColorConvert convert_to[GDK_COLOR_STATE_N_IDS];
|
GdkFloatColorConvert convert_to[GDK_COLOR_STATE_N_IDS];
|
||||||
|
void (* clamp) (GdkColorState *self,
|
||||||
|
const float src[4],
|
||||||
|
float dest[4]);
|
||||||
|
|
||||||
GdkCicp cicp;
|
GdkCicp cicp;
|
||||||
};
|
};
|
||||||
@ -78,6 +84,10 @@ GdkColorState * gdk_color_state_get_no_srgb_tf (GdkColorState
|
|||||||
GdkColorState * gdk_color_state_new_for_cicp (const GdkCicp *cicp,
|
GdkColorState * gdk_color_state_new_for_cicp (const GdkCicp *cicp,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
void gdk_color_state_clamp (GdkColorState *self,
|
||||||
|
const float src[4],
|
||||||
|
float dest[4]);
|
||||||
|
|
||||||
static inline GdkColorState *
|
static inline GdkColorState *
|
||||||
gdk_color_state_get_rendering_color_state (GdkColorState *self)
|
gdk_color_state_get_rendering_color_state (GdkColorState *self)
|
||||||
{
|
{
|
||||||
@ -214,4 +224,3 @@ gdk_color_state_from_rgba (GdkColorState *self,
|
|||||||
self,
|
self,
|
||||||
out_color);
|
out_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user