util: add util_format_is_luminance/intensity/rgb(), etc

Reviewed-by: José Fonseca <jfonseca@vmware.com>
This commit is contained in:
Brian Paul 2011-09-15 11:31:55 -06:00
parent 0763b978ee
commit ba6f1f2c29
2 changed files with 112 additions and 1 deletions

View file

@ -67,6 +67,100 @@ util_format_is_float(enum pipe_format format)
}
/**
* Return the number of logical channels in the given format by
* examining swizzles.
* XXX this could be made into a public function if useful elsewhere.
*/
static unsigned
nr_logical_channels(const struct util_format_description *desc)
{
boolean swizzle_used[UTIL_FORMAT_SWIZZLE_MAX];
memset(swizzle_used, 0, sizeof(swizzle_used));
swizzle_used[desc->swizzle[0]] = TRUE;
swizzle_used[desc->swizzle[1]] = TRUE;
swizzle_used[desc->swizzle[2]] = TRUE;
swizzle_used[desc->swizzle[3]] = TRUE;
return (swizzle_used[UTIL_FORMAT_SWIZZLE_X] +
swizzle_used[UTIL_FORMAT_SWIZZLE_Y] +
swizzle_used[UTIL_FORMAT_SWIZZLE_Z] +
swizzle_used[UTIL_FORMAT_SWIZZLE_W]);
}
/** Test if the format contains RGB, but not alpha */
boolean
util_format_is_rgb_no_alpha(enum pipe_format format)
{
const struct util_format_description *desc =
util_format_description(format);
if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
nr_logical_channels(desc) == 3) {
return TRUE;
}
return FALSE;
}
boolean
util_format_is_luminance(enum pipe_format format)
{
const struct util_format_description *desc =
util_format_description(format);
if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_1) {
return TRUE;
}
return FALSE;
}
boolean
util_format_is_luminance_alpha(enum pipe_format format)
{
const struct util_format_description *desc =
util_format_description(format);
if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_Y) {
return TRUE;
}
return FALSE;
}
boolean
util_format_is_intensity(enum pipe_format format)
{
const struct util_format_description *desc =
util_format_description(format);
if ((desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB ||
desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) &&
desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_X &&
desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_X) {
return TRUE;
}
return FALSE;
}
boolean
util_format_is_supported(enum pipe_format format, unsigned bind)
{

View file

@ -105,7 +105,8 @@ enum util_format_swizzle {
UTIL_FORMAT_SWIZZLE_W = 3,
UTIL_FORMAT_SWIZZLE_0 = 4,
UTIL_FORMAT_SWIZZLE_1 = 5,
UTIL_FORMAT_SWIZZLE_NONE = 6
UTIL_FORMAT_SWIZZLE_NONE = 6,
UTIL_FORMAT_SWIZZLE_MAX = 7 /**< Number of enums counter (must be last) */
};
@ -477,6 +478,22 @@ boolean
util_format_is_float(enum pipe_format format);
boolean
util_format_is_rgb_no_alpha(enum pipe_format format);
boolean
util_format_is_luminance(enum pipe_format format);
boolean
util_format_is_luminance_alpha(enum pipe_format format);
boolean
util_format_is_intensity(enum pipe_format format);
/**
* Whether the src format can be blitted to destation format with a simple
* memcpy.