/* SPDX-License-Identifier: GPL-2.0 or MIT */
#ifndef DRM_FORMAT_INTERNAL_H
#define DRM_FORMAT_INTERNAL_H
#include <linux/bits.h>
#include <linux/types.h>
#include <linux/swab.h>
/*
* Each pixel - format conversion helper takes a raw pixel in a
* specific input format and returns a raw pixel in a specific
* output format . All pixels are in little - endian byte order .
*
* Function names are
*
* drm_pixel_ < input > _ to_ < output > _ < algorithm > ( )
*
* where < input > and < output > refer to pixel formats . The
* < algorithm > is optional and hints to the method used for the
* conversion . Helpers with no algorithm given apply pixel - bit
* shifting .
*
* The argument type is u32 . We expect this to be wide enough to
* hold all conversion input from 32 - bit RGB to any output format .
* The Linux kernel should avoid format conversion for anything
* but XRGB8888 input data . Converting from other format can still
* be acceptable in some cases .
*
* The return type is u32 . It is wide enough to hold all conversion
* output from XRGB8888 . For output formats wider than 32 bit , a
* return type of u64 would be acceptable .
*/
/*
* Conversions from XRGB8888
*/
static inline u32 drm_pixel_xrgb8888_to_r8_bt601(u32 pix)
{
u32 r = (pix & 0 x00ff0000) >> 16 ;
u32 g = (pix & 0 x0000ff00) >> 8 ;
u32 b = pix & 0 x000000ff;
/* ITU-R BT.601: Y = 0.299 R + 0.587 G + 0.114 B */
return (77 * r + 150 * g + 29 * b) / 256 ;
}
static inline u32 drm_pixel_xrgb8888_to_rgb332(u32 pix)
{
return ((pix & 0 x00e00000) >> 16 ) |
((pix & 0 x0000e000) >> 11 ) |
((pix & 0 x000000c0) >> 6 );
}
static inline u32 drm_pixel_xrgb8888_to_rgb565(u32 pix)
{
return ((pix & 0 x00f80000) >> 8 ) |
((pix & 0 x0000fc00) >> 5 ) |
((pix & 0 x000000f8) >> 3 );
}
static inline u32 drm_pixel_xrgb8888_to_rgb565be(u32 pix)
{
return swab16(drm_pixel_xrgb8888_to_rgb565(pix));
}
static inline u32 drm_pixel_xrgb8888_to_rgbx5551(u32 pix)
{
return ((pix & 0 x00f80000) >> 8 ) |
((pix & 0 x0000f800) >> 5 ) |
((pix & 0 x000000f8) >> 2 );
}
static inline u32 drm_pixel_xrgb8888_to_rgba5551(u32 pix)
{
return drm_pixel_xrgb8888_to_rgbx5551(pix) |
BIT(0 ); /* set alpha bit */
}
static inline u32 drm_pixel_xrgb8888_to_xrgb1555(u32 pix)
{
return ((pix & 0 x00f80000) >> 9 ) |
((pix & 0 x0000f800) >> 6 ) |
((pix & 0 x000000f8) >> 3 );
}
static inline u32 drm_pixel_xrgb8888_to_argb1555(u32 pix)
{
return BIT(15 ) | /* set alpha bit */
drm_pixel_xrgb8888_to_xrgb1555(pix);
}
static inline u32 drm_pixel_xrgb8888_to_rgb888(u32 pix)
{
return pix & GENMASK(23 , 0 );
}
static inline u32 drm_pixel_xrgb8888_to_bgr888(u32 pix)
{
return ((pix & 0 x00ff0000) >> 16 ) |
((pix & 0 x0000ff00)) |
((pix & 0 x000000ff) << 16 );
}
static inline u32 drm_pixel_xrgb8888_to_argb8888(u32 pix)
{
return GENMASK(31 , 24 ) | /* fill alpha bits */
pix;
}
static inline u32 drm_pixel_xrgb8888_to_xbgr8888(u32 pix)
{
return ((pix & 0 xff000000)) | /* also copy filler bits */
((pix & 0 x00ff0000) >> 16 ) |
((pix & 0 x0000ff00)) |
((pix & 0 x000000ff) << 16 );
}
static inline u32 drm_pixel_xrgb8888_to_bgrx8888(u32 pix)
{
return ((pix & 0 xff000000) >> 24 ) | /* also copy filler bits */
((pix & 0 x00ff0000) >> 8 ) |
((pix & 0 x0000ff00) << 8 ) |
((pix & 0 x000000ff) << 24 );
}
static inline u32 drm_pixel_xrgb8888_to_abgr8888(u32 pix)
{
return GENMASK(31 , 24 ) | /* fill alpha bits */
drm_pixel_xrgb8888_to_xbgr8888(pix);
}
static inline u32 drm_pixel_xrgb8888_to_xrgb2101010(u32 pix)
{
pix = ((pix & 0 x000000ff) << 2 ) |
((pix & 0 x0000ff00) << 4 ) |
((pix & 0 x00ff0000) << 6 );
return pix | ((pix >> 8 ) & 0 x00300c03);
}
static inline u32 drm_pixel_xrgb8888_to_argb2101010(u32 pix)
{
return GENMASK(31 , 30 ) | /* set alpha bits */
drm_pixel_xrgb8888_to_xrgb2101010(pix);
}
static inline u32 drm_pixel_xrgb8888_to_xbgr2101010(u32 pix)
{
pix = ((pix & 0 x00ff0000) >> 14 ) |
((pix & 0 x0000ff00) << 4 ) |
((pix & 0 x000000ff) << 22 );
return pix | ((pix >> 8 ) & 0 x00300c03);
}
static inline u32 drm_pixel_xrgb8888_to_abgr2101010(u32 pix)
{
return GENMASK(31 , 30 ) | /* set alpha bits */
drm_pixel_xrgb8888_to_xbgr2101010(pix);
}
/*
* Conversion from ARGB8888
*/
static inline u32 drm_pixel_argb8888_to_argb4444(u32 pix)
{
return ((pix & 0 xf0000000) >> 16 ) |
((pix & 0 x00f00000) >> 12 ) |
((pix & 0 x0000f000) >> 8 ) |
((pix & 0 x000000f0) >> 4 );
}
#endif
Messung V0.5 in Prozent C=93 H=100 G=96
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-10-01)
¤
*© Formatika GbR, Deutschland