[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