|
|
1.1 ! root 1: .386 ! 2: ! 3: ifndef DOS_PLATFORM ! 4: .model small,c ! 5: else ! 6: ifdef STD_CALL ! 7: .model small,c ! 8: else ! 9: .model small,pascal ! 10: endif; STD_CALL ! 11: endif; DOS_PLATFORM ! 12: ! 13: assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT ! 14: assume fs:nothing,gs:nothing ! 15: ! 16: .xlist ! 17: include stdcall.inc ;calling convention cmacros ! 18: include i386\egavga.inc ! 19: include i386\strucs.inc ! 20: include i386\ropdefs.inc ! 21: include i386\display.inc ; Display specific structures ! 22: ! 23: .list ! 24: ! 25: ;-----------------------------------------------------------------------; ! 26: ! 27: .data ! 28: ! 29: align 4 ! 30: ifdef LATER ! 31: public CmpPlanes ! 32: CmpPlanes label dword ! 33: dd check_plane_1 ! 34: dd check_plane_2 ! 35: dd check_plane_3 ! 36: dd 0 ! 37: endif;LATER ! 38: ! 39: public pCountTable ! 40: pCountTable label dword ! 41: dd 1h ! 42: dd 2h ! 43: dd 4h ! 44: dd 8h ! 45: dd 10h ! 46: dd 20h ! 47: dd 40h ! 48: dd 80h ! 49: dd 100h ! 50: dd 200h ! 51: dd 400h ! 52: dd 800h ! 53: dd 1000h ! 54: dd 2000h ! 55: dd 4000h ! 56: dd 8000h ! 57: ! 58: align 4 ! 59: public pPixelCount ! 60: pPixelCount label dword ! 61: dd 0 ;//0 ! 62: dd 1 ;//1 ! 63: dd 1 ;//2 ! 64: dd 2 ;//3 ! 65: dd 1 ;//4 ! 66: dd 2 ;//5 ! 67: dd 2 ;//6 ! 68: dd 3 ;//7 ! 69: dd 1 ;//8 ! 70: dd 2 ;//9 ! 71: dd 2 ;//10 ! 72: dd 3 ;//11 ! 73: dd 2 ;//12 ! 74: dd 3 ;//13 ! 75: dd 3 ;//14 ! 76: dd 3 ;//15 ! 77: dd 4 ;//16 ! 78: ! 79: align 4 ! 80: PackedToPlanar0 label dword ! 81: dd 0 ;//0 ! 82: dd 00000001h ;//1 ! 83: dd 00000100h ;//2 ! 84: dd 00000101h ;//3 ! 85: dd 00010000h ;//4 ! 86: dd 00010001h ;//5 ! 87: dd 00010100h ;//6 ! 88: dd 00010101h ;//7 ! 89: dd 01000000h ;//8 ! 90: dd 01000001h ;//9 ! 91: dd 01000100h ;//10 ! 92: dd 01000101h ;//11 ! 93: dd 01010000h ;//12 ! 94: dd 01010001h ;//13 ! 95: dd 01010100h ;//14 ! 96: dd 01010101h ;//15 ! 97: ! 98: align 4 ! 99: PackedToPlanar1 label dword ! 100: dd 0 ;//0 ! 101: dd (00000001h SHL 1) ;//1 ! 102: dd (00000100h SHL 1) ;//2 ! 103: dd (00000101h SHL 1) ;//3 ! 104: dd (00010000h SHL 1) ;//4 ! 105: dd (00010001h SHL 1) ;//5 ! 106: dd (00010100h SHL 1) ;//6 ! 107: dd (00010101h SHL 1) ;//7 ! 108: dd (01000000h SHL 1) ;//8 ! 109: dd (01000001h SHL 1) ;//9 ! 110: dd (01000100h SHL 1) ;//10 ! 111: dd (01000101h SHL 1) ;//11 ! 112: dd (01010000h SHL 1) ;//12 ! 113: dd (01010001h SHL 1) ;//13 ! 114: dd (01010100h SHL 1) ;//14 ! 115: dd (01010101h SHL 1) ;//15 ! 116: ! 117: align 4 ! 118: PackedToPlanar2 label dword ! 119: dd 0 ;//0 ! 120: dd (00000001h SHL 2) ;//1 ! 121: dd (00000100h SHL 2) ;//2 ! 122: dd (00000101h SHL 2) ;//3 ! 123: dd (00010000h SHL 2) ;//4 ! 124: dd (00010001h SHL 2) ;//5 ! 125: dd (00010100h SHL 2) ;//6 ! 126: dd (00010101h SHL 2) ;//7 ! 127: dd (01000000h SHL 2) ;//8 ! 128: dd (01000001h SHL 2) ;//9 ! 129: dd (01000100h SHL 2) ;//10 ! 130: dd (01000101h SHL 2) ;//11 ! 131: dd (01010000h SHL 2) ;//12 ! 132: dd (01010001h SHL 2) ;//13 ! 133: dd (01010100h SHL 2) ;//14 ! 134: dd (01010101h SHL 2) ;//15 ! 135: ! 136: align 4 ! 137: PackedToPlanar3 label dword ! 138: dd 0 ;//0 ! 139: dd (00000001h SHL 3) ;//1 ! 140: dd (00000100h SHL 3) ;//2 ! 141: dd (00000101h SHL 3) ;//3 ! 142: dd (00010000h SHL 3) ;//4 ! 143: dd (00010001h SHL 3) ;//5 ! 144: dd (00010100h SHL 3) ;//6 ! 145: dd (00010101h SHL 3) ;//7 ! 146: dd (01000000h SHL 3) ;//8 ! 147: dd (01000001h SHL 3) ;//9 ! 148: dd (01000100h SHL 3) ;//10 ! 149: dd (01000101h SHL 3) ;//11 ! 150: dd (01010000h SHL 3) ;//12 ! 151: dd (01010001h SHL 3) ;//13 ! 152: dd (01010100h SHL 3) ;//14 ! 153: dd (01010101h SHL 3) ;//15 ! 154: ! 155: align 4 ! 156: PackedToPlanar4 label dword ! 157: dd 0 ;//0 ! 158: dd (00000001h SHL 4) ;//1 ! 159: dd (00000100h SHL 4) ;//2 ! 160: dd (00000101h SHL 4) ;//3 ! 161: dd (00010000h SHL 4) ;//4 ! 162: dd (00010001h SHL 4) ;//5 ! 163: dd (00010100h SHL 4) ;//6 ! 164: dd (00010101h SHL 4) ;//7 ! 165: dd (01000000h SHL 4) ;//8 ! 166: dd (01000001h SHL 4) ;//9 ! 167: dd (01000100h SHL 4) ;//10 ! 168: dd (01000101h SHL 4) ;//11 ! 169: dd (01010000h SHL 4) ;//12 ! 170: dd (01010001h SHL 4) ;//13 ! 171: dd (01010100h SHL 4) ;//14 ! 172: dd (01010101h SHL 4) ;//15 ! 173: ! 174: align 4 ! 175: PackedToPlanar5 label dword ! 176: dd 0 ;//0 ! 177: dd (00000001h SHL 5) ;//1 ! 178: dd (00000100h SHL 5) ;//2 ! 179: dd (00000101h SHL 5) ;//3 ! 180: dd (00010000h SHL 5) ;//4 ! 181: dd (00010001h SHL 5) ;//5 ! 182: dd (00010100h SHL 5) ;//6 ! 183: dd (00010101h SHL 5) ;//7 ! 184: dd (01000000h SHL 5) ;//8 ! 185: dd (01000001h SHL 5) ;//9 ! 186: dd (01000100h SHL 5) ;//10 ! 187: dd (01000101h SHL 5) ;//11 ! 188: dd (01010000h SHL 5) ;//12 ! 189: dd (01010001h SHL 5) ;//13 ! 190: dd (01010100h SHL 5) ;//14 ! 191: dd (01010101h SHL 5) ;//15 ! 192: ! 193: align 4 ! 194: PackedToPlanar6 label dword ! 195: dd 0 ;//0 ! 196: dd (00000001h SHL 6) ;//1 ! 197: dd (00000100h SHL 6) ;//2 ! 198: dd (00000101h SHL 6) ;//3 ! 199: dd (00010000h SHL 6) ;//4 ! 200: dd (00010001h SHL 6) ;//5 ! 201: dd (00010100h SHL 6) ;//6 ! 202: dd (00010101h SHL 6) ;//7 ! 203: dd (01000000h SHL 6) ;//8 ! 204: dd (01000001h SHL 6) ;//9 ! 205: dd (01000100h SHL 6) ;//10 ! 206: dd (01000101h SHL 6) ;//11 ! 207: dd (01010000h SHL 6) ;//12 ! 208: dd (01010001h SHL 6) ;//13 ! 209: dd (01010100h SHL 6) ;//14 ! 210: dd (01010101h SHL 6) ;//15 ! 211: ! 212: align 4 ! 213: PackedToPlanar7 label dword ! 214: dd 0 ;//0 ! 215: dd (00000001h SHL 7) ;//1 ! 216: dd (00000100h SHL 7) ;//2 ! 217: dd (00000101h SHL 7) ;//3 ! 218: dd (00010000h SHL 7) ;//4 ! 219: dd (00010001h SHL 7) ;//5 ! 220: dd (00010100h SHL 7) ;//6 ! 221: dd (00010101h SHL 7) ;//7 ! 222: dd (01000000h SHL 7) ;//8 ! 223: dd (01000001h SHL 7) ;//9 ! 224: dd (01000100h SHL 7) ;//10 ! 225: dd (01000101h SHL 7) ;//11 ! 226: dd (01010000h SHL 7) ;//12 ! 227: dd (01010001h SHL 7) ;//13 ! 228: dd (01010100h SHL 7) ;//14 ! 229: dd (01010101h SHL 7) ;//15 ! 230: ! 231: ! 232: ! 233: .code ! 234: ! 235: ;============================================================================== ! 236: ; CountColors(pBuffer, Count) ! 237: ; ! 238: ; This routine will count the number of unique colors in a packed pel 4bpp ! 239: ; bitmap. The total number of colors is returned. ! 240: ; ! 241: ;============================================================================== ! 242: ! 243: _TEXT$03 SEGMENT DWORD USE32 PUBLIC 'CODE' ! 244: ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING ! 245: ! 246: cProc CountColors,16,< \ ! 247: uses esi edi ebx, \ ! 248: pBuffer: ptr dword, \ ! 249: count:dword, \ ! 250: pColors: ptr dword, \ ! 251: cbScan: dword > ! 252: ! 253: ; This could be much faster. This routine really only needs to ! 254: ; find out if there are two colors and return those two colors. ! 255: ; If there are more, we can just return. ! 256: ! 257: mov ecx,8 ! 258: mov esi,pBuffer ! 259: lea edi,pCountTable ! 260: xor edx,edx ! 261: ! 262: ! 263: @@: mov ebx,[esi] ; read in a dword of the bitmap ! 264: ! 265: rept 7 ! 266: ! 267: mov eax,ebx ;copy colors to eax ! 268: and eax,0fh ;isolate nibble ! 269: shr ebx,4 ;remove current nibble from ebx ! 270: or edx,[edi+eax*4] ;or color count flags into edx ! 271: endm ;----------------------- ! 272: ! 273: or edx,[edi+ebx*4] ;do last nibble ! 274: ! 275: cmp count,16 ;if this is 16x8 we need to ! 276: jne short continue_count ; process the second dword on this ! 277: ; scan. ! 278: ! 279: rept 7 ! 280: ! 281: mov ebx,[esi+4] ;read second dword ! 282: mov eax,ebx ;copy colors to eax ! 283: and eax,0fh ;isolate nibble ! 284: shr ebx,4 ;remove current nibble from ebx ! 285: or edx,[edi+eax*4] ;or color count flags into edx ! 286: endm ;----------------------- ! 287: ! 288: or edx,[edi+ebx*4] ;do last nibble ! 289: continue_count: ! 290: add esi,cbScan ! 291: dec ecx ;do next dword ! 292: jnz @b ! 293: ! 294: ; Now count the number of bits on in each nibble ! 295: ! 296: mov ecx,edx ;save bit mask ! 297: mov ebx,edx ! 298: shr edx,4 ! 299: and ebx,0fh ! 300: mov eax,pPixelCount[ebx*4] ! 301: ! 302: mov ebx,edx ! 303: shr edx,4 ! 304: and ebx,0fh ! 305: add eax,pPixelCount[ebx*4] ! 306: ! 307: mov ebx,edx ! 308: shr edx,4 ! 309: and ebx,0fh ! 310: add eax,pPixelCount[ebx*4] ! 311: ! 312: add eax,pPixelCount[edx*4] ! 313: ! 314: cmp eax,2 ! 315: jne short cc_exit ! 316: ! 317: mov al,16 ! 318: ! 319: @@: dec al ! 320: add cx,cx ! 321: jnc @b ! 322: mov ah,al ! 323: ! 324: @@: dec al ! 325: add cx,cx ! 326: jnc @b ! 327: ! 328: mov edi,pColors ! 329: mov [edi],ax ! 330: mov ax,2 ! 331: cc_exit: ! 332: cRet CountColors ! 333: ! 334: endProc CountColors ! 335: ! 336: ;============================================================================== ! 337: ; bQuickPattern ! 338: ; ! 339: ; We special case patterns that are repeating two line patterns (like the ! 340: ; grey/hatch brush). This allows us to do two passes instead of eight in the ! 341: ; venetian blind patblt code. ! 342: ; ! 343: ;============================================================================== ! 344: ! 345: cProc bQuickPattern,8,< \ ! 346: uses edi, \ ! 347: pBuffer: ptr dword, \ ! 348: count:dword > ! 349: ! 350: ; Count must be 8 or 16; ! 351: ! 352: xor eax,eax ;Set ret value to false ! 353: mov edi,pBuffer ;get pointer to pattern ! 354: mov edx,[edi] ;Get first dword (first two lines of pattern) ! 355: mov ecx,count ;dword count ! 356: ! 357: qp_loop: ! 358: INDEX=4 ! 359: rept 7 ! 360: cmp edx,[edi+INDEX] ! 361: jne short qp_exit ! 362: INDEX=INDEX+4 ! 363: endm ;---------------------- ! 364: ! 365: sub ecx,8 ! 366: jz exit_true ! 367: ! 368: add edi,32 ! 369: cmp edx,[edi] ! 370: jne short qp_exit ! 371: jmp short qp_loop ! 372: ! 373: exit_true: ! 374: inc eax ! 375: qp_exit: ! 376: cRet bQuickPattern ! 377: endProc bQuickPattern ! 378: ! 379: _TEXT$03 ends ! 380: ! 381: .code ! 382: ! 383: ;============================================================================== ! 384: ; bShrinkPattern ! 385: ; ! 386: ; Test to see if we can shrink an 16x8 pattern to an 8x8 pattern. ! 387: ; ! 388: ;============================================================================== ! 389: ! 390: cProc bShrinkPattern,8,< \ ! 391: uses edi, \ ! 392: pBuffer: ptr dword, \ ! 393: cbScan:dword > ! 394: ! 395: xor eax,eax ! 396: mov ecx,cbScan ! 397: mov edi,pBuffer ;get pointer to pattern ! 398: ! 399: rept 8 ! 400: mov edx,[edi] ! 401: cmp edx,[edi+4] ! 402: jne @f ! 403: add edi,ecx ! 404: endm ;--------------- ! 405: ! 406: inc eax ! 407: @@: ! 408: ! 409: cRet bShrinkPattern ! 410: endProc bShrinkPattern ! 411: ! 412: ;============================================================================== ! 413: ;vMono8Wide ! 414: ; ! 415: ; Copies an 8x8 pattern to a 16x16 buffer ! 416: ; ! 417: ;============================================================================== ! 418: ! 419: _TEXT$04 SEGMENT DWORD USE32 PUBLIC 'CODE' ! 420: ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING ! 421: ! 422: cProc vMono8Wide,12,< \ ! 423: uses ebx edi esi, \ ! 424: pDest: ptr dword, \ ! 425: pBuffer: ptr dword, \ ! 426: cbScan:ptr dword > ! 427: ! 428: mov edi,pDest ;Load up edi with our dest ! 429: mov esi,pBuffer ;load esi with the source ! 430: mov ebx,cbScan ;dest line delta ! 431: ! 432: rept 8 ! 433: ! 434: mov al,[esi] ;Read in first line of pattern ! 435: add esi,ebx ;inc dest pointer ! 436: mov ah,al ;make pattern 16 wide ! 437: mov [edi],ax ;write first line of pattern ! 438: add edi,2 ! 439: endm ;---------------------- ! 440: ! 441: cRet vMono8Wide ! 442: endProc vMono8Wide ! 443: ! 444: _TEXT$04 ends ! 445: ! 446: .code ! 447: ! 448: ;============================================================================== ! 449: ;vMono16Wide ! 450: ; ! 451: ; Copies an 16x8 pattern to a 16x16 buffer ! 452: ; ! 453: ;============================================================================== ! 454: ! 455: cProc vMono16Wide,12,< \ ! 456: uses ebx edi esi, \ ! 457: pDest: ptr dword, \ ! 458: pBuffer: ptr dword, \ ! 459: cbScan:ptr dword > ! 460: ! 461: mov edi,pDest ;Load up edi with our dest ! 462: mov esi,pBuffer ;load esi with the source ! 463: mov ebx,cbScan ;dest line delta ! 464: ! 465: rept 8 ! 466: ! 467: mov ax,[esi] ;Read in first line of pattern ! 468: add esi,ebx ;inc dest pointer ! 469: mov [edi],ax ;write first line of pattern ! 470: add edi,2 ! 471: ! 472: endm ;---------------------- ! 473: ! 474: cRet vMono16Wide ! 475: endProc vMono16Wide ! 476: ! 477: cProc vMono4Wide,12,< \ ! 478: uses ebx edi esi, \ ! 479: pDest: ptr dword, \ ! 480: pBuffer: ptr dword, \ ! 481: cbScan:ptr dword > ! 482: ! 483: nop ! 484: ! 485: cRet vMono4Wide ! 486: endProc vMono4Wide ! 487: ! 488: cProc vMono2Wide,12,< \ ! 489: uses ebx edi esi, \ ! 490: pDest: ptr dword, \ ! 491: pBuffer: ptr dword, \ ! 492: cbScan:ptr dword > ! 493: ! 494: nop ! 495: ! 496: cRet vMono2Wide ! 497: endProc vMono2Wide ! 498: ! 499: ;============================================================================== ! 500: ; Brush2ColorToMono ! 501: ; ! 502: ; ! 503: ;============================================================================== ! 504: ! 505: _TEXT$01 SEGMENT DWORD USE32 PUBLIC 'CODE' ! 506: ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING ! 507: ! 508: cProc vBrush2ColorToMono,20,< \ ! 509: uses esi edi ebx, \ ! 510: pDest: ptr dword, \ ! 511: pSrc: ptr dword, \ ! 512: cbScan: dword, \ ! 513: ulWidth: dword, \ ! 514: jColor: dword > ! 515: ! 516: local ulHeight : dword ! 517: ! 518: mov ulHeight,8 ! 519: ! 520: ;This routine relies on this: It only works on an 8x8 ! 521: ;two color 4bpp packed pel pattern. It creates a 1bpp bitmap ! 522: ;with the foreground color being the smaller of the two numbers. ! 523: ;This is key because the way we set the bit in the monochrome bmp ! 524: ;is by comparing the background color (the larger of the two colors) ! 525: ;with the current nibble. If this nibble contains the foreground ! 526: ;color (the smaller color) then a carry will result from the compare. ! 527: ;We then use adc ebx,ebx to set the lsb to zero or one depending on ! 528: ;the result of the compare and also to shift ebx left by one. ! 529: ! 530: mov ecx,jColor ;jColor is the larger of the two colors ! 531: mov ch,cl ;Save jcolor in cl for comparisions with the low ! 532: shl ch,4 ;nibble and ch for the high nibble ! 533: ! 534: mov edi,pDest ;Load Dest ! 535: mov esi,pSrc ;Load Src ! 536: mov edx,cbScan ! 537: ! 538: cmp ulWidth,8 ! 539: jnz do_16_wide ! 540: ! 541: x8_wide_loop: ! 542: SRCINDEX=0 ! 543: xor ebx,ebx ;clear out place where we store the dest byte. ! 544: rept 4 ! 545: mov al,[esi+SRCINDEX] ;get src byte ! 546: cmp al,ch ;Is the top nibble fg or bk? ! 547: adc ebx,ebx ;carry will be set if fg. Set bit in mask ! 548: and al,0fh ;mask off high nibble ! 549: cmp al,cl ;Is the bottom nibble fg or bk? ! 550: adc ebx,ebx ;carry will be set if fg. Set bit in mask ! 551: SRCINDEX=SRCINDEX+1 ! 552: endm ;------------------ ! 553: add esi,edx ;increment src to next line ! 554: ! 555: mov [edi],bl ;Write out first byte (8 Pixels) ! 556: mov [edi+1],bl ;We expand this to 16 pixels ! 557: add edi,2 ! 558: ! 559: dec ulHeight ! 560: jnz x8_wide_loop ! 561: jmp convert_exit ! 562: ! 563: ! 564: do_16_wide: ! 565: x16_wide_loop: ! 566: xor ebx,ebx ;clear out place where we store the dest byte. ! 567: ! 568: SRCINDEX=0 ! 569: rept 4 ! 570: mov al,[esi+SRCINDEX] ;get src byte ! 571: cmp al,ch ;Is the top nibble fg or bk? ! 572: adc ebx,ebx ;carry will be set if fg. Set bit in mask ! 573: and al,0fh ;mask off high nibble ! 574: cmp al,cl ;Is the bottom nibble fg or bk? ! 575: adc ebx,ebx ;carry will be set if fg. Set bit in mask ! 576: SRCINDEX=SRCINDEX+1 ! 577: endm ;------------------ ! 578: ! 579: mov [edi],bl ;Write out first byte (8 Pixels) ! 580: inc edi ! 581: xor ebx,ebx ;clear out place where we store the dest byte. ! 582: ! 583: rept 4 ! 584: mov al,[esi+SRCINDEX] ;get src byte ! 585: cmp al,ch ;Is the top nibble fg or bk? ! 586: adc ebx,ebx ;carry will be set if fg. Set bit in mask ! 587: and al,0fh ;mask off high nibble ! 588: cmp al,cl ;Is the bottom nibble fg or bk? ! 589: adc ebx,ebx ;carry will be set if fg. Set bit in mask ! 590: SRCINDEX=SRCINDEX+1 ! 591: endm ;------------------ ! 592: ! 593: add esi,edx ;increment src to next line ! 594: mov [edi],bl ;Write out Second byte (8 Pixels) ! 595: inc edi ! 596: dec ulHeight ! 597: jnz x16_wide_loop ! 598: convert_exit: ! 599: cRet vBrush2ColorToMono ! 600: endProc vBrush2ColorToMono ! 601: ! 602: ! 603: ;============================================================================== ! 604: ; vConvert4BppToPlanar ! 605: ; ! 606: ; ! 607: ;============================================================================== ! 608: ! 609: cProc vConvert4BppToPlanar,16,< \ ! 610: uses esi edi ebx, \ ! 611: pDest: ptr dword, \ ! 612: pSrc: ptr dword, \ ! 613: cbScan: dword, \ ! 614: pulXlate: ptr dword > ! 615: ! 616: local ulHeight : dword ! 617: ! 618: xor eax,eax ! 619: mov esi,pSrc ! 620: mov edi,pDest ! 621: ! 622: mov edx,pulXlate ! 623: or edx,edx ! 624: jz do_convert4toplanar ! 625: ! 626: mov ulHeight,8 ! 627: convert4xlate: ! 628: mov ebx,[esi] ;Get 8 4bpp pixels ! 629: and ebx,0f0f0f0fh ;Mask off the high nibbles ! 630: shl ebx,2 ;multiply by four (size of dword) ! 631: mov al,bl ;move into eax to use an index ! 632: mov eax,[edx][eax] ;xlate color ! 633: mov ecx,PackedToPlanar6[eax*4] ;build planar bytes ! 634: mov al,bh ;move into eax to use an index ! 635: shr ebx,16 ;get access to high word ! 636: mov eax,[edx][eax] ;xlate color ! 637: or ecx,PackedToPlanar4[eax*4] ;build planar bytes ! 638: mov al,bl ;move into eax to use an index ! 639: mov eax,[edx][eax] ;xlate color ! 640: or ecx,PackedToPlanar2[eax*4] ;build planar bytes ! 641: mov al,bh ;move into eax to use an index ! 642: mov eax,[edx][eax] ;xlate color ! 643: or ecx,PackedToPlanar0[eax*4] ;build planar bytes ! 644: ! 645: mov ebx,[esi] ;Get same dword again so we ! 646: add esi,cbScan ; can do the high nibbles ! 647: ! 648: and ebx,0f0f0f0f0h ;Mask off the low nibbles ! 649: shr ebx,2 ;shift into low nible and ! 650: ;multiply by four ((>> 4) << 2) ! 651: ! 652: mov al,bl ;move into eax to use an index ! 653: mov eax,[edx][eax] ;xlate color ! 654: or ecx,PackedToPlanar7[eax*4] ;build planar bytes ! 655: mov al,bh ;move into eax to use an index ! 656: shr ebx,16 ;get access to high word ! 657: mov eax,[edx][eax] ;xlate color ! 658: or ecx,PackedToPlanar5[eax*4] ;build planar bytes ! 659: mov al,bl ;move into eax to use an index ! 660: mov eax,[edx][eax] ;xlate color ! 661: or ecx,PackedToPlanar3[eax*4] ;build planar bytes ! 662: mov al,bh ;move into eax to use an index ! 663: mov eax,[edx][eax] ;xlate color ! 664: or ecx,PackedToPlanar1[eax*4] ;build planar bytes ! 665: ! 666: mov [edi],cl ;Write the bytes out in planar ! 667: mov [edi+8],ch ;format. We have to store them ! 668: shr ecx,16 ;this way because this is how ! 669: mov [edi+16],cl ;the blt compiler expects it. ! 670: mov [edi+24],ch ! 671: add edi,1 ;increment dest pointer ! 672: ! 673: dec ulHeight ;Check height ! 674: jnz convert4xlate ;do next line ! 675: jmp short convert4exit ;exit ! 676: ! 677: do_convert4toplanar: ! 678: mov edx,8 ! 679: ! 680: convert4toplanar: ! 681: mov ebx,[esi] ;Get 8 4bpp pixels ! 682: and ebx,0f0f0f0fh ;Mask off the high nibbles ! 683: shl ebx,2 ;multiply by four each nibble ! 684: ; by four (size of dword) ! 685: mov al,bl ;move into eax to use an index ! 686: mov ecx,PackedToPlanar6[eax] ;build planar bytes ! 687: mov al,bh ;move into eax to use an index ! 688: shr ebx,16 ;get access to high word ! 689: or ecx,PackedToPlanar4[eax] ;build planar bytes ! 690: mov al,bh ;move into eax to use an index ! 691: and ebx,03ch ;mask off unneeded bits ! 692: or ecx,PackedToPlanar2[ebx] ;build planar bytes ! 693: or ecx,PackedToPlanar0[eax] ;build planar bytes ! 694: ! 695: mov ebx,[esi] ;Get same dword again so we ! 696: add esi,cbScan ; can do the high nibbles ! 697: ! 698: and ebx,0f0f0f0f0h ;Mask off the low nibbles ! 699: shr ebx,2 ;shift into low nible and ! 700: ;multiply by four ((>> 4) << 2) ! 701: ! 702: mov al,bl ;move into eax to use an index ! 703: or ecx,PackedToPlanar7[eax] ;build planar bytes ! 704: mov al,bh ;move into eax to use an index ! 705: shr ebx,16 ;get access to high word ! 706: or ecx,PackedToPlanar5[eax] ;build planar bytes ! 707: mov al,bh ;move into eax to use an index ! 708: and ebx,03ch ;mask off unneeded bits ! 709: or ecx,PackedToPlanar3[ebx] ;build planar bytes ! 710: or ecx,PackedToPlanar1[eax] ;build planar bytes ! 711: ! 712: mov [edi],cl ;Write the bytes out in planar ! 713: mov [edi+8],ch ;format. We have to store them ! 714: shr ecx,16 ;this way because this is how ! 715: mov [edi+16],cl ;the blt compiler expects it. ! 716: mov [edi+24],ch ! 717: add edi,1 ;increment dest pointer ! 718: ! 719: dec edx ;check scan count ! 720: jnz convert4toplanar ; ! 721: ! 722: convert4exit: ! 723: cRet vConvert4BpptoPlanar ! 724: endProc vConvert4BppToPlanar ! 725: ! 726: ;============================================================================== ! 727: ; vConvert8BppToPlanar ! 728: ; ! 729: ; ! 730: ;============================================================================== ! 731: ! 732: cProc vConvert8BppToPlanar,16,< \ ! 733: uses esi edi ebx, \ ! 734: pDest: ptr dword, \ ! 735: pSrc: ptr dword, \ ! 736: cbScan: dword, \ ! 737: pulXlate: ptr dword > ! 738: ! 739: local ulHeight : dword ! 740: ! 741: xor eax,eax ! 742: mov esi,pSrc ! 743: mov edi,pDest ! 744: ! 745: mov edx,pulXlate ! 746: or edx,edx ! 747: jz do_convert8toplanar ! 748: ! 749: mov ulHeight,8 ! 750: convert8xlate: ! 751: xor ecx,ecx ! 752: mov ebx,[esi] ;Get 4 8bpp pixels ! 753: mov al,bl ;move into eax to use an index ! 754: mov eax,[edx][eax*4] ;xlate color ! 755: or ecx,PackedToPlanar7[eax*4] ;build planar bytes ! 756: mov al,bh ;move into eax to use an index ! 757: shr ebx,16 ;get access to high word ! 758: mov eax,[edx][eax*4] ;xlate color ! 759: or ecx,PackedToPlanar6[eax*4] ;build planar bytes ! 760: mov al,bl ;move into eax to use an index ! 761: mov eax,[edx][eax*4] ;xlate color ! 762: or ecx,PackedToPlanar5[eax*4] ;build planar bytes ! 763: mov al,bh ;move into eax to use an index ! 764: mov eax,[edx][eax*4] ;xlate color ! 765: or ecx,PackedToPlanar4[eax*4] ;build planar bytes ! 766: ! 767: mov ebx,[esi+4] ;Get same dword again so we ! 768: add esi,cbScan ; can do the high nibbles ! 769: ! 770: mov al,bl ;move into eax to use an index ! 771: mov eax,[edx][eax*4] ;xlate color ! 772: or ecx,PackedToPlanar3[eax*4] ;build planar bytes ! 773: mov al,bh ;move into eax to use an index ! 774: shr ebx,16 ;get access to high word ! 775: mov eax,[edx][eax*4] ;xlate color ! 776: or ecx,PackedToPlanar2[eax*4] ;build planar bytes ! 777: mov al,bl ;move into eax to use an index ! 778: mov eax,[edx][eax*4] ;xlate color ! 779: or ecx,PackedToPlanar1[eax*4] ;build planar bytes ! 780: mov al,bh ;move into eax to use an index ! 781: mov eax,[edx][eax*4] ;xlate color ! 782: or ecx,PackedToPlanar0[eax*4] ;build planar bytes ! 783: ! 784: mov [edi],cl ;Write the bytes out in planar ! 785: mov [edi+8],ch ;format. We have to store them ! 786: shr ecx,16 ;this way because this is how ! 787: mov [edi+16],cl ;the blt compiler expects it. ! 788: mov [edi+24],ch ! 789: add edi,1 ;increment dest pointer ! 790: ! 791: dec ulHeight ;Check height ! 792: jnz convert8xlate ;do next line ! 793: jmp short convert8exit ;exit ! 794: ! 795: do_convert8toplanar: ! 796: mov edx,8 ! 797: ! 798: convert8toplanar: ! 799: xor ecx,ecx ! 800: mov ebx,[esi] ;Get 8 4bpp pixels ! 801: mov al,bl ;move into eax to use an index ! 802: or ecx,PackedToPlanar7[eax*4] ;build planar bytes ! 803: mov al,bh ;move into eax to use an index ! 804: shr ebx,16 ;get access to high word ! 805: or ecx,PackedToPlanar6[eax*4] ;build planar bytes ! 806: mov al,bl ;move into eax to use an index ! 807: or ecx,PackedToPlanar5[eax*4] ;build planar bytes ! 808: mov al,bh ;move into eax to use an index ! 809: or ecx,PackedToPlanar4[ebx*4] ;build planar bytes ! 810: ! 811: mov ebx,[esi+4] ;Get same dword again so we ! 812: add esi,cbScan ; can do the high nibbles ! 813: ! 814: mov al,bl ;move into eax to use an index ! 815: or ecx,PackedToPlanar3[eax*4] ;build planar bytes ! 816: mov al,bh ;move into eax to use an index ! 817: shr ebx,16 ;get access to high word ! 818: or ecx,PackedToPlanar2[eax*4] ;build planar bytes ! 819: mov al,bl ;move into eax to use an index ! 820: or ecx,PackedToPlanar1[eax*4] ;build planar bytes ! 821: mov al,bh ;move into eax to use an index ! 822: or ecx,PackedToPlanar0[ebx*4] ;build planar bytes ! 823: ! 824: mov [edi],cl ;Write the bytes out in planar ! 825: mov [edi+8],ch ;format. We have to store them ! 826: shr ecx,16 ;this way because this is how ! 827: mov [edi+16],cl ;the blt compiler expects it. ! 828: mov [edi+24],ch ! 829: add edi,1 ;increment dest pointer ! 830: ! 831: dec edx ;check scan count ! 832: jnz convert8toplanar ; ! 833: ! 834: convert8exit: ! 835: cRet vConvert8BpptoPlanar ! 836: endProc vConvert8BppToPlanar ! 837: ! 838: ;============================================================================== ! 839: ; vCreatePlaneMasks ! 840: ; ! 841: ; ! 842: ;============================================================================== ! 843: ! 844: cProc vCreatePlaneMasks,8,< \ ! 845: uses esi edi ebx, \ ! 846: pDest: ptr dword, \ ! 847: pSrc: ptr dword > ! 848: ! 849: mov esi,pSrc ! 850: mov edi,pDest ! 851: ! 852: mov ebx,8 ; do eight lines ! 853: ! 854: ;------------------------------------------------ ! 855: ; al = source byte for compare ! 856: ; ah = plane 0 mask ! 857: ; cl = plane 1 mask ! 858: ; ch = plane 2 mask ! 859: ; dl = plane 3 mask ! 860: ; ! 861: ; ebx = scan count ! 862: ; esi = pattern ! 863: ; edi = plane masks ! 864: ;------------------------------------------------ ! 865: new_scan: ! 866: mov ah,MM_C0 ;initialize plane masks ! 867: mov cx,MM_C1 + (MM_C2 SHL 8) ! 868: mov dl,MM_C3 ! 869: ! 870: mov al,[esi] ;load plane 0 ! 871: cmp al,[esi+8] ;compare planes 0 and 1 ! 872: jne plane0_ne_plane1 ! 873: or ah,cl ! 874: xor cl,cl ! 875: ! 876: plane0_ne_plane1: ! 877: cmp al,[esi+16] ;compare planes 0 and 2 ! 878: jne plane0_ne_plane2 ! 879: or ah,ch ! 880: xor ch,ch ! 881: ! 882: plane0_ne_plane2: ! 883: cmp al,[esi+24] ;compare planes 0 and 3 ! 884: jne plane0_ne_plane3 ! 885: or ah,dl ! 886: xor dl,dl ! 887: ! 888: plane0_ne_plane3: ! 889: or cl,cl ;did this plane match plane 0 ! 890: jz compare_plane_2 ;if so, skip it ! 891: mov al,[esi+8] ;load plane 1 ! 892: cmp al,[esi+16] ;compare planes 1 and 2 ! 893: jne plane1_ne_plane2 ! 894: or cl,ch ! 895: xor ch,ch ! 896: ! 897: plane1_ne_plane2: ! 898: cmp al,[esi+24] ;compare planes 1 and 3 ! 899: jne compare_plane_2 ! 900: or cl,dl ! 901: xor dl,dl ! 902: jmp short done_with_scan ! 903: ! 904: compare_plane_2: ! 905: or ch,ch ! 906: jz done_with_scan ! 907: mov al,[esi+16] ;load plane 2 ! 908: cmp al,[esi+24] ;compare planes 2 and 3 ! 909: or ch,dl ! 910: xor dl,dl ! 911: ! 912: ! 913: done_with_scan: ;save results ! 914: mov [edi],ah ;save plane 0 mask ! 915: mov [edi+8],cl ;save plane 1 mask ! 916: mov [edi+16],ch ;save plane 2 mask ! 917: mov [edi+24],dl ;save plane 3 mask ! 918: ! 919: inc edi ! 920: inc esi ! 921: dec ebx ! 922: jnz new_scan ! 923: ! 924: cRet vCreatePlaneMasks ! 925: endProc vCreatePlaneMasks ! 926: ! 927: _TEXT$01 ends ! 928: ! 929: end ! 930: ! 931:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.