bits2pixels.c revision 6df26cac
1/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/vmware/bits2pixels.c,v 1.1 2001/04/05 19:29:43 dawes Exp $ */ 2/* ********************************************************** 3 * Copyright (C) 1999-2001 VMware, Inc. 4 * All Rights Reserved 5 * **********************************************************/ 6#ifdef VMX86_DEVEL 7char rcsId_bits2pixels[] = "Id: bits2pixels.c,v 1.6 2001/01/26 23:32:15 yoel Exp $"; 8#else 9#define FILECODE "F(814)" 10#endif 11 12#ifdef HAVE_CONFIG_H 13#include "config.h" 14#endif 15 16/* 17 * bits2pixels.c -- 18 * 19 * Emulation routines to convert bitmaps to pixmaps 20 */ 21 22#include "vm_basic_types.h" 23#include "bits2pixels.h" 24 25 26/* 27 * Local functions 28 */ 29 30static void RasterBitsToPixels8(uint8 *bits, uint32 bits_increment, 31 uint8 *pix, uint32 pix_increment, 32 uint32 width, uint32 height, uint32 fg, uint32 bg); 33 34static void RasterBitsToPixels16(uint8 *bits, uint32 bits_increment, 35 uint8 *pix, uint32 pix_increment, 36 uint32 width, uint32 height, uint32 fg, uint32 bg); 37 38static void RasterBitsToPixels24(uint8 *bits, uint32 bits_increment, 39 uint8 *pix, uint32 pix_increment, 40 uint32 width, uint32 height, uint32 fg, uint32 bg); 41 42static void RasterBitsToPixels32(uint8 *bits, uint32 bits_increment, 43 uint8 *pix, uint32 pix_increment, 44 uint32 width, uint32 height, uint32 fg, uint32 bg); 45 46 47/* 48 *---------------------------------------------------------------------- 49 * 50 * vmwareRaster_BitsToPixels -- 51 * 52 * Convert a bitmap to a pixmap, converting 1 bits to the foreground 53 * color (fg) and 0 bits to the background color (bg). 54 * 55 * Results: 56 * Pixmap filled with pixels 57 * 58 * Side effects: 59 * None 60 * 61 *---------------------------------------------------------------------- 62 */ 63 64void 65vmwareRaster_BitsToPixels(uint8 *bits, uint32 bits_increment, 66 uint8 *pix, uint32 pix_increment, int bytes_per_pixel, 67 uint32 width, uint32 height, uint32 fg, uint32 bg) 68{ 69 switch (bytes_per_pixel) { 70 case 1: 71 RasterBitsToPixels8(bits, bits_increment, pix, pix_increment, 72 width, height, fg, bg); 73 break; 74 75 case 2: 76 RasterBitsToPixels16(bits, bits_increment, pix, pix_increment, 77 width, height, fg, bg); 78 break; 79 80 case 3: 81 RasterBitsToPixels24(bits, bits_increment, pix, pix_increment, 82 width, height, fg, bg); 83 break; 84 85 case 4: 86 RasterBitsToPixels32(bits, bits_increment, pix, pix_increment, 87 width, height, fg, bg); 88 break; 89 } 90} 91 92 93/* 94 *---------------------------------------------------------------------- 95 * 96 * RasterBitsToPixels8 -- 97 * 98 * Convert a bitmap to a pixmap, converting 1 bits to the foreground 99 * color (fg) and 0 bits to the background color (bg), for an 8-bit 100 * pixmap 101 * 102 * Results: 103 * Pixmap filled with pixels 104 * 105 * Side effects: 106 * None 107 * 108 *---------------------------------------------------------------------- 109 */ 110 111void 112RasterBitsToPixels8(uint8 *bits, uint32 bits_increment, 113 uint8 *pix, uint32 pix_increment, 114 uint32 width, uint32 height, uint32 fg, uint32 bg) 115{ 116 uint8 *lpix, *lbits; 117 int i, j; 118 uint32 expbits = 0; /* Bits to be expanded */ 119 120 for (i=0; i<height; i++) { 121 lpix = pix; 122 lbits = bits; 123 for (j = width ; j > 0; j -= 4) { 124 expbits = (*lbits >> 4) & 0x0f; 125 126 if (j < 4) 127 break; 128 129 switch (expbits) { 130 case 0: 131 *lpix++ = bg; 132 *lpix++ = bg; 133 *lpix++ = bg; 134 *lpix++ = bg; 135 break; 136 case 1: 137 *lpix++ = bg; 138 *lpix++ = bg; 139 *lpix++ = bg; 140 *lpix++ = fg; 141 break; 142 case 2: 143 *lpix++ = bg; 144 *lpix++ = bg; 145 *lpix++ = fg; 146 *lpix++ = bg; 147 break; 148 case 3: 149 *lpix++ = bg; 150 *lpix++ = bg; 151 *lpix++ = fg; 152 *lpix++ = fg; 153 break; 154 case 4: 155 *lpix++ = bg; 156 *lpix++ = fg; 157 *lpix++ = bg; 158 *lpix++ = bg; 159 break; 160 case 5: 161 *lpix++ = bg; 162 *lpix++ = fg; 163 *lpix++ = bg; 164 *lpix++ = fg; 165 break; 166 case 6: 167 *lpix++ = bg; 168 *lpix++ = fg; 169 *lpix++ = fg; 170 *lpix++ = bg; 171 break; 172 case 7: 173 *lpix++ = bg; 174 *lpix++ = fg; 175 *lpix++ = fg; 176 *lpix++ = fg; 177 break; 178 case 8: 179 *lpix++ = fg; 180 *lpix++ = bg; 181 *lpix++ = bg; 182 *lpix++ = bg; 183 break; 184 case 9: 185 *lpix++ = fg; 186 *lpix++ = bg; 187 *lpix++ = bg; 188 *lpix++ = fg; 189 break; 190 case 10: 191 *lpix++ = fg; 192 *lpix++ = bg; 193 *lpix++ = fg; 194 *lpix++ = bg; 195 break; 196 case 11: 197 *lpix++ = fg; 198 *lpix++ = bg; 199 *lpix++ = fg; 200 *lpix++ = fg; 201 break; 202 case 12: 203 *lpix++ = fg; 204 *lpix++ = fg; 205 *lpix++ = bg; 206 *lpix++ = bg; 207 break; 208 case 13: 209 *lpix++ = fg; 210 *lpix++ = fg; 211 *lpix++ = bg; 212 *lpix++ = fg; 213 break; 214 case 14: 215 *lpix++ = fg; 216 *lpix++ = fg; 217 *lpix++ = fg; 218 *lpix++ = bg; 219 break; 220 case 15: 221 *lpix++ = fg; 222 *lpix++ = fg; 223 *lpix++ = fg; 224 *lpix++ = fg; 225 break; 226 } 227 228 expbits = *lbits & 0x0f; 229 230 j -= 4; 231 if (j < 4) { 232 break; 233 } 234 235 switch (expbits) { 236 case 0: 237 *lpix++ = bg; 238 *lpix++ = bg; 239 *lpix++ = bg; 240 *lpix++ = bg; 241 break; 242 case 1: 243 *lpix++ = bg; 244 *lpix++ = bg; 245 *lpix++ = bg; 246 *lpix++ = fg; 247 break; 248 case 2: 249 *lpix++ = bg; 250 *lpix++ = bg; 251 *lpix++ = fg; 252 *lpix++ = bg; 253 break; 254 case 3: 255 *lpix++ = bg; 256 *lpix++ = bg; 257 *lpix++ = fg; 258 *lpix++ = fg; 259 break; 260 case 4: 261 *lpix++ = bg; 262 *lpix++ = fg; 263 *lpix++ = bg; 264 *lpix++ = bg; 265 break; 266 case 5: 267 *lpix++ = bg; 268 *lpix++ = fg; 269 *lpix++ = bg; 270 *lpix++ = fg; 271 break; 272 case 6: 273 *lpix++ = bg; 274 *lpix++ = fg; 275 *lpix++ = fg; 276 *lpix++ = bg; 277 break; 278 case 7: 279 *lpix++ = bg; 280 *lpix++ = fg; 281 *lpix++ = fg; 282 *lpix++ = fg; 283 break; 284 case 8: 285 *lpix++ = fg; 286 *lpix++ = bg; 287 *lpix++ = bg; 288 *lpix++ = bg; 289 break; 290 case 9: 291 *lpix++ = fg; 292 *lpix++ = bg; 293 *lpix++ = bg; 294 *lpix++ = fg; 295 break; 296 case 10: 297 *lpix++ = fg; 298 *lpix++ = bg; 299 *lpix++ = fg; 300 *lpix++ = bg; 301 break; 302 case 11: 303 *lpix++ = fg; 304 *lpix++ = bg; 305 *lpix++ = fg; 306 *lpix++ = fg; 307 break; 308 case 12: 309 *lpix++ = fg; 310 *lpix++ = fg; 311 *lpix++ = bg; 312 *lpix++ = bg; 313 break; 314 case 13: 315 *lpix++ = fg; 316 *lpix++ = fg; 317 *lpix++ = bg; 318 *lpix++ = fg; 319 break; 320 case 14: 321 *lpix++ = fg; 322 *lpix++ = fg; 323 *lpix++ = fg; 324 *lpix++ = bg; 325 break; 326 case 15: 327 *lpix++ = fg; 328 *lpix++ = fg; 329 *lpix++ = fg; 330 *lpix++ = fg; 331 break; 332 } 333 lbits++; 334 } 335 336 if (j > 0) { 337 *lpix++ = (expbits & 0x08) ? fg : bg; 338 j--; 339 if (j > 0) { 340 *lpix++ = (expbits & 0x04) ? fg : bg; 341 j--; 342 if (j > 0) { 343 *lpix++ = (expbits & 0x02) ? fg : bg; 344 j--; 345 } 346 } 347 } 348 349 pix += pix_increment; 350 bits += bits_increment; 351 } 352 return; 353} 354 355 356/* 357 *---------------------------------------------------------------------- 358 * 359 * RasterBitsToPixels16 -- 360 * 361 * Convert a bitmap to a pixmap, converting 1 bits to the foreground 362 * color (fg) and 0 bits to the background color (bg), for a 16-bit 363 * pixmap 364 * 365 * Results: 366 * Pixmap filled with pixels 367 * 368 * Side effects: 369 * None 370 * 371 *---------------------------------------------------------------------- 372 */ 373 374void 375RasterBitsToPixels16(uint8 *bits, uint32 bits_increment, 376 uint8 *pix, uint32 pix_increment, 377 uint32 width, uint32 height, uint32 fg, uint32 bg) 378{ 379 uint16 *lpix; 380 uint8 *lbits; 381 int i, j; 382 uint32 expbits = 0; /* Bits to be expanded */ 383 384 for (i=0; i<height; i++) { 385 lpix = (uint16 *)pix; 386 lbits = bits; 387 for (j = width; j > 0; j -= 4) { 388 expbits = (*lbits >> 4) & 0x0f; 389 390 if (j < 4) 391 break; 392 393 switch (expbits) { 394 case 0: 395 *lpix++ = bg; 396 *lpix++ = bg; 397 *lpix++ = bg; 398 *lpix++ = bg; 399 break; 400 case 1: 401 *lpix++ = bg; 402 *lpix++ = bg; 403 *lpix++ = bg; 404 *lpix++ = fg; 405 break; 406 case 2: 407 *lpix++ = bg; 408 *lpix++ = bg; 409 *lpix++ = fg; 410 *lpix++ = bg; 411 break; 412 case 3: 413 *lpix++ = bg; 414 *lpix++ = bg; 415 *lpix++ = fg; 416 *lpix++ = fg; 417 break; 418 case 4: 419 *lpix++ = bg; 420 *lpix++ = fg; 421 *lpix++ = bg; 422 *lpix++ = bg; 423 break; 424 case 5: 425 *lpix++ = bg; 426 *lpix++ = fg; 427 *lpix++ = bg; 428 *lpix++ = fg; 429 break; 430 case 6: 431 *lpix++ = bg; 432 *lpix++ = fg; 433 *lpix++ = fg; 434 *lpix++ = bg; 435 break; 436 case 7: 437 *lpix++ = bg; 438 *lpix++ = fg; 439 *lpix++ = fg; 440 *lpix++ = fg; 441 break; 442 case 8: 443 *lpix++ = fg; 444 *lpix++ = bg; 445 *lpix++ = bg; 446 *lpix++ = bg; 447 break; 448 case 9: 449 *lpix++ = fg; 450 *lpix++ = bg; 451 *lpix++ = bg; 452 *lpix++ = fg; 453 break; 454 case 10: 455 *lpix++ = fg; 456 *lpix++ = bg; 457 *lpix++ = fg; 458 *lpix++ = bg; 459 break; 460 case 11: 461 *lpix++ = fg; 462 *lpix++ = bg; 463 *lpix++ = fg; 464 *lpix++ = fg; 465 break; 466 case 12: 467 *lpix++ = fg; 468 *lpix++ = fg; 469 *lpix++ = bg; 470 *lpix++ = bg; 471 break; 472 case 13: 473 *lpix++ = fg; 474 *lpix++ = fg; 475 *lpix++ = bg; 476 *lpix++ = fg; 477 break; 478 case 14: 479 *lpix++ = fg; 480 *lpix++ = fg; 481 *lpix++ = fg; 482 *lpix++ = bg; 483 break; 484 case 15: 485 *lpix++ = fg; 486 *lpix++ = fg; 487 *lpix++ = fg; 488 *lpix++ = fg; 489 break; 490 } 491 492 expbits = *lbits & 0x0f; 493 494 j -= 4; 495 if (j < 4) { 496 break; 497 } 498 499 switch (expbits) { 500 case 0: 501 *lpix++ = bg; 502 *lpix++ = bg; 503 *lpix++ = bg; 504 *lpix++ = bg; 505 break; 506 case 1: 507 *lpix++ = bg; 508 *lpix++ = bg; 509 *lpix++ = bg; 510 *lpix++ = fg; 511 break; 512 case 2: 513 *lpix++ = bg; 514 *lpix++ = bg; 515 *lpix++ = fg; 516 *lpix++ = bg; 517 break; 518 case 3: 519 *lpix++ = bg; 520 *lpix++ = bg; 521 *lpix++ = fg; 522 *lpix++ = fg; 523 break; 524 case 4: 525 *lpix++ = bg; 526 *lpix++ = fg; 527 *lpix++ = bg; 528 *lpix++ = bg; 529 break; 530 case 5: 531 *lpix++ = bg; 532 *lpix++ = fg; 533 *lpix++ = bg; 534 *lpix++ = fg; 535 break; 536 case 6: 537 *lpix++ = bg; 538 *lpix++ = fg; 539 *lpix++ = fg; 540 *lpix++ = bg; 541 break; 542 case 7: 543 *lpix++ = bg; 544 *lpix++ = fg; 545 *lpix++ = fg; 546 *lpix++ = fg; 547 break; 548 case 8: 549 *lpix++ = fg; 550 *lpix++ = bg; 551 *lpix++ = bg; 552 *lpix++ = bg; 553 break; 554 case 9: 555 *lpix++ = fg; 556 *lpix++ = bg; 557 *lpix++ = bg; 558 *lpix++ = fg; 559 break; 560 case 10: 561 *lpix++ = fg; 562 *lpix++ = bg; 563 *lpix++ = fg; 564 *lpix++ = bg; 565 break; 566 case 11: 567 *lpix++ = fg; 568 *lpix++ = bg; 569 *lpix++ = fg; 570 *lpix++ = fg; 571 break; 572 case 12: 573 *lpix++ = fg; 574 *lpix++ = fg; 575 *lpix++ = bg; 576 *lpix++ = bg; 577 break; 578 case 13: 579 *lpix++ = fg; 580 *lpix++ = fg; 581 *lpix++ = bg; 582 *lpix++ = fg; 583 break; 584 case 14: 585 *lpix++ = fg; 586 *lpix++ = fg; 587 *lpix++ = fg; 588 *lpix++ = bg; 589 break; 590 case 15: 591 *lpix++ = fg; 592 *lpix++ = fg; 593 *lpix++ = fg; 594 *lpix++ = fg; 595 break; 596 } 597 lbits++; 598 } 599 600 if (j > 0) { 601 *lpix++ = (expbits & 0x08) ? fg : bg; 602 j--; 603 if (j > 0) { 604 *lpix++ = (expbits & 0x04) ? fg : bg; 605 j--; 606 if (j > 0) { 607 *lpix++ = (expbits & 0x02) ? fg : bg; 608 j--; 609 } 610 } 611 } 612 613 pix += pix_increment; 614 bits += bits_increment; 615 } 616 return; 617} 618 619 620 621/* 622 *---------------------------------------------------------------------- 623 * 624 * RasterBitsToPixels24 -- 625 * 626 * Convert a bitmap to a pixmap, converting 1 bits to the foreground 627 * color (fg) and 0 bits to the background color (bg), for a 24-bit 628 * pixmap 629 * 630 * Results: 631 * Pixmap filled with pixels 632 * 633 * Side effects: 634 * None 635 * 636 *---------------------------------------------------------------------- 637 */ 638 639void 640RasterBitsToPixels24(uint8 *bits, uint32 bits_increment, 641 uint8 *pix, uint32 pix_increment, 642 uint32 width, uint32 height, uint32 fg, uint32 bg) 643{ 644 uint8 *lpix, *lbits; 645 uint32 fgColor1, fgColor2, fgColor3; 646 uint32 bgColor1, bgColor2, bgColor3; 647 648 int i, j; 649 uint32 expbits = 0; /* Bits to be expanded */ 650 651 fgColor1 = fg & 0x000000ff; 652 fgColor2 = (fg >> 8) & 0x000000ff; 653 fgColor3 = (fg >> 16) & 0x000000ff; 654 655 bgColor1 = bg & 0x000000ff; 656 bgColor2 = (bg >> 8) & 0x000000ff; 657 bgColor3 = (bg >> 16) & 0x000000ff; 658 659 for (i=0; i<height; i++) { 660 lpix = pix; 661 lbits = bits; 662 for (j = width; j > 0; j -= 4) { 663 expbits = (*lbits >> 4) & 0x0f; 664 665 if (j < 4) 666 break; 667 668 switch (expbits) { 669 case 0: 670 *lpix++ = bgColor1; 671 *lpix++ = bgColor2; 672 *lpix++ = bgColor3; 673 *lpix++ = bgColor1; 674 *lpix++ = bgColor2; 675 *lpix++ = bgColor3; 676 *lpix++ = bgColor1; 677 *lpix++ = bgColor2; 678 *lpix++ = bgColor3; 679 *lpix++ = bgColor1; 680 *lpix++ = bgColor2; 681 *lpix++ = bgColor3; 682 break; 683 case 1: 684 *lpix++ = bgColor1; 685 *lpix++ = bgColor2; 686 *lpix++ = bgColor3; 687 *lpix++ = bgColor1; 688 *lpix++ = bgColor2; 689 *lpix++ = bgColor3; 690 *lpix++ = bgColor1; 691 *lpix++ = bgColor2; 692 *lpix++ = bgColor3; 693 *lpix++ = fgColor1; 694 *lpix++ = fgColor2; 695 *lpix++ = fgColor3; 696 break; 697 case 2: 698 *lpix++ = bgColor1; 699 *lpix++ = bgColor2; 700 *lpix++ = bgColor3; 701 *lpix++ = bgColor1; 702 *lpix++ = bgColor2; 703 *lpix++ = bgColor3; 704 *lpix++ = fgColor1; 705 *lpix++ = fgColor2; 706 *lpix++ = fgColor3; 707 *lpix++ = bgColor1; 708 *lpix++ = bgColor2; 709 *lpix++ = bgColor3; 710 break; 711 case 3: 712 *lpix++ = bgColor1; 713 *lpix++ = bgColor2; 714 *lpix++ = bgColor3; 715 *lpix++ = bgColor1; 716 *lpix++ = bgColor2; 717 *lpix++ = bgColor3; 718 *lpix++ = fgColor1; 719 *lpix++ = fgColor2; 720 *lpix++ = fgColor3; 721 *lpix++ = fgColor1; 722 *lpix++ = fgColor2; 723 *lpix++ = fgColor3; 724 break; 725 case 4: 726 *lpix++ = bgColor1; 727 *lpix++ = bgColor2; 728 *lpix++ = bgColor3; 729 *lpix++ = fgColor1; 730 *lpix++ = fgColor2; 731 *lpix++ = fgColor3; 732 *lpix++ = bgColor1; 733 *lpix++ = bgColor2; 734 *lpix++ = bgColor3; 735 *lpix++ = bgColor1; 736 *lpix++ = bgColor2; 737 *lpix++ = bgColor3; 738 break; 739 case 5: 740 *lpix++ = bgColor1; 741 *lpix++ = bgColor2; 742 *lpix++ = bgColor3; 743 *lpix++ = fgColor1; 744 *lpix++ = fgColor2; 745 *lpix++ = fgColor3; 746 *lpix++ = bgColor1; 747 *lpix++ = bgColor2; 748 *lpix++ = bgColor3; 749 *lpix++ = fgColor1; 750 *lpix++ = fgColor2; 751 *lpix++ = fgColor3; 752 break; 753 case 6: 754 *lpix++ = bgColor1; 755 *lpix++ = bgColor2; 756 *lpix++ = bgColor3; 757 *lpix++ = fgColor1; 758 *lpix++ = fgColor2; 759 *lpix++ = fgColor3; 760 *lpix++ = fgColor1; 761 *lpix++ = fgColor2; 762 *lpix++ = fgColor3; 763 *lpix++ = bgColor1; 764 *lpix++ = bgColor2; 765 *lpix++ = bgColor3; 766 break; 767 case 7: 768 *lpix++ = bgColor1; 769 *lpix++ = bgColor2; 770 *lpix++ = bgColor3; 771 *lpix++ = fgColor1; 772 *lpix++ = fgColor2; 773 *lpix++ = fgColor3; 774 *lpix++ = fgColor1; 775 *lpix++ = fgColor2; 776 *lpix++ = fgColor3; 777 *lpix++ = fgColor1; 778 *lpix++ = fgColor2; 779 *lpix++ = fgColor3; 780 break; 781 case 8: 782 *lpix++ = fgColor1; 783 *lpix++ = fgColor2; 784 *lpix++ = fgColor3; 785 *lpix++ = bgColor1; 786 *lpix++ = bgColor2; 787 *lpix++ = bgColor3; 788 *lpix++ = bgColor1; 789 *lpix++ = bgColor2; 790 *lpix++ = bgColor3; 791 *lpix++ = bgColor1; 792 *lpix++ = bgColor2; 793 *lpix++ = bgColor3; 794 break; 795 case 9: 796 *lpix++ = fgColor1; 797 *lpix++ = fgColor2; 798 *lpix++ = fgColor3; 799 *lpix++ = bgColor1; 800 *lpix++ = bgColor2; 801 *lpix++ = bgColor3; 802 *lpix++ = bgColor1; 803 *lpix++ = bgColor2; 804 *lpix++ = bgColor3; 805 *lpix++ = fgColor1; 806 *lpix++ = fgColor2; 807 *lpix++ = fgColor3; 808 break; 809 case 10: 810 *lpix++ = fgColor1; 811 *lpix++ = fgColor2; 812 *lpix++ = fgColor3; 813 *lpix++ = bgColor1; 814 *lpix++ = bgColor2; 815 *lpix++ = bgColor3; 816 *lpix++ = fgColor1; 817 *lpix++ = fgColor2; 818 *lpix++ = fgColor3; 819 *lpix++ = bgColor1; 820 *lpix++ = bgColor2; 821 *lpix++ = bgColor3; 822 break; 823 case 11: 824 *lpix++ = fgColor1; 825 *lpix++ = fgColor2; 826 *lpix++ = fgColor3; 827 *lpix++ = bgColor1; 828 *lpix++ = bgColor2; 829 *lpix++ = bgColor3; 830 *lpix++ = fgColor1; 831 *lpix++ = fgColor2; 832 *lpix++ = fgColor3; 833 *lpix++ = fgColor1; 834 *lpix++ = fgColor2; 835 *lpix++ = fgColor3; 836 break; 837 case 12: 838 *lpix++ = fgColor1; 839 *lpix++ = fgColor2; 840 *lpix++ = fgColor3; 841 *lpix++ = fgColor1; 842 *lpix++ = fgColor2; 843 *lpix++ = fgColor3; 844 *lpix++ = bgColor1; 845 *lpix++ = bgColor2; 846 *lpix++ = bgColor3; 847 *lpix++ = bgColor1; 848 *lpix++ = bgColor2; 849 *lpix++ = bgColor3; 850 break; 851 case 13: 852 *lpix++ = fgColor1; 853 *lpix++ = fgColor2; 854 *lpix++ = fgColor3; 855 *lpix++ = fgColor1; 856 *lpix++ = fgColor2; 857 *lpix++ = fgColor3; 858 *lpix++ = bgColor1; 859 *lpix++ = bgColor2; 860 *lpix++ = bgColor3; 861 *lpix++ = fgColor1; 862 *lpix++ = fgColor2; 863 *lpix++ = fgColor3; 864 break; 865 case 14: 866 *lpix++ = fgColor1; 867 *lpix++ = fgColor2; 868 *lpix++ = fgColor3; 869 *lpix++ = fgColor1; 870 *lpix++ = fgColor2; 871 *lpix++ = fgColor3; 872 *lpix++ = fgColor1; 873 *lpix++ = fgColor2; 874 *lpix++ = fgColor3; 875 *lpix++ = bgColor1; 876 *lpix++ = bgColor2; 877 *lpix++ = bgColor3; 878 break; 879 case 15: 880 *lpix++ = fgColor1; 881 *lpix++ = fgColor2; 882 *lpix++ = fgColor3; 883 *lpix++ = fgColor1; 884 *lpix++ = fgColor2; 885 *lpix++ = fgColor3; 886 *lpix++ = fgColor1; 887 *lpix++ = fgColor2; 888 *lpix++ = fgColor3; 889 *lpix++ = fgColor1; 890 *lpix++ = fgColor2; 891 *lpix++ = fgColor3; 892 break; 893 } 894 895 expbits = *lbits & 0x0f; 896 897 j -= 4; 898 if (j < 4) { 899 break; 900 } 901 902 switch (expbits) { 903 case 0: 904 *lpix++ = bgColor1; 905 *lpix++ = bgColor2; 906 *lpix++ = bgColor3; 907 *lpix++ = bgColor1; 908 *lpix++ = bgColor2; 909 *lpix++ = bgColor3; 910 *lpix++ = bgColor1; 911 *lpix++ = bgColor2; 912 *lpix++ = bgColor3; 913 *lpix++ = bgColor1; 914 *lpix++ = bgColor2; 915 *lpix++ = bgColor3; 916 break; 917 case 1: 918 *lpix++ = bgColor1; 919 *lpix++ = bgColor2; 920 *lpix++ = bgColor3; 921 *lpix++ = bgColor1; 922 *lpix++ = bgColor2; 923 *lpix++ = bgColor3; 924 *lpix++ = bgColor1; 925 *lpix++ = bgColor2; 926 *lpix++ = bgColor3; 927 *lpix++ = fgColor1; 928 *lpix++ = fgColor2; 929 *lpix++ = fgColor3; 930 break; 931 case 2: 932 *lpix++ = bgColor1; 933 *lpix++ = bgColor2; 934 *lpix++ = bgColor3; 935 *lpix++ = bgColor1; 936 *lpix++ = bgColor2; 937 *lpix++ = bgColor3; 938 *lpix++ = fgColor1; 939 *lpix++ = fgColor2; 940 *lpix++ = fgColor3; 941 *lpix++ = bgColor1; 942 *lpix++ = bgColor2; 943 *lpix++ = bgColor3; 944 break; 945 case 3: 946 *lpix++ = bgColor1; 947 *lpix++ = bgColor2; 948 *lpix++ = bgColor3; 949 *lpix++ = bgColor1; 950 *lpix++ = bgColor2; 951 *lpix++ = bgColor3; 952 *lpix++ = fgColor1; 953 *lpix++ = fgColor2; 954 *lpix++ = fgColor3; 955 *lpix++ = fgColor1; 956 *lpix++ = fgColor2; 957 *lpix++ = fgColor3; 958 break; 959 case 4: 960 *lpix++ = bgColor1; 961 *lpix++ = bgColor2; 962 *lpix++ = bgColor3; 963 *lpix++ = fgColor1; 964 *lpix++ = fgColor2; 965 *lpix++ = fgColor3; 966 *lpix++ = bgColor1; 967 *lpix++ = bgColor2; 968 *lpix++ = bgColor3; 969 *lpix++ = bgColor1; 970 *lpix++ = bgColor2; 971 *lpix++ = bgColor3; 972 break; 973 case 5: 974 *lpix++ = bgColor1; 975 *lpix++ = bgColor2; 976 *lpix++ = bgColor3; 977 *lpix++ = fgColor1; 978 *lpix++ = fgColor2; 979 *lpix++ = fgColor3; 980 *lpix++ = bgColor1; 981 *lpix++ = bgColor2; 982 *lpix++ = bgColor3; 983 *lpix++ = fgColor1; 984 *lpix++ = fgColor2; 985 *lpix++ = fgColor3; 986 break; 987 case 6: 988 *lpix++ = bgColor1; 989 *lpix++ = bgColor2; 990 *lpix++ = bgColor3; 991 *lpix++ = fgColor1; 992 *lpix++ = fgColor2; 993 *lpix++ = fgColor3; 994 *lpix++ = fgColor1; 995 *lpix++ = fgColor2; 996 *lpix++ = fgColor3; 997 *lpix++ = bgColor1; 998 *lpix++ = bgColor2; 999 *lpix++ = bgColor3; 1000 break; 1001 case 7: 1002 *lpix++ = bgColor1; 1003 *lpix++ = bgColor2; 1004 *lpix++ = bgColor3; 1005 *lpix++ = fgColor1; 1006 *lpix++ = fgColor2; 1007 *lpix++ = fgColor3; 1008 *lpix++ = fgColor1; 1009 *lpix++ = fgColor2; 1010 *lpix++ = fgColor3; 1011 *lpix++ = fgColor1; 1012 *lpix++ = fgColor2; 1013 *lpix++ = fgColor3; 1014 break; 1015 case 8: 1016 *lpix++ = fgColor1; 1017 *lpix++ = fgColor2; 1018 *lpix++ = fgColor3; 1019 *lpix++ = bgColor1; 1020 *lpix++ = bgColor2; 1021 *lpix++ = bgColor3; 1022 *lpix++ = bgColor1; 1023 *lpix++ = bgColor2; 1024 *lpix++ = bgColor3; 1025 *lpix++ = bgColor1; 1026 *lpix++ = bgColor2; 1027 *lpix++ = bgColor3; 1028 break; 1029 case 9: 1030 *lpix++ = fgColor1; 1031 *lpix++ = fgColor2; 1032 *lpix++ = fgColor3; 1033 *lpix++ = bgColor1; 1034 *lpix++ = bgColor2; 1035 *lpix++ = bgColor3; 1036 *lpix++ = bgColor1; 1037 *lpix++ = bgColor2; 1038 *lpix++ = bgColor3; 1039 *lpix++ = fgColor1; 1040 *lpix++ = fgColor2; 1041 *lpix++ = fgColor3; 1042 break; 1043 case 10: 1044 *lpix++ = fgColor1; 1045 *lpix++ = fgColor2; 1046 *lpix++ = fgColor3; 1047 *lpix++ = bgColor1; 1048 *lpix++ = bgColor2; 1049 *lpix++ = bgColor3; 1050 *lpix++ = fgColor1; 1051 *lpix++ = fgColor2; 1052 *lpix++ = fgColor3; 1053 *lpix++ = bgColor1; 1054 *lpix++ = bgColor2; 1055 *lpix++ = bgColor3; 1056 break; 1057 case 11: 1058 *lpix++ = fgColor1; 1059 *lpix++ = fgColor2; 1060 *lpix++ = fgColor3; 1061 *lpix++ = bgColor1; 1062 *lpix++ = bgColor2; 1063 *lpix++ = bgColor3; 1064 *lpix++ = fgColor1; 1065 *lpix++ = fgColor2; 1066 *lpix++ = fgColor3; 1067 *lpix++ = fgColor1; 1068 *lpix++ = fgColor2; 1069 *lpix++ = fgColor3; 1070 break; 1071 case 12: 1072 *lpix++ = fgColor1; 1073 *lpix++ = fgColor2; 1074 *lpix++ = fgColor3; 1075 *lpix++ = fgColor1; 1076 *lpix++ = fgColor2; 1077 *lpix++ = fgColor3; 1078 *lpix++ = bgColor1; 1079 *lpix++ = bgColor2; 1080 *lpix++ = bgColor3; 1081 *lpix++ = bgColor1; 1082 *lpix++ = bgColor2; 1083 *lpix++ = bgColor3; 1084 break; 1085 case 13: 1086 *lpix++ = fgColor1; 1087 *lpix++ = fgColor2; 1088 *lpix++ = fgColor3; 1089 *lpix++ = fgColor1; 1090 *lpix++ = fgColor2; 1091 *lpix++ = fgColor3; 1092 *lpix++ = bgColor1; 1093 *lpix++ = bgColor2; 1094 *lpix++ = bgColor3; 1095 *lpix++ = fgColor1; 1096 *lpix++ = fgColor2; 1097 *lpix++ = fgColor3; 1098 break; 1099 case 14: 1100 *lpix++ = fgColor1; 1101 *lpix++ = fgColor2; 1102 *lpix++ = fgColor3; 1103 *lpix++ = fgColor1; 1104 *lpix++ = fgColor2; 1105 *lpix++ = fgColor3; 1106 *lpix++ = fgColor1; 1107 *lpix++ = fgColor2; 1108 *lpix++ = fgColor3; 1109 *lpix++ = bgColor1; 1110 *lpix++ = bgColor2; 1111 *lpix++ = bgColor3; 1112 break; 1113 case 15: 1114 *lpix++ = fgColor1; 1115 *lpix++ = fgColor2; 1116 *lpix++ = fgColor3; 1117 *lpix++ = fgColor1; 1118 *lpix++ = fgColor2; 1119 *lpix++ = fgColor3; 1120 *lpix++ = fgColor1; 1121 *lpix++ = fgColor2; 1122 *lpix++ = fgColor3; 1123 *lpix++ = fgColor1; 1124 *lpix++ = fgColor2; 1125 *lpix++ = fgColor3; 1126 break; 1127 } 1128 lbits++; 1129 } 1130 1131 if (j > 0) { 1132 *lpix++ = (expbits & 0x08) ? fgColor1 : bgColor1; 1133 *lpix++ = (expbits & 0x08) ? fgColor2 : bgColor2; 1134 *lpix++ = (expbits & 0x08) ? fgColor3 : bgColor3; 1135 j--; 1136 if (j > 0) { 1137 *lpix++ = (expbits & 0x04) ? fgColor1 : bgColor1; 1138 *lpix++ = (expbits & 0x04) ? fgColor2 : bgColor2; 1139 *lpix++ = (expbits & 0x04) ? fgColor3 : bgColor3; 1140 j--; 1141 if (j > 0) { 1142 *lpix++ = (expbits & 0x02) ? fgColor1 : bgColor1; 1143 *lpix++ = (expbits & 0x02) ? fgColor2 : bgColor2; 1144 *lpix++ = (expbits & 0x02) ? fgColor3 : bgColor3; 1145 j--; 1146 } 1147 } 1148 } 1149 1150 pix += pix_increment; 1151 bits += bits_increment; 1152 } 1153 return; 1154} 1155 1156 1157 1158/* 1159 *---------------------------------------------------------------------- 1160 * 1161 * RasterBitsToPixels32 -- 1162 * 1163 * Convert a bitmap to a pixmap, converting 1 bits to the foreground 1164 * color (fg) and 0 bits to the background color (bg), for a 32-bit 1165 * pixmap 1166 * 1167 * Results: 1168 * Pixmap filled with pixels 1169 * 1170 * Side effects: 1171 * None 1172 * 1173 *---------------------------------------------------------------------- 1174 */ 1175 1176void 1177RasterBitsToPixels32(uint8 *bits, uint32 bits_increment, 1178 uint8 *pix, uint32 pix_increment, 1179 uint32 width, uint32 height, uint32 fg, uint32 bg) 1180{ 1181 uint32 *lpix; 1182 uint8 *lbits; 1183 int i, j; 1184 uint32 expbits = 0; /* Bits to be expanded */ 1185 1186 for (i=0; i<height; i++) { 1187 lpix = (uint32 *)pix; 1188 lbits = bits; 1189 for (j = width; j > 0; j -= 4) { 1190 expbits = (*lbits >> 4) & 0x0f; 1191 1192 if (j < 4) 1193 break; 1194 1195 switch (expbits) { 1196 case 0: 1197 *lpix++ = bg; 1198 *lpix++ = bg; 1199 *lpix++ = bg; 1200 *lpix++ = bg; 1201 break; 1202 case 1: 1203 *lpix++ = bg; 1204 *lpix++ = bg; 1205 *lpix++ = bg; 1206 *lpix++ = fg; 1207 break; 1208 case 2: 1209 *lpix++ = bg; 1210 *lpix++ = bg; 1211 *lpix++ = fg; 1212 *lpix++ = bg; 1213 break; 1214 case 3: 1215 *lpix++ = bg; 1216 *lpix++ = bg; 1217 *lpix++ = fg; 1218 *lpix++ = fg; 1219 break; 1220 case 4: 1221 *lpix++ = bg; 1222 *lpix++ = fg; 1223 *lpix++ = bg; 1224 *lpix++ = bg; 1225 break; 1226 case 5: 1227 *lpix++ = bg; 1228 *lpix++ = fg; 1229 *lpix++ = bg; 1230 *lpix++ = fg; 1231 break; 1232 case 6: 1233 *lpix++ = bg; 1234 *lpix++ = fg; 1235 *lpix++ = fg; 1236 *lpix++ = bg; 1237 break; 1238 case 7: 1239 *lpix++ = bg; 1240 *lpix++ = fg; 1241 *lpix++ = fg; 1242 *lpix++ = fg; 1243 break; 1244 case 8: 1245 *lpix++ = fg; 1246 *lpix++ = bg; 1247 *lpix++ = bg; 1248 *lpix++ = bg; 1249 break; 1250 case 9: 1251 *lpix++ = fg; 1252 *lpix++ = bg; 1253 *lpix++ = bg; 1254 *lpix++ = fg; 1255 break; 1256 case 10: 1257 *lpix++ = fg; 1258 *lpix++ = bg; 1259 *lpix++ = fg; 1260 *lpix++ = bg; 1261 break; 1262 case 11: 1263 *lpix++ = fg; 1264 *lpix++ = bg; 1265 *lpix++ = fg; 1266 *lpix++ = fg; 1267 break; 1268 case 12: 1269 *lpix++ = fg; 1270 *lpix++ = fg; 1271 *lpix++ = bg; 1272 *lpix++ = bg; 1273 break; 1274 case 13: 1275 *lpix++ = fg; 1276 *lpix++ = fg; 1277 *lpix++ = bg; 1278 *lpix++ = fg; 1279 break; 1280 case 14: 1281 *lpix++ = fg; 1282 *lpix++ = fg; 1283 *lpix++ = fg; 1284 *lpix++ = bg; 1285 break; 1286 case 15: 1287 *lpix++ = fg; 1288 *lpix++ = fg; 1289 *lpix++ = fg; 1290 *lpix++ = fg; 1291 break; 1292 } 1293 1294 expbits = *lbits & 0x0f; 1295 1296 j -= 4; 1297 if (j < 4) { 1298 break; 1299 } 1300 1301 switch (expbits) { 1302 case 0: 1303 *lpix++ = bg; 1304 *lpix++ = bg; 1305 *lpix++ = bg; 1306 *lpix++ = bg; 1307 break; 1308 case 1: 1309 *lpix++ = bg; 1310 *lpix++ = bg; 1311 *lpix++ = bg; 1312 *lpix++ = fg; 1313 break; 1314 case 2: 1315 *lpix++ = bg; 1316 *lpix++ = bg; 1317 *lpix++ = fg; 1318 *lpix++ = bg; 1319 break; 1320 case 3: 1321 *lpix++ = bg; 1322 *lpix++ = bg; 1323 *lpix++ = fg; 1324 *lpix++ = fg; 1325 break; 1326 case 4: 1327 *lpix++ = bg; 1328 *lpix++ = fg; 1329 *lpix++ = bg; 1330 *lpix++ = bg; 1331 break; 1332 case 5: 1333 *lpix++ = bg; 1334 *lpix++ = fg; 1335 *lpix++ = bg; 1336 *lpix++ = fg; 1337 break; 1338 case 6: 1339 *lpix++ = bg; 1340 *lpix++ = fg; 1341 *lpix++ = fg; 1342 *lpix++ = bg; 1343 break; 1344 case 7: 1345 *lpix++ = bg; 1346 *lpix++ = fg; 1347 *lpix++ = fg; 1348 *lpix++ = fg; 1349 break; 1350 case 8: 1351 *lpix++ = fg; 1352 *lpix++ = bg; 1353 *lpix++ = bg; 1354 *lpix++ = bg; 1355 break; 1356 case 9: 1357 *lpix++ = fg; 1358 *lpix++ = bg; 1359 *lpix++ = bg; 1360 *lpix++ = fg; 1361 break; 1362 case 10: 1363 *lpix++ = fg; 1364 *lpix++ = bg; 1365 *lpix++ = fg; 1366 *lpix++ = bg; 1367 break; 1368 case 11: 1369 *lpix++ = fg; 1370 *lpix++ = bg; 1371 *lpix++ = fg; 1372 *lpix++ = fg; 1373 break; 1374 case 12: 1375 *lpix++ = fg; 1376 *lpix++ = fg; 1377 *lpix++ = bg; 1378 *lpix++ = bg; 1379 break; 1380 case 13: 1381 *lpix++ = fg; 1382 *lpix++ = fg; 1383 *lpix++ = bg; 1384 *lpix++ = fg; 1385 break; 1386 case 14: 1387 *lpix++ = fg; 1388 *lpix++ = fg; 1389 *lpix++ = fg; 1390 *lpix++ = bg; 1391 break; 1392 case 15: 1393 *lpix++ = fg; 1394 *lpix++ = fg; 1395 *lpix++ = fg; 1396 *lpix++ = fg; 1397 break; 1398 } 1399 lbits++; 1400 } 1401 1402 if (j > 0) { 1403 *lpix++ = (expbits & 0x08) ? fg : bg; 1404 j--; 1405 if (j > 0) { 1406 *lpix++ = (expbits & 0x04) ? fg : bg; 1407 j--; 1408 if (j > 0) { 1409 *lpix++ = (expbits & 0x02) ? fg : bg; 1410 j--; 1411 } 1412 } 1413 } 1414 1415 pix += pix_increment; 1416 bits += bits_increment; 1417 } 1418 return; 1419} 1420