pixels: Add fourcc_to_pixman_fmt
parent
cf42f76f56
commit
dad7312814
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019 Andri Yngvason
|
* Copyright (c) 2019 - 2021 Andri Yngvason
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <pixman.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
struct rfb_pixel_format;
|
struct rfb_pixel_format;
|
||||||
|
|
||||||
|
@ -31,3 +33,5 @@ int rfb_pixfmt_from_fourcc(struct rfb_pixel_format *dst, uint32_t src);
|
||||||
uint32_t rfb_pixfmt_to_fourcc(const struct rfb_pixel_format* fmt);
|
uint32_t rfb_pixfmt_to_fourcc(const struct rfb_pixel_format* fmt);
|
||||||
|
|
||||||
int pixel_size_from_fourcc(uint32_t fourcc);
|
int pixel_size_from_fourcc(uint32_t fourcc);
|
||||||
|
|
||||||
|
bool fourcc_to_pixman_fmt(pixman_format_code_t* dst, uint32_t src);
|
||||||
|
|
69
src/pixels.c
69
src/pixels.c
|
@ -247,3 +247,72 @@ int pixel_size_from_fourcc(uint32_t fourcc)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool fourcc_to_pixman_fmt(pixman_format_code_t* dst, uint32_t src)
|
||||||
|
{
|
||||||
|
assert(!(src & DRM_FORMAT_BIG_ENDIAN));
|
||||||
|
|
||||||
|
#define LOWER_R r
|
||||||
|
#define LOWER_G g
|
||||||
|
#define LOWER_B b
|
||||||
|
#define LOWER_A a
|
||||||
|
#define LOWER_X x
|
||||||
|
#define LOWER_
|
||||||
|
#define LOWER(x) LOWER_##x
|
||||||
|
|
||||||
|
#define CONCAT_(a, b) a ## b
|
||||||
|
#define CONCAT(a, b) CONCAT_(a, b)
|
||||||
|
|
||||||
|
#define FMT_DRM(x, y, z, v, a, b, c, d) DRM_FORMAT_##x##y##z##v##a##b##c##d
|
||||||
|
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
|
#define FMT_PIXMAN(x, y, z, v, a, b, c, d) \
|
||||||
|
CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(\
|
||||||
|
PIXMAN_, LOWER(x)), a), LOWER(y)), b), LOWER(z)), c), LOWER(v)), d)
|
||||||
|
#else
|
||||||
|
#define FMT_PIXMAN(x, y, z, v, a, b, c, d) \
|
||||||
|
CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(\
|
||||||
|
PIXMAN_, LOWER(v)), d), LOWER(z)), c), LOWER(y)), b), LOWER(x)), a)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (src) {
|
||||||
|
#define X(...) \
|
||||||
|
case FMT_DRM(__VA_ARGS__): *dst = FMT_PIXMAN(__VA_ARGS__); break
|
||||||
|
|
||||||
|
/* 32 bits */
|
||||||
|
X(A,R,G,B,8,8,8,8);
|
||||||
|
X(A,B,G,R,8,8,8,8);
|
||||||
|
X(X,R,G,B,8,8,8,8);
|
||||||
|
X(X,B,G,R,8,8,8,8);
|
||||||
|
X(R,G,B,A,8,8,8,8);
|
||||||
|
X(B,G,R,A,8,8,8,8);
|
||||||
|
X(R,G,B,X,8,8,8,8);
|
||||||
|
X(B,G,R,X,8,8,8,8);
|
||||||
|
|
||||||
|
/* 24 bits */
|
||||||
|
X(R,G,B,,8,8,8,);
|
||||||
|
X(B,G,R,,8,8,8,);
|
||||||
|
|
||||||
|
/* 16 bits */
|
||||||
|
X(R,G,B,,5,6,5,);
|
||||||
|
X(B,G,R,,5,6,5,);
|
||||||
|
|
||||||
|
/* These are incompatible on big endian */
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
|
X(A,R,G,B,1,5,5,5);
|
||||||
|
X(A,B,G,R,1,5,5,5);
|
||||||
|
X(X,R,G,B,1,5,5,5);
|
||||||
|
X(X,B,G,R,1,5,5,5);
|
||||||
|
X(A,R,G,B,4,4,4,4);
|
||||||
|
X(A,B,G,R,4,4,4,4);
|
||||||
|
X(X,R,G,B,4,4,4,4);
|
||||||
|
X(X,B,G,R,4,4,4,4);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef X
|
||||||
|
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue