⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pixman-private.h

📁 嵌入式图形库
💻 H
📖 第 1 页 / 共 2 页
字号:
#define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \					 FbIntMult(FbGet8(x,i),ax,(v))), \				  (uint32_t) ((uint8_t) ((t) |		\							 (0 - ((t) >> 8)))) << (i))#define FbAdd(x,y,i,t)	((t) = FbGet8(x,i) + FbGet8(y,i),		\			 (uint32_t) ((uint8_t) ((t) | (0 - ((t) >> 8)))) << (i))/*  The methods below use some tricks to be able to do two color  components at the same time.*//*  x_c = (x_c * a) / 255*/#define FbByteMul(x, a) do {					    \        uint32_t t = ((x & 0xff00ff) * a) + 0x800080;               \        t = (t + ((t >> 8) & 0xff00ff)) >> 8;			    \        t &= 0xff00ff;						    \								    \        x = (((x >> 8) & 0xff00ff) * a) + 0x800080;		    \        x = (x + ((x >> 8) & 0xff00ff));			    \        x &= 0xff00ff00;					    \        x += t;							    \    } while (0)/*  x_c = (x_c * a) / 255 + y*/#define FbByteMulAdd(x, a, y) do {				    \        uint32_t t = ((x & 0xff00ff) * a) + 0x800080;               \        t = (t + ((t >> 8) & 0xff00ff)) >> 8;			    \        t &= 0xff00ff;						    \        t += y & 0xff00ff;					    \        t |= 0x1000100 - ((t >> 8) & 0xff00ff);			    \        t &= 0xff00ff;						    \								    \        x = (((x >> 8) & 0xff00ff) * a) + 0x800080;                 \        x = (x + ((x >> 8) & 0xff00ff)) >> 8;                       \        x &= 0xff00ff;                                              \        x += (y >> 8) & 0xff00ff;                                   \        x |= 0x1000100 - ((x >> 8) & 0xff00ff);                     \        x &= 0xff00ff;                                              \        x <<= 8;                                                    \        x += t;                                                     \    } while (0)/*  x_c = (x_c * a + y_c * b) / 255*/#define FbByteAddMul(x, a, y, b) do {                                   \        uint32_t t;							\        uint32_t r = (x >> 24) * a + (y >> 24) * b + 0x80;		\        r += (r >> 8);                                                  \        r >>= 8;                                                        \									\        t = (x & 0xff00) * a + (y & 0xff00) * b;                        \        t += (t >> 8) + 0x8000;                                         \        t >>= 16;                                                       \									\        t |= r << 16;                                                   \        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \        t &= 0xff00ff;                                                  \        t <<= 8;                                                        \									\        r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b + 0x80;     \        r += (r >> 8);                                                  \        r >>= 8;                                                        \									\        x = (x & 0xff) * a + (y & 0xff) * b + 0x80;                     \        x += (x >> 8);                                                  \        x >>= 8;                                                        \        x |= r << 16;                                                   \        x |= 0x1000100 - ((x >> 8) & 0xff00ff);                         \        x &= 0xff00ff;                                                  \        x |= t;                                                         \    } while (0)/*  x_c = (x_c * a + y_c *b) / 256*/#define FbByteAddMul_256(x, a, y, b) do {                               \        uint32_t t = (x & 0xff00ff) * a + (y & 0xff00ff) * b;		\        t >>= 8;                                                        \        t &= 0xff00ff;                                                  \									\        x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b;      \        x &= 0xff00ff00;                                                \        x += t;                                                         \    } while (0)/*  x_c = (x_c * a_c) / 255*/#define FbByteMulC(x, a) do {				  \        uint32_t t;                                       \        uint32_t r = (x & 0xff) * (a & 0xff);             \        r |= (x & 0xff0000) * ((a >> 16) & 0xff);	  \	r += 0x800080;					  \        r = (r + ((r >> 8) & 0xff00ff)) >> 8;		  \        r &= 0xff00ff;					  \							  \        x >>= 8;					  \        t = (x & 0xff) * ((a >> 8) & 0xff);		  \        t |= (x & 0xff0000) * (a >> 24);		  \        t += 0x800080;					  \        t = t + ((t >> 8) & 0xff00ff);			  \        x = r | (t & 0xff00ff00);			  \							  \    } while (0)/*  x_c = (x_c * a) / 255 + y*/#define FbByteMulAddC(x, a, y) do {				      \        uint32_t t;                                                   \        uint32_t r = (x & 0xff) * (a & 0xff);                         \        r |= (x & 0xff0000) * ((a >> 16) & 0xff);		      \	r += 0x800080;						      \	r = (r + ((r >> 8) & 0xff00ff)) >> 8;			      \        r &= 0xff00ff;						      \        r += y & 0xff00ff;					      \        r |= 0x1000100 - ((r >> 8) & 0xff00ff);			      \        r &= 0xff00ff;						      \								      \        x >>= 8;                                                       \        t = (x & 0xff) * ((a >> 8) & 0xff);                            \        t |= (x & 0xff0000) * (a >> 24);                               \	t += 0x800080;                                                 \        t = (t + ((t >> 8) & 0xff00ff)) >> 8;			       \        t &= 0xff00ff;                                                 \        t += (y >> 8) & 0xff00ff;                                      \        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                        \        t &= 0xff00ff;                                                 \        x = r | (t << 8);                                              \    } while (0)/*  x_c = (x_c * a_c + y_c * b) / 255*/#define FbByteAddMulC(x, a, y, b) do {                                  \        uint32_t t;							\        uint32_t r = (x >> 24) * (a >> 24) + (y >> 24) * b;		\        r += (r >> 8) + 0x80;                                           \        r >>= 8;                                                        \									\        t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b;        \        t += (t >> 8) + 0x8000;                                         \        t >>= 16;                                                       \									\        t |= r << 16;                                                   \        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \        t &= 0xff00ff;                                                  \        t <<= 8;                                                        \									\        r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b + 0x80; \        r += (r >> 8);                                                  \        r >>= 8;                                                        \									\        x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b + 0x80;            \        x += (x >> 8);                                                  \        x >>= 8;                                                        \        x |= r << 16;                                                   \        x |= 0x1000100 - ((x >> 8) & 0xff00ff);                         \        x &= 0xff00ff;                                                  \        x |= t;                                                         \    } while (0)/*  x_c = min(x_c + y_c, 255)*/#define FbByteAdd(x, y) do {                                            \        uint32_t t;							\        uint32_t r = (x & 0xff00ff) + (y & 0xff00ff);			\        r |= 0x1000100 - ((r >> 8) & 0xff00ff);                         \        r &= 0xff00ff;                                                  \									\        t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff);              \        t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \        r |= (t & 0xff00ff) << 8;                                       \        x = r;                                                          \    } while (0)#define div_255(x) (((x) + 0x80 + (((x) + 0x80) >> 8)) >> 8)#define MOD(a,b) ((a) < 0 ? ((b) - ((-(a) - 1) % (b))) - 1 : (a) % (b))#define DIV(a,b) ((((a) < 0) == ((b) < 0)) ? (a) / (b) :		\		  ((a) - (b) + 1 - (((b) < 0) << 1)) / (b))#define CLIP(a,b,c) ((a) < (b) ? (b) : ((a) > (c) ? (c) : (a)))#if 0/* FIXME: the MOD macro above is equivalent, but faster I think */#define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))#endif/* FIXME: the (void)__read_func hides lots of warnings (which is what they * are supposed to do), but some of them are real. For example the one * where Fetch4 doesn't have a READ */#if 0/* Framebuffer access support macros */#define ACCESS_MEM(code)						\    do {								\	const image_common_t *const com__ =				\	    (image_common_t *)image;					\									\	if (!com__->read_func && !com__->write_func)			\	{								\	    const int do_access__ = 0;					\	    const pixman_read_memory_func_t read_func__ = NULL;		\	    const pixman_write_memory_func_t write_func__ = NULL;	\	    (void)read_func__;						\	    (void)write_func__;						\	    (void)do_access__;						\									\	    {code}							\	}								\	else								\	{								\	    const int do_access__ = 1;					\	    const pixman_read_memory_func_t read_func__ =		\		com__->read_func;					\	    const pixman_write_memory_func_t write_func__ =		\		com__->write_func;					\	    (void)read_func__;						\	    (void)write_func__;						\	    (void)do_access__;						\	    								\	    {code}							\	}								\    } while (0)#endif#ifdef PIXMAN_FB_ACCESSORS#define READ(img, ptr)							\    ((img)->common.read_func ((ptr), sizeof(*(ptr))))#define WRITE(img, ptr,val)						\    ((img)->common.write_func ((ptr), (val), sizeof (*(ptr))))#define MEMCPY_WRAPPED(img, dst, src, size)				\    do {								\	size_t _i;							\	uint8_t *_dst = (uint8_t*)(dst), *_src = (uint8_t*)(src);	\	for(_i = 0; _i < size; _i++) {					\	    WRITE((img), _dst +_i, READ((img), _src + _i));		\	}								\    } while (0)#define MEMSET_WRAPPED(img, dst, val, size)				\    do {								\	size_t _i;							\	uint8_t *_dst = (uint8_t*)(dst);				\	for(_i = 0; _i < (size_t) size; _i++) {				\	    WRITE((img), _dst +_i, (val));				\	}								\    } while (0)#else#define READ(img, ptr)		(*(ptr))#define WRITE(img, ptr, val)	(*(ptr) = (val))#define MEMCPY_WRAPPED(img, dst, src, size)					\    memcpy(dst, src, size)#define MEMSET_WRAPPED(img, dst, val, size)					\    memset(dst, val, size)#endif#define fbComposeGetSolid(img, res, fmt)				\    do									\    {									\	pixman_format_code_t format__;					\	if (img->type == SOLID)						\	{								\	    format__ = PIXMAN_a8r8g8b8;					\	    (res) = img->solid.color;					\	}								\	else								\	{								\	    uint32_t	       *bits__   = (img)->bits.bits;		\	    format__ = (img)->bits.format;				\		  							\	    switch (PIXMAN_FORMAT_BPP((img)->bits.format))		\	    {								\	    case 32:							\		(res) = READ(img, (uint32_t *)bits__);			\		break;							\	    case 24:							\		(res) = Fetch24(img, (uint8_t *) bits__);			\		break;							\	    case 16:							\		(res) = READ(img, (uint16_t *) bits__);			\		(res) = cvt0565to0888(res);				\		break;							\	    case 8:							\		(res) = READ(img, (uint8_t *) bits__);			\		(res) = (res) << 24;					\		break;							\	    case 1:							\		(res) = READ(img, (uint32_t *) bits__);			\		(res) = FbLeftStipBits((res),1) ? 0xff000000 : 0x00000000; \		break;							\	    default:							\		return;							\	    }								\	    /* manage missing src alpha */				\	    if (!PIXMAN_FORMAT_A((img)->bits.format))			\		(res) |= 0xff000000;					\	}								\									\	/* If necessary, convert RGB <--> BGR. */			\	if (PIXMAN_FORMAT_TYPE (format__) != PIXMAN_FORMAT_TYPE(fmt))	\	{								\	    (res) = ((((res) & 0xff000000) >>  0) |			\		     (((res) & 0x00ff0000) >> 16) |			\		     (((res) & 0x0000ff00) >>  0) |			\		     (((res) & 0x000000ff) << 16));			\	}								\    }									\    while (0)#define fbComposeGetStart(pict,x,y,type,out_stride,line,mul) do {	\	uint32_t	*__bits__;					\	int		__stride__;					\	int		__bpp__;					\									\	__bits__ = pict->bits.bits;					\	__stride__ = pict->bits.rowstride;				\	__bpp__ = PIXMAN_FORMAT_BPP(pict->bits.format);			\	(out_stride) = __stride__ * (int) sizeof (uint32_t) / (int) sizeof (type);	\	(line) = ((type *) __bits__) +					\	    (out_stride) * (y) + (mul) * (x);				\    } while (0)/* * Edges */#define MAX_ALPHA(n)	((1 << (n)) - 1)#define N_Y_FRAC(n)	((n) == 1 ? 1 : (1 << ((n)/2)) - 1)#define N_X_FRAC(n)	((n) == 1 ? 1 : (1 << ((n)/2)) + 1)#define STEP_Y_SMALL(n)	(pixman_fixed_1 / N_Y_FRAC(n))#define STEP_Y_BIG(n)	(pixman_fixed_1 - (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n))#define Y_FRAC_FIRST(n)	(STEP_Y_SMALL(n) / 2)#define Y_FRAC_LAST(n)	(Y_FRAC_FIRST(n) + (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n))#define STEP_X_SMALL(n)	(pixman_fixed_1 / N_X_FRAC(n))#define STEP_X_BIG(n)	(pixman_fixed_1 - (N_X_FRAC(n) - 1) * STEP_X_SMALL(n))#define X_FRAC_FIRST(n)	(STEP_X_SMALL(n) / 2)#define X_FRAC_LAST(n)	(X_FRAC_FIRST(n) + (N_X_FRAC(n) - 1) * STEP_X_SMALL(n))#define RenderSamplesX(x,n)	((n) == 1 ? 0 : (pixman_fixed_frac (x) + X_FRAC_FIRST(n)) / STEP_X_SMALL(n))/* * Step across a small sample grid gap */#define RenderEdgeStepSmall(edge) { \    edge->x += edge->stepx_small;   \    edge->e += edge->dx_small;	    \    if (edge->e > 0)		    \    {				    \	edge->e -= edge->dy;	    \	edge->x += edge->signdx;    \    }				    \}/* * Step across a large sample grid gap */#define RenderEdgeStepBig(edge) {   \    edge->x += edge->stepx_big;	    \    edge->e += edge->dx_big;	    \    if (edge->e > 0)		    \    {				    \	edge->e -= edge->dy;	    \	edge->x += edge->signdx;    \    }				    \}voidpixman_rasterize_edges_accessors (pixman_image_t *image,				  pixman_edge_t	*l,				  pixman_edge_t	*r,				  pixman_fixed_t	t,				  pixman_fixed_t	b);#ifdef PIXMAN_TIMING/* Timing */static inline uint64_toil_profile_stamp_rdtsc (void){    uint64_t ts;    __asm__ __volatile__("rdtsc\n" : "=A" (ts));    return ts;}#define OIL_STAMP oil_profile_stamp_rdtsctypedef struct PixmanTimer PixmanTimer;struct PixmanTimer{    int initialized;    const char *name;    uint64_t n_times;    uint64_t total;    PixmanTimer *next;};extern int timer_defined;void pixman_timer_register (PixmanTimer *timer);#define TIMER_BEGIN(tname)						\    {									\	static PixmanTimer	timer##tname;				\	uint64_t		begin##tname;				\									\	if (!timer##tname.initialized)					\	{								\	    timer##tname.initialized = 1;				\	    timer##tname.name = #tname;					\	    pixman_timer_register (&timer##tname);			\	}								\									\	timer##tname.n_times++;						\	begin##tname = OIL_STAMP();#define TIMER_END(tname)						\        timer##tname.total += OIL_STAMP() - begin##tname;		\    }#endif /* PIXMAN_TIMING */#endif /* PIXMAN_PRIVATE_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -