[Pixman] [PATCH 4/4] Various remaining fixes needed for successful compilation with C++
Siarhei Siamashka
siarhei.siamashka at gmail.com
Sun Dec 16 14:52:48 PST 2012
On Sun, 16 Dec 2012 15:32:48 -0500
Behdad Esfahbod <behdad at behdad.org> wrote:
> On 12-12-16 12:13 AM, Siarhei Siamashka wrote:
> > -#define PIXMAN_null PIXMAN_FORMAT (0, 0, 0, 0, 0, 0)
> > -#define PIXMAN_solid PIXMAN_FORMAT (0, 1, 0, 0, 0, 0)
> > -#define PIXMAN_pixbuf PIXMAN_FORMAT (0, 2, 0, 0, 0, 0)
> > -#define PIXMAN_rpixbuf PIXMAN_FORMAT (0, 3, 0, 0, 0, 0)
> > -#define PIXMAN_unknown PIXMAN_FORMAT (0, 4, 0, 0, 0, 0)
> > -#define PIXMAN_any PIXMAN_FORMAT (0, 5, 0, 0, 0, 0)
> > +#define PIXMAN_null ((pixman_format_code_t) PIXMAN_FORMAT (0, 0, 0, 0, 0, 0))
> > +#define PIXMAN_solid ((pixman_format_code_t) PIXMAN_FORMAT (0, 1, 0, 0, 0, 0))
> > +#define PIXMAN_pixbuf ((pixman_format_code_t) PIXMAN_FORMAT (0, 2, 0, 0, 0, 0))
> > +#define PIXMAN_rpixbuf ((pixman_format_code_t) PIXMAN_FORMAT (0, 3, 0, 0, 0, 0))
> > +#define PIXMAN_unknown ((pixman_format_code_t) PIXMAN_FORMAT (0, 4, 0, 0, 0, 0))
> > +#define PIXMAN_any ((pixman_format_code_t) PIXMAN_FORMAT (0, 5, 0, 0, 0, 0))
>
> Clearly the cast belongs to inside the PIXMAN_FORMAT macro...
It does not work this way. The problem is that PIXMAN_FORMAT macro is
used to initialize pixman_format_code_t enum itself (we get a variation
of a chicken/egg issue and C++ compilers do not like it either):
http://cgit.freedesktop.org/pixman/tree/pixman/pixman.h?id=pixman-0.28.2#n664
Arguably PIXMAN_null, PIXMAN_solid and the other constants actually
belong to this pixman_format_code_t enum in "pixman.h", but they are
not supposed to be exposed in the public header. That's why they are
somewhat artificially introduced in "pixman-private.h".
Also another thing that I don't quite like in this patch is the code
from "pixman-x86.c":
-typedef enum
-{
+typedef int cpu_features_t;
+
+enum {
X86_MMX = (1 << 0),
X86_MMX_EXTENSIONS = (1 << 1),
X86_SSE = (1 << 2) | X86_MMX_EXTENSIONS,
X86_SSE2 = (1 << 3),
X86_CMOV = (1 << 4)
-} cpu_features_t;
+};
Using enum for bit flags is a bit cumbersome in C++:
http://stackoverflow.com/questions/199606/how-should-c-bitflag-enumerations-be-translated-into-c
--
Best regards,
Siarhei Siamashka
More information about the Pixman
mailing list