|
|
1.1 root 1: ;---------------------------Module-Header------------------------------;
2: ; Module Name: rect.asm
3: ;
4: ; Rectangle Utilities
5: ;
6: ; Copyright (c) 1992 Microsoft Corporation
7: ;-----------------------------------------------------------------------;
8: .386
9:
10: ifndef DOS_PLATFORM
11: .model small,c
12: else
13: ifdef STD_CALL
14: .model small,c
15: else
16: .model small,pascal
17: endif; STD_CALL
18: endif; DOS_PLATFORM
19:
20: assume cs:FLAT,ds:FLAT,es:FLAT,ss:FLAT
21: assume fs:nothing,gs:nothing
22:
23: .xlist
24: include stdcall.inc ;calling convention cmacros
25: include i386\strucs.inc
26: .list
27:
28: .code
29:
30: _TEXT$01 SEGMENT DWORD USE32 PUBLIC 'CODE'
31: ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
32:
33: ;---------------------------Public-Routine------------------------------;
34: ; bIdenticalRect ( pRect1, pRect2 )
35: ;
36: ; Compare two rectangles whether they are identical
37: ;
38: ;-----------------------------------------------------------------------;
39:
40: cProc bIdenticalRect,8,< \
41: uses esi edi, \
42: pRect1: ptr RECTL, \
43: pRect2: ptr RECTL >
44:
45: cld
46: xor eax,eax
47: mov ecx,(size RECTL/4)
48: mov esi,pRect1
49: mov edi,pRect2
50: repe cmpsd
51: setz al
52:
53: bir_exit:
54: cRet bIdenticalRect
55:
56: endProc bIdenticalRect
57:
58: ;---------------------------Public-Routine------------------------------;
59: ; flClipRect ( pDst, pRect1, pRect2 )
60: ;
61: ; Clip the first rectangle with the second one, and put the result
62: ; rectangle in the destination one.
63: ;
64: ; Return:
65: ; 0 if Rect1 is not clipped by Rect2
66: ; 1 if Rect1 is horizontally clipped only
67: ; 2 if Rect1 is vertically clipped only
68: ; 3 if Rect1 is both horizontally and vertically clipped.
69: ;
70: ;-----------------------------------------------------------------------;
71:
72: cProc flClipRect,12,< \
73: uses ebx esi edi, \
74: pDstRect: ptr RECTL, \
75: pRect1: ptr RECTL, \
76: pRect2: ptr RECTL >
77:
78:
79: cld
80: mov edi,pDstRect
81: mov esi,pRect1
82: mov ebx,pRect2
83: push ebp
84: xor ebp,ebp ; assume no clipping required
85:
86: bisr_left:
87: lodsd ; left of rect1
88: mov edx,[ebx].xLeft ; left of rect2
89: cmp eax,edx ; clipped if left of rect1 < left of rect2
90: jge short @F
91: mov eax,edx ; clipped left
92: or ebp,1 ; indicate horizontally clipped
93: @@:
94: stosd
95:
96: bisr_Top:
97: lodsd ; top of rect1
98: mov edx,[ebx].yTop ; top of rect2
99: cmp eax,edx ; clipped if top of rect1 < top of rect2
100: jge short @F
101: mov eax,edx ; clipped top
102: or ebp,2 ; indicate vertically clipped
103: @@:
104: stosd
105:
106: bisr_Right:
107: lodsd ; right of rect1
108: mov edx,[ebx].xRight ; right of rect2
109: cmp edx,eax ; clipped if right of rect1 > right of rect2
110: jge short @F
111: mov eax,edx ; clipped top
112: or ebp,1 ; indicate horizontally clipped
113: @@:
114: stosd
115:
116: bisr_Bottom:
117: lodsd ; bottom of rect1
118: mov edx,[ebx].yBottom ; bottom of rect2
119: cmp edx,eax ; clipped if bottom of rect1 > bottom of rect2
120: jge short @F
121: mov eax,edx ; clipped bottom
122: or ebp,2 ; indicate vertically clipped
123: @@:
124: stosd
125:
126: bisr_exit:
127: mov eax,ebp ; return value
128: pop ebp
129: cRet flClipRect
130:
131: endProc flClipRect
132:
133: _TEXT$01 ends
134:
135: end
136:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.