1 /* 2 * $XFree86: xc/programs/Xserver/fb/fbpict.h,v 1.7 2001/07/18 10:15:02 keithp Exp $ 3 * 4 * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. 5 * 6 * Permission to use, copy, modify, distribute, and sell this software and its 7 * documentation for any purpose is hereby granted without fee, provided that 8 * the above copyright notice appear in all copies and that both that 9 * copyright notice and this permission notice appear in supporting 10 * documentation, and that the name of Keith Packard not be used in 11 * advertising or publicity pertaining to distribution of the software without 12 * specific, written prior permission. Keith Packard makes no 13 * representations about the suitability of this software for any purpose. It 14 * is provided "as is" without express or implied warranty. 15 * 16 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 17 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 19 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 21 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22 * PERFORMANCE OF THIS SOFTWARE. 23 */ 24 25 #ifdef HAVE_DIX_CONFIG_H 26 #include <dix-config.h> 27 #endif 28 29 #ifndef _FBPICT_H_ 30 #define _FBPICT_H_ 31 32 //#include "renderedge.h" 33 34 #define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) ) 35 #define FbIntDiv(a,b) (((CARD16) (a) * 255) / (b)) 36 37 #define FbGet8(v,i) ((CARD16) (CARD8) ((v) >> i)) 38 39 /* 40 * There are two ways of handling alpha -- either as a single unified value or 41 * a separate value for each component, hence each macro must have two 42 * versions. The unified alpha version has a 'U' at the end of the name, 43 * the component version has a 'C'. Similarly, functions which deal with 44 * this difference will have two versions using the same convention. 45 */ 46 47 #define FbOverU(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),(a),(t)) + FbGet8(x,i),\ 48 (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) 49 50 #define FbOverC(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),FbGet8(a,i),(t)) + FbGet8(x,i),\ 51 (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) 52 53 #define FbInU(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),(a),(t)) << (i)) 54 55 #define FbInC(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),FbGet8(a,i),(t)) << (i)) 56 57 #define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \ 58 FbIntMult(FbGet8(x,i),ax,(v))),\ 59 (CARD32) ((CARD8) ((t) | \ 60 (0 - ((t) >> 8)))) << (i)) 61 62 #define FbAdd(x,y,i,t) ((t) = FbGet8(x,i) + FbGet8(y,i), \ 63 (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) 64 65 66 #define Alpha(x) ((x) >> 24) 67 #define Red(x) (((x) >> 16) & 0xff) 68 #define Green(x) (((x) >> 8) & 0xff) 69 #define Blue(x) ((x) & 0xff) 70 71 #define fbComposeGetSolid(pict, bits, fmt) { \ 72 FbBits *__bits__; \ 73 FbStride __stride__; \ 74 int __bpp__; \ 75 int __xoff__,__yoff__; \ 76 \ 77 fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \ 78 switch (__bpp__) { \ 79 case 32: \ 80 (bits) = *(CARD32 *) __bits__; \ 81 break; \ 82 case 24: \ 83 (bits) = Fetch24 ((CARD8 *) __bits__); \ 84 break; \ 85 case 16: \ 86 (bits) = *(CARD16 *) __bits__; \ 87 (bits) = cvt0565to8888(bits); \ 88 break; \ 89 default: \ 90 return; \ 91 } \ 92 /* If necessary, convert RGB <--> BGR. */ \ 93 if (PICT_FORMAT_TYPE((pict)->format) != PICT_FORMAT_TYPE(fmt)) \ 94 { \ 95 (bits) = (((bits) & 0xff000000) | \ 96 (((bits) & 0x00ff0000) >> 16) | \ 97 (((bits) & 0x0000ff00) >> 0) | \ 98 (((bits) & 0x000000ff) << 16)); \ 99 } \ 100 /* manage missing src alpha */ \ 101 if ((pict)->pFormat->direct.alphaMask == 0) \ 102 (bits) |= 0xff000000; \ 103 } 104 105 #define fbComposeGetStart(pict,x,y,type,stride,line,mul) {\ 106 FbBits *__bits__; \ 107 FbStride __stride__; \ 108 int __bpp__; \ 109 int __xoff__,__yoff__; \ 110 \ 111 fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \ 112 (stride) = __stride__ * sizeof (FbBits) / sizeof (type); \ 113 (line) = ((type *) __bits__) + (stride) * ((y) - __yoff__) + (mul) * ((x) - __xoff__); \ 114 } 115 #define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \ 116 (((s) >> 5) & 0x07e0) | \ 117 (((s) >> 8) & 0xf800)) 118 #define cvt0565to8888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ 119 ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ 120 ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) 121 122 #if IMAGE_BYTE_ORDER == MSBFirst 123 #define Fetch24(a) ((unsigned long) (a) & 1 ? \ 124 ((*(a) << 16) | *((CARD16 *) ((a)+1))) : \ 125 ((*((CARD16 *) (a)) << 8) | *((a)+2))) 126 #define Store24(a,v) ((unsigned long) (a) & 1 ? \ 127 ((*(a) = (CARD8) ((v) >> 16)), \ 128 (*((CARD16 *) ((a)+1)) = (CARD16) (v))) : \ 129 ((*((CARD16 *) (a)) = (CARD16) ((v) >> 8)), \ 130 (*((a)+2) = (CARD8) (v)))) 131 #else 132 #define Fetch24(a) ((unsigned long) (a) & 1 ? \ 133 ((*(a)) | (*((CARD16 *) ((a)+1)) << 8)) : \ 134 ((*((CARD16 *) (a))) | (*((a)+2) << 16))) 135 #define Store24(a,v) ((unsigned long) (a) & 1 ? \ 136 ((*(a) = (CARD8) (v)), \ 137 (*((CARD16 *) ((a)+1)) = (CARD16) ((v) >> 8))) : \ 138 ((*((CARD16 *) (a)) = (CARD16) (v)),\ 139 (*((a)+2) = (CARD8) ((v) >> 16)))) 140 #endif 141 142 /* 143 The methods below use some tricks to be able to do two color 144 components at the same time. 145 */ 146 147 /* 148 x_c = (x_c * a) / 255 149 */ 150 #define FbByteMul(x, a) do { \ 151 CARD32 t = (x & 0xff00ff) *a; \ 152 t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; \ 153 t &= 0xff00ff; \ 154 \ 155 x = ((x >> 8) & 0xff00ff) * a; \ 156 x = (x + ((x >> 8) & 0xff00ff) + 0x800080); \ 157 x &= 0xff00ff00; \ 158 x += t; \ 159 } while (0) 160 161 /* 162 x_c = (x_c * a) / 255 + y 163 */ 164 #define FbByteMulAdd(x, a, y) do { \ 165 CARD32 t = (x & 0xff00ff) * a; \ 166 t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; \ 167 t &= 0xff00ff; \ 168 t += y & 0xff00ff; \ 169 t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ 170 t &= 0xff00ff; \ 171 \ 172 x = ((x >> 8) & 0xff00ff) * a; \ 173 x = (x + ((x >> 8) & 0xff00ff) + 0x800080) >> 8; \ 174 x &= 0xff00ff; \ 175 x += (y >> 8) & 0xff00ff; \ 176 x |= 0x1000100 - ((t >> 8) & 0xff00ff); \ 177 x &= 0xff00ff; \ 178 x <<= 8; \ 179 x += t; \ 180 } while (0) 181 182 /* 183 x_c = (x_c * a + y_c * b) / 255 184 */ 185 #define FbByteAddMul(x, a, y, b) do { \ 186 CARD32 t; \ 187 CARD32 r = (x >> 24) * a + (y >> 24) * b; \ 188 r += (r >> 8) + 0x80; \ 189 r >>= 8; \ 190 \ 191 t = (x & 0xff00) * a + (y & 0xff00) * b; \ 192 t += (t >> 8) + 0x8000; \ 193 t >>= 16; \ 194 \ 195 t |= r << 16; \ 196 t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ 197 t &= 0xff00ff; \ 198 t <<= 8; \ 199 \ 200 r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b; \ 201 r += (r >> 8) + 0x80; \ 202 r >>= 8; \ 203 \ 204 x = (x & 0xff) * a + (y & 0xff) * b; \ 205 x += (x >> 8) + 0x80; \ 206 x >>= 8; \ 207 x |= r << 16; \ 208 x |= 0x1000100 - ((x >> 8) & 0xff00ff); \ 209 x &= 0xff00ff; \ 210 x |= t; \ 211 } while (0) 212 213 /* 214 x_c = (x_c * a + y_c *b) / 256 215 */ 216 #define FbByteAddMul_256(x, a, y, b) do { \ 217 CARD32 t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; \ 218 t >>= 8; \ 219 t &= 0xff00ff; \ 220 \ 221 x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; \ 222 x &= 0xff00ff00; \ 223 x += t; \ 224 } while (0) 225 /* 226 x_c = (x_c * a_c) / 255 227 */ 228 #define FbByteMulC(x, a) do { \ 229 CARD32 t; \ 230 CARD32 r = (x & 0xff) * (a & 0xff); \ 231 r |= (x & 0xff0000) * ((a >> 16) & 0xff); \ 232 r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8; \ 233 r &= 0xff00ff; \ 234 \ 235 x >>= 8; \ 236 t = (x & 0xff) * ((a >> 8) & 0xff); \ 237 t |= (x & 0xff0000) * (a >> 24); \ 238 t = (t + ((t >> 8) & 0xff00ff) + 0x800080); \ 239 x = r | (t & 0xff00ff00); \ 240 \ 241 } while (0) 242 243 /* 244 x_c = (x_c * a) / 255 + y 245 */ 246 #define FbByteMulAddC(x, a, y) do { \ 247 CARD32 t; \ 248 CARD32 r = (x & 0xff) * (a & 0xff); \ 249 r |= (x & 0xff0000) * ((a >> 16) & 0xff); \ 250 r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8; \ 251 r &= 0xff00ff; \ 252 r += y & 0xff00ff; \ 253 r |= 0x1000100 - ((r >> 8) & 0xff00ff); \ 254 r &= 0xff00ff; \ 255 \ 256 x >>= 8; \ 257 t = (x & 0xff) * ((a >> 8) & 0xff); \ 258 t |= (x & 0xff0000) * (a >> 24); \ 259 t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; \ 260 t &= 0xff00ff; \ 261 t += (y >> 8) & 0xff00ff; \ 262 t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ 263 t &= 0xff00ff; \ 264 x = r | (t << 8); \ 265 } while (0) 266 267 /* 268 x_c = (x_c * a_c + y_c * b) / 255 269 */ 270 #define FbByteAddMulC(x, a, y, b) do { \ 271 CARD32 t; \ 272 CARD32 r = (x >> 24) * (a >> 24) + (y >> 24) * b; \ 273 r += (r >> 8) + 0x80; \ 274 r >>= 8; \ 275 \ 276 t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b; \ 277 t += (t >> 8) + 0x8000; \ 278 t >>= 16; \ 279 \ 280 t |= r << 16; \ 281 t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ 282 t &= 0xff00ff; \ 283 t <<= 8; \ 284 \ 285 r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b; \ 286 r += (r >> 8) + 0x80; \ 287 r >>= 8; \ 288 \ 289 x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b; \ 290 x += (x >> 8) + 0x80; \ 291 x >>= 8; \ 292 x |= r << 16; \ 293 x |= 0x1000100 - ((x >> 8) & 0xff00ff); \ 294 x &= 0xff00ff; \ 295 x |= t; \ 296 } while (0) 297 298 /* 299 x_c = min(x_c + y_c, 255) 300 */ 301 #define FbByteAdd(x, y) do { \ 302 CARD32 t; \ 303 CARD32 r = (x & 0xff00ff) + (y & 0xff00ff); \ 304 r |= 0x1000100 - ((r >> 8) & 0xff00ff); \ 305 r &= 0xff00ff; \ 306 \ 307 t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff); \ 308 t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ 309 r |= (t & 0xff00ff) << 8; \ 310 x = r; \ 311 } while (0) 312 313 #define div_255(x) (((x) + ((x) >> 8) + 0x80) >> 8) 314 315 #if defined(__i386__) && defined(__GNUC__) 316 #define FASTCALL __attribute__((regparm(3))) 317 #else 318 #define FASTCALL 319 #endif 320 321 #if defined(__GNUC__) 322 #define INLINE __inline__ 323 #else 324 #define INLINE 325 #endif 326 327 typedef struct _FbComposeData { 328 CARD8 op; 329 PicturePtr src; 330 PicturePtr mask; 331 PicturePtr dest; 332 INT16 xSrc; 333 INT16 ySrc; 334 INT16 xMask; 335 INT16 yMask; 336 INT16 xDest; 337 INT16 yDest; 338 CARD16 width; 339 CARD16 height; 340 } FbComposeData; 341 342 #if 0 343 typedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width); 344 typedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width); 345 typedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width); 346 347 typedef struct _FbComposeFunctions { 348 CombineFuncU *combineU; 349 CombineFuncC *combineC; 350 CombineMaskU combineMaskU; 351 } FbComposeFunctions; 352 353 /* fbcompose.c */ 354 355 void 356 fbCompositeGeneral (CARD8 op, 357 PicturePtr pSrc, 358 PicturePtr pMask, 359 PicturePtr pDst, 360 INT16 xSrc, 361 INT16 ySrc, 362 INT16 xMask, 363 INT16 yMask, 364 INT16 xDst, 365 INT16 yDst, 366 CARD16 width, 367 CARD16 height); 368 369 370 /* fbedge.c */ 371 void 372 fbRasterizeEdges (FbBits *buf, 373 int bpp, 374 int width, 375 int stride, 376 RenderEdge *l, 377 RenderEdge *r, 378 xFixed t, 379 xFixed b); 380 381 /* fbpict.c */ 382 CARD32 383 fbOver (CARD32 x, CARD32 y); 384 385 CARD32 386 fbOver24 (CARD32 x, CARD32 y); 387 388 CARD32 389 fbIn (CARD32 x, CARD8 y); 390 391 void 392 fbCompositeSolidMask_nx8x8888 (CARD8 op, 393 PicturePtr pSrc, 394 PicturePtr pMask, 395 PicturePtr pDst, 396 INT16 xSrc, 397 INT16 ySrc, 398 INT16 xMask, 399 INT16 yMask, 400 INT16 xDst, 401 INT16 yDst, 402 CARD16 width, 403 CARD16 height); 404 405 void 406 fbCompositeSolidMask_nx8x0888 (CARD8 op, 407 PicturePtr pSrc, 408 PicturePtr pMask, 409 PicturePtr pDst, 410 INT16 xSrc, 411 INT16 ySrc, 412 INT16 xMask, 413 INT16 yMask, 414 INT16 xDst, 415 INT16 yDst, 416 CARD16 width, 417 CARD16 height); 418 419 void 420 fbCompositeSolidMask_nx8888x8888C (CARD8 op, 421 PicturePtr pSrc, 422 PicturePtr pMask, 423 PicturePtr pDst, 424 INT16 xSrc, 425 INT16 ySrc, 426 INT16 xMask, 427 INT16 yMask, 428 INT16 xDst, 429 INT16 yDst, 430 CARD16 width, 431 CARD16 height); 432 433 void 434 fbCompositeSolidMask_nx8x0565 (CARD8 op, 435 PicturePtr pSrc, 436 PicturePtr pMask, 437 PicturePtr pDst, 438 INT16 xSrc, 439 INT16 ySrc, 440 INT16 xMask, 441 INT16 yMask, 442 INT16 xDst, 443 INT16 yDst, 444 CARD16 width, 445 CARD16 height); 446 447 void 448 fbCompositeSolidMask_nx8888x0565C (CARD8 op, 449 PicturePtr pSrc, 450 PicturePtr pMask, 451 PicturePtr pDst, 452 INT16 xSrc, 453 INT16 ySrc, 454 INT16 xMask, 455 INT16 yMask, 456 INT16 xDst, 457 INT16 yDst, 458 CARD16 width, 459 CARD16 height); 460 461 void 462 fbCompositeSrc_8888x8888 (CARD8 op, 463 PicturePtr pSrc, 464 PicturePtr pMask, 465 PicturePtr pDst, 466 INT16 xSrc, 467 INT16 ySrc, 468 INT16 xMask, 469 INT16 yMask, 470 INT16 xDst, 471 INT16 yDst, 472 CARD16 width, 473 CARD16 height); 474 475 void 476 fbCompositeSrc_8888x0888 (CARD8 op, 477 PicturePtr pSrc, 478 PicturePtr pMask, 479 PicturePtr pDst, 480 INT16 xSrc, 481 INT16 ySrc, 482 INT16 xMask, 483 INT16 yMask, 484 INT16 xDst, 485 INT16 yDst, 486 CARD16 width, 487 CARD16 height); 488 489 void 490 fbCompositeSrc_8888x0565 (CARD8 op, 491 PicturePtr pSrc, 492 PicturePtr pMask, 493 PicturePtr pDst, 494 INT16 xSrc, 495 INT16 ySrc, 496 INT16 xMask, 497 INT16 yMask, 498 INT16 xDst, 499 INT16 yDst, 500 CARD16 width, 501 CARD16 height); 502 503 void 504 fbCompositeSrc_0565x0565 (CARD8 op, 505 PicturePtr pSrc, 506 PicturePtr pMask, 507 PicturePtr pDst, 508 INT16 xSrc, 509 INT16 ySrc, 510 INT16 xMask, 511 INT16 yMask, 512 INT16 xDst, 513 INT16 yDst, 514 CARD16 width, 515 CARD16 height); 516 517 void 518 fbCompositeSrcAdd_8000x8000 (CARD8 op, 519 PicturePtr pSrc, 520 PicturePtr pMask, 521 PicturePtr pDst, 522 INT16 xSrc, 523 INT16 ySrc, 524 INT16 xMask, 525 INT16 yMask, 526 INT16 xDst, 527 INT16 yDst, 528 CARD16 width, 529 CARD16 height); 530 531 void 532 fbCompositeSrcAdd_8888x8888 (CARD8 op, 533 PicturePtr pSrc, 534 PicturePtr pMask, 535 PicturePtr pDst, 536 INT16 xSrc, 537 INT16 ySrc, 538 INT16 xMask, 539 INT16 yMask, 540 INT16 xDst, 541 INT16 yDst, 542 CARD16 width, 543 CARD16 height); 544 545 void 546 fbCompositeSrcAdd_1000x1000 (CARD8 op, 547 PicturePtr pSrc, 548 PicturePtr pMask, 549 PicturePtr pDst, 550 INT16 xSrc, 551 INT16 ySrc, 552 INT16 xMask, 553 INT16 yMask, 554 INT16 xDst, 555 INT16 yDst, 556 CARD16 width, 557 CARD16 height); 558 559 void 560 fbCompositeSolidMask_nx1xn (CARD8 op, 561 PicturePtr pSrc, 562 PicturePtr pMask, 563 PicturePtr pDst, 564 INT16 xSrc, 565 INT16 ySrc, 566 INT16 xMask, 567 INT16 yMask, 568 INT16 xDst, 569 INT16 yDst, 570 CARD16 width, 571 CARD16 height); 572 573 void 574 fbComposite (CARD8 op, 575 PicturePtr pSrc, 576 PicturePtr pMask, 577 PicturePtr pDst, 578 INT16 xSrc, 579 INT16 ySrc, 580 INT16 xMask, 581 INT16 yMask, 582 INT16 xDst, 583 INT16 yDst, 584 CARD16 width, 585 CARD16 height); 586 587 /* fbtrap.c */ 588 589 void 590 fbAddTraps (PicturePtr pPicture, 591 INT16 xOff, 592 INT16 yOff, 593 int ntrap, 594 xTrap *traps); 595 596 void 597 fbRasterizeTrapezoid (PicturePtr alpha, 598 xTrapezoid *trap, 599 int x_off, 600 int y_off); 601 602 void 603 fbAddTriangles (PicturePtr pPicture, 604 INT16 xOff, 605 INT16 yOff, 606 int ntri, 607 xTriangle *tris); 608 #endif 609 610 #endif /* _FBPICT_H_ */ 611