📄 pixman-private.h
字号:
#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 + -