|
|
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.